这里有一个类已经声明好,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一样了。两者都指向宾利这一个地址。