面向对象-对象的内存图
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.测试代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/** * * @author 尹正杰 * */ public class Car { //用于保存车身颜色数据 String color; //用于保存轮胎数的数据 int tyreNumber; //給汽车类(Car)创建一个跑(run)的方法 public void run() { System.out.println("车身颜色: " + color + ", 轮胎数量: " + tyreNumber ); } }
/** * * @author 尹正杰 * */ public class CarDemo { public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); c1.color = "红色"; c1.tyreNumber = 5; c1.run(); c2.color = "蓝色"; c2.tyreNumber = 4; c2.run(); System.out.println(c1); System.out.println(c2); } }
二.分析代码在JVM内存中的存储方式
如下图所示,我们这里暂时不分析JVM类的加载过程以及方法区等功能,主要分析堆内存和栈内存的关系。
当JVM执行"new Car()"时会调用"Car"这个类的构造方法(如果该类没有定义构造方法就去找它的父类),在堆内存中创建一个对象,最终将堆内存中该对象的内存地址返回给栈内存的变量进行保存。调用构造方法其实就是为类中的成员变量进行初始化赋值,比如字符串(String)的默认值是"null",整数(int)的默认值是0。
之后调用c1.color = "红色",其实就是将c1指向的堆内存对象中的成员变量中的"color"由默认值"null"替换成"红色",同理,调用c1.tyreNumber = 5,其实就是将tyreNumber的默认值由0替换成5。
综上所述,c2对象的调用方式也一样。