1.代码如下:
//测试代码
public class Mytest {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.name="朵唯";
p1.price=200;
Phone p2 = new Phone();
p2.price=500;
Phone p3=p1;
p3.name="中兴";
p3.price=1300;
System.out.println(p1.name);
System.out.println(p1.price);
System.out.println(p2.name);
System.out.println(p2.price);
System.out.println(p3.name);
System.out.println(p3.price);
}
}
//Phone.class
public class Phone {
String name="华为";
double price;
}
2.实现以上代码的内存图如下:
结合内存图,代码的运行结果如下:
中兴
1300.0
华为
500.0
中兴
1300.0
3.程序执行过程分析
程序中的jvm会从上到下,从左到右的遍历代码
1.运行class的文件,使用类加载器将MyTest.class加载到方法区,main方法入栈
2.在栈内存运行main方法,当jvm看到Phone类,会自动把Phone类加载到方法区;看到在main中创建一个对象Phone p1 = new Phone()
,会给局部变量p1在栈中分配一段空间,而new Phone()会使得在堆中开辟一段空间,并将堆中的对应地址0x001赋值给p1,让p1指向堆中的内存0x001.然后改变name和age的值。
3.创建第二个对象Phone p2= new Phone()
,同样也是实现让p2指向堆中新建的一段内存0x002.然后改变name和age的值。
4,创建第三个对象Phone p3=p1
,是通过将p1赋值给p3,这样便让p3指向p1所指向的堆空间,然后改变name和age的值。
5.main方法结束后便出栈。