理论教育 Java程序设计:对象内存模型探索

Java程序设计:对象内存模型探索

时间:2023-10-18 理论教育 版权反馈
【摘要】:图4.2未指向实体的对象2.创建对象时的内存模型当用new关键字创建一个对象后,会在堆内存中为对象的各成员变量分配内存,并获得一个引用值,通常我们会把这个引用值赋值给类对象,如图4.3中把引用值赋值给类对象car,类对象一旦获得了一个实体对象的引用,则可以通过对象去引用对象实体的成员变量及成员方法。

Java程序设计:对象内存模型探索

1.声明对象时的内存模型

当用Car类声明一个类变量car时,如有:

Car car;

此时会在栈区为car分配内存,而当前car所分配的内存中没有任何数据,为一个空对象(见图4.2),空对象不能当作实体对象引用成员变量及成员方法,如调用car.run()会报错。

图4.2 未指向实体的对象

2.创建对象时的内存模型

当用new关键字创建一个对象后,会在堆内存中为对象的各成员变量分配内存,并获得一个引用值,通常我们会把这个引用值赋值给类对象,如图4.3中把引用值赋值给类对象car,类对象一旦获得了一个实体对象的引用,则可以通过对象去引用对象实体的成员变量及成员方法。如:

图4.3 对象内存分配图

在创建对象时若未对对象的成员变量初始化,对象的成员变量会用默认值。整型成员变量的默认初值是0,浮点型成员变量的默认值是0.0,boolean型成员变量的默认值是false,类变量默认值是null,如图4.3所示。

3.创建多个不同对象时的内存模型

一个类使用new关键字可以创建多个不同的对象,这些对象将会分配不同的内存空间,各对象中的成员变量内存空间相互独立,因此各对象各自拥有独立的值,互不影响,如图4.4所示。

(www.daowen.com)

图4.4 对象内存分配图

在Java中允许同一个类的两个对象之间进行赋值操作,如:

car2=car1;

将car1赋值给car2后,car2和car1引用相同的实体对象,无论通过car1还是car2对实体对象的操作都是对同一个实体对象进行操作。内存分配情况如图4.5所示。

图4.5 具有相同引用值对象内存分配图

在图4.5中,car2指向了car1指向的实体对象后,car2之前指向的对象实体没有任何对象指向它,则此段内存无法再被引用,因此这段内存将会被当作“垃圾内存”进行回收,这即是Java的垃圾回收机制。Java的“垃圾回收机制”是指Java虚拟机周期性检测某个实体是否不再被任何对象所引用,如果发现这样的实体,就释放实体所占有的内存。

图4.6 对象的引用和实体运行结果图

在下面的例子中对象car1的引用值赋给对象car2后,两对象的引用值相等,指向同一个实体对象,输出的汽车信息为相同。运行效果如图4.6所示。

【例4.2】

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈