创建对象内存分析
以下是个人见解,有不对的地方希望提出,我会及时修改。
代码
/**
* 创建对象内存分析
*/
public class Person {
String name;//名字
static String country;//城市
public void work() {
System.out.println(name);
System.out.println(country);
}
}
测试类
/**
* 创建对象内存分析
*/
public class Test {
public static void main(String[] args) {
Person person1 = new Person();
person1.name = "凌晨";
Person.country = "洛阳";
person1.work();
Person person2 = new Person();
person2.name = "凌晨三点";
Person.country = "河南";
person2.work();
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
System.out.println("-----------------------");
System.out.println(person1.getClass().hashCode());
System.out.println(person1.getClass().hashCode());
}
}
内存创建分析:
- JVM去方法区寻找Test类的代码信息,如果有直接调用,没有的话使用类的加载机制把类加载进来。同时把静态变量、静态方法、常量加载进来。
- main方法入栈
- 碰见Person对象,先分析Person这个类,同样的寻找Person类的代码信息,有就加载,没有的话类加载机制加载进来。同时也加载静态变量、静态方法、常量
- Person中分为静态区和非静态区 这时初始化 静态变量country的初值为null
- 创建对象(堆区开辟空间)
- 把对象地址赋值给person1变量 保存
- 通过类名 修改类变量的值
- work()方法入栈,打印
- 第二次new的时候,已经有Person这个类的模板了,直接加载
- 重复5678
- work()方法出栈
- main()方法出栈
内存图:
运行代码输出:
可以看出
- person1和person2是不同的对象
链图片转存中…(img-AAtuI7l8-1651406290926)]
可以看出
- person1和person2是不同的对象
- person1和person2是同一个class模板