1个对象的内存图
图中包含栈内存、堆内存和方法区
方法区中包含class文件内容,分成两块,一块是PhoneDemo.class另一块是Phone.class
其中Phone.class中包含成员变量和成员方法
PhoneDemo.class中包含一个main方法
1.加载main方法到栈内存中
2.Phone p = new Phone();
在栈内存中创建一个Phone类型的引用对象 p ;
在堆内存中创建一个Phone对象,同时在堆内存中创建Phone对象的成员变量:brand(默认null),price(默认0),color(默认null)
让引用对象p指向Phone对象(引用对象p持有了堆内存中Phone对象的一个地址值)
注:方法区中,Phone.class的方法在堆内存中Phone对象中也持有这些方法的引用,以便于在执行Phone对象的方法的时候快速定位并执行
3.System.out.println(p.brand+” “+p.price+” “+p.color);
打印对象的初始化值:null 0 null
4.p.brand=”三星”
p.price=3999
p.color=”白色”
给堆内存中Phone对象进行赋值,赋值之后该对象的成员变量变成了:brand:”三星”,price:3999,color:”白色”
5.System.out.println(p.brand+” “+p.price+” “+p.color);
打印:”三星” 3999 “白色”
6.p.call(“乔布斯”)
首先在方法区中找到call方法,然后加载到栈内存中,执行call()方法,执行完毕之后,从栈内存空间中消失
p.sendMessage()、p.playGame() 方法同上,也是先加载到栈内存,执行完毕之后从栈内存中消失
2个对象的内存图
这里牵涉到方法的共用
在堆内存中new出的两个对象在调用方法的时候,因为方法的内容是不变的,所以两个对象调用的方法也是相同的,由堆内存指向方法区的方法引用来间接调用Phone类的方法
3个对象的内存图
其中有两个引用指向同一个对象
就是p3所引用的对象和p1引用的对象在堆内存中是同一个对象
通过p3改变成员变量的值,也就等同于使用p1改变了这个对象成员变量的值