Python 官方文档:入门教程 => 点击学习
目录一、new 对象的几种说法二、Java 对象在内存中的存在形式1. 栈帧(Frame)2. 对象在内存中的存在形式 ①3. 对象中的方法存储在那儿?4. Java 对象在内存中的
初学 Java 面向对象的时候,实例化对象的说法有很多种,我老是被这些说法给弄晕。
public class Test {
public static void main(String[] args) {
// 创建一个 ProgramLanguage 对象, 对象名是 java
ProgramLanguage java = new ProgramLanguage();
// 实例化一个 ProgramLanguage 对象, 对象名是 c
ProgramLanguage c = new ProgramLanguage();
// 把 ProgramLanguage 类实例化, 实例化后的对象的对象名是 python
ProgramLanguage Python = new ProgramLanguage();
}
}
class ProgramLanguage {
private Integer id;
private String name;
}
下面的三种说法的操作都是实例化对象,只是说法不一样而已
这里先简单看一看 Java 对象在内存中的存在形式和几个内存相关的概念,后面还会详细介绍的。先看下面的几个知识点:
new
关键字创建出来的(new 关键字:实例化一个对象;向堆空间申请一段内存,用于存放刚刚实例化的对象)分析下面的代码的内存布局:
public class DogDemo {
public static void main(String[] args) {
Dog doggy = new Dog();
doggy.age = 6;
doggy.weight = 3.14;
}
}
new
关键字实例化了 Dog 对象,Dog 对象存储在堆空间分析下面的代码的内存布局(稍微复杂)
public class Dog {
public int price;
}
public class Person {
public int age;
public Dog dog;
}
public class Test {
public static void main(String[] args) {
Dog doggy = new Dog();
doggy.price = 255;
Person yeTing = new Person();
yeTing.age = 20;
yeTing.dog = doggy;
}
}
new
关键字实例化了 Dog 对象,Dog 对象存储在堆空间。堆空间中有一段内存用于存储 Dog 对象的属性信息(如 price = 255)new
关键字实例化了 Person 对象,Person 对象存储在堆空间。堆空间中有一段内存用于存储 Person 对象的属性信息(如 age = 20),堆空间中,Person 对象的属性 dog 是 Dog 对象的引用,所以它指向的是堆空间中的 Dog 对象(dog 指向的是栈空间中的 doggy 引用的堆空间的 Dog 对象。doggy 和 yeTing 指向的 Person 对象中的 dog 属性指向的是同一个对象)看下面的代码,思考对象中的方法存储在那儿?
public class Dog {
public int price;
public void run() {
System.out.println(price + "_" + "run()");
}
public void eat() {
System.out.println(price + "_" + "eat()");
}
}
public class Test {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.price = 255;
dog1.run();
dog1.eat();
Dog dog2 = new Dog();
dog2.price = 552;
dog2.run();
dog2.eat();
}
}
Java 虚拟机执行 Java 程序时会把内存划分为若干个不同的数据区域,主要包括:
String:
分析下面代码的内存布局:
public class Dog {
String name;
int age;
String color;
}
public class DogDemo {
public static void main(String[] args) {
Dog doggy = new Dog();
doggy.name = "笑天";
doggy.age = 6;
doggy.color = "黑";
}
}
下面详细说明一下类中【属性】这个概念。其实上篇文章已经能够很好理解,这里只是再补充一下而已。
习惯上把现实世界的对象的状态(State)和编程中的属性联系在一起,便于理解
public class Dog {
public String name;
protected int age;
String color;
private double weight;
}
如果不给对象的属性赋值,属性会有初始值
public class FiledInitialValueTest {
private int score;
private short age;
private byte month;
private long salary;
private float height;
private double pi;
private char firstName;
private boolean isTrueLove;
private Person person;
public static void main(String[] args) {
FiledInitialValueTest test = new FiledInitialValueTest();
System.out.println("\n若不给对象的属性赋值, 初始值如下所示:");
System.out.println("score【int】 = " + test.score);
System.out.println("age【short】 = " + test.age);
System.out.println("month【byte】 = " + test.month);
System.out.println("salary【long】 = " + test.salary);
System.out.println("height【float】 = " + test.height);
System.out.println("pi【double】 = " + test.pi);
// 字符类型的属性的初始值是空串(在控制台无法看到)
System.out.println("firstName【char】 = " + test.firstName);
// 字符类型的属性的初始值强制类型转换为 int 后是【0】
System.out.println("firstName【(int)char】 = " + (int) test.firstName);
System.out.println("isTrueLove【boolean】 = " + test.isTrueLove);
System.out.println("person【person】 = " + test.person);
}
}
必须先有类(模板)才能创建对象
通过【new】关键字创建类的对象。【new】:向堆空间申请一块内存存储对象数据
public class TestCreateObject {
public static void main(String[] args) {
// (1) 先声明再创建
Dog dog; // 声明
dog = new Dog(); // 通过 new 关键字创建对象
// (2) 声明并创建对象
Dog doggy = new Dog();
}
}
可通过【.】号访问属性或调用方法
可把 . 看做【的】、【の】
看代码,画图:
public class Person {
private int age;
private String name;
public static void main(String[] args) {
Person yangJiaLi = new Person();
yangJiaLi.age = 17;
yangJiaLi.name = "杨嘉立";
// 下面的一行代码有2种说法:
// 1. 把 yangJiaLi 赋值给 yjl
// 2. yjl 指向 yangJiaLi
Person yjl = yangJiaLi;
System.out.println(yjl.age); // 17
}
}
本篇文章的重点是第二节【Java 对象在内存中的存在形式】
需重点知道:
到此这篇关于Java 对象在 JVM 中的内存布局超详细解说的文章就介绍到这了,更多相关Java JVM 内存布局内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Java 对象在 JVM 中的内存布局超详细解说
本文链接: https://www.lsjlt.com/news/166880.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0