
8-5 类的参照数据类型
8-5-1 类的参照内存图示
在7-3-2节介绍了对象(object)是一个参照数据类型,假设有一个对象声明如下。

当执行下列语句建立对象:
Dog myDog=new Dog();
Java会动态地配置内存空间,整个myDog对象的内存图示如下。

8-5-2 类对象属性的初值
读者可能会觉得奇怪,为何在8-5-2节的类内存图示中,笔者在声明myDog对象完成后,没有设置myDog对象属性值,却在内存内写出myDog对象属性的初值,这不符合前几章所述的基本数据类型概念。其实Java当使用new建立对象后,每个类对象的属性变量都具有Java自动设置初值的功能,一般整数变量的初值是0,浮点变量的初值是0.0,布尔值的初值是false,其他类型数据的初值是null。所以,name和color是字符串类型其初值是null,age是整数类型其初值是0。
程序实例ch8_5.java:验证类别属性的初值。

执行结果

其实读者可以扩充上述程序,以便了解与验证其他数据类型的初值。
8-5-3 细读类参照的内存图示
这一节主要是用详细的内存图示讲解类参照的更深一层内涵。
程序实例ch8_6.java:类参照的内存图示与概念完整解说。

执行结果

这个程序有不一样的地方是,在类内设置了属性的初值,在建立对象后name属性值就是Lily。程序第10~13行执行完成后,其实三个对象分别是指向不同的内存,内存图示如下所示。

虽然“对象.name”都是Lily,但是因为指向不同内存,所以第14~16行列出的结果都是false。第18行将bDog指向cDog,这时内存图示如下。

所以第19行的结果是True。第21行更改了bDog.name的值,这时的内存图示将如下所示。

所以虽然没有更改cDog.name的内容,但是因为它和bDog.name指向相同地址,所以最后第23~25行可以分别得到“Lily”“Hali”“Hali”的执行结果。