要知道对象的内存图,首先要知道ava 对内存空间的划分五部分;
栈、堆、方法区、本地方法区、寄存器。
1、栈内存:存储都是局部变量。只要是在方法中定义的变量都是局部变量。
一旦变量的生命周期结束该变量就被释放。
2、堆内存都是实体(对象)(new 关键词创建的)(成员变量)
每一个实体都有一个首地址值。
堆内存的变量都有默认的初始化值。不同类型不一样,
byte,short,int,:0 float, double:0.0 boolean:false char——’\u0000' string:null
3.方法区里存储的是类文件 即.class文件 与字符串常量池
分析:
1有两个类 TestDemo 与 Phone 放在方法区, 类TestDemo内有main方法,类Phone中有String brand, int price和void call(String name) ,void sendMessage()以及两个方法的位置0x222
2执行main方法 Phone p先在栈内存开辟空间存储对象p,new Phone()在堆内存开辟空间,同时 类Phone中的属性 String brand,int price以及call() sendMessage的位置:0x222,注意:堆内存的都为成员变量,所以它们都有初始化值即brand:null, price:0,
3.p.rand="华为",p.price="4999"分别将brand price重新赋值为华为,4999
5.p.call("古力娜扎") 通过栈内存中p对象0x111找到堆内存中的new Phone()0x111,然后再通过堆内存中0x222找到方法区中的call()方法,接着在栈内存开辟call()方法的空间
6.p.sendMessage()过程同 5。
7.入栈后的内存运行完毕后会进行出栈,释放内存。(出栈顺序:先进后出)