引用类型在内存中的情况

这里有一个类已经声明好,class Car{

  String name;

}

这里类只有一个name属性,下面来实例化对象,对其属性赋值,

Car car1=new Car();

car1.name="现代";

在内存中整个过程是怎么样的呢?首先我们的内存条分成三个区域,分别是 栈内存,堆内存,存储区。

类加载过程中,JVM首先在内存中开辟一块空间,JVM的一个小弟叫类加载器ClassLoader把放在硬盘上的的class文件加载到

存储区,当然,这里其实并非真的把硬盘上的class文件拷贝到内存,毕竟实际文件很大,计算机内存有限,完全放进去那多少内存也不够。

因此,这里只是在存储区的方法区(存储区有细分为三块,常量缓冲区,方法区(就是指类,方法是依托在类里面的嘛),静态元素区(static))建立了一个映射关系,

在方法区就有了一个跟硬盘一模一样的模板类Car。

Car car1=new Car();

Car car1这半句,在栈内存中声明了一个引用类型car1,如果要new Car(),则是通过在方法区的Car模板在堆内存中建立了一个内存空间,即new Car,

通过‘=’赋值给car1,这里的赋值是将在堆内存中new Car的内存地址给了car1.

car1.name="现代";这句话的含义是通过栈内存的car1地址找到堆内存的name,并给它赋值(注意,new的对象属性一开始都有初始默认值的)

如果再声明一个

Car car2=new Car();

car2.name="宾利";

那么跟之前的过程一模一样,在堆内存新开辟了一个car2的空间,两者互不影响。

假如Car car1只声明,不new呢

Car car1=car2;

那么打印出来的name应该是什么?

car1如果不new,则在堆内存中没有开辟空间,即不存在实例化对象。

将car2赋值给car1,则实际将car2的地址给了car1,那么如果car1.name的值也就变成跟car2.name一样了。两者都指向宾利这一个地址。

原文地址:https://www.cnblogs.com/hebiao/p/11576223.html