面向对象-对象的内存图

         面向对象-对象的内存图

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

 

一.测试代码

/**
 * 
 * @author 尹正杰
 *
 */
public class Car {
    
    //用于保存车身颜色数据
    String color;
    
    //用于保存轮胎数的数据
    int tyreNumber;
    
    //給汽车类(Car)创建一个跑(run)的方法
    public void run() {
        System.out.println("车身颜色: " + color + ", 轮胎数量: " + tyreNumber );
    }
    
}
Car.java文件内容
/**
 * 
 * @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对象的调用方式也一样。

 

 

 

 

posted @ 2020-01-22 06:26  JasonYin2020  阅读(260)  评论(0编辑  收藏  举报