![Java王者归来:从入门迈向高手](https://wfqqreader-1252317822.image.myqcloud.com/cover/394/27563394/b_27563394.jpg)
8-5 类的参照数据类型
8-5-1 类的参照内存图示
在7-3-2节介绍了对象(object)是一个参照数据类型,假设有一个对象声明如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P125_759104.jpg?sign=1739531876-FVn9uEHQMHRj44itw87ES6luw6ENtsZ0-0-86306d4e495205c0da1a3e6e5f6cdfcc)
当执行下列语句建立对象:
Dog myDog=new Dog();
Java会动态地配置内存空间,整个myDog对象的内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P125_562255.jpg?sign=1739531876-kBb7WNY1t6fx2dWsz3lmg0H9lc48Zm1e-0-1ad5659df88cd73645c569d5f9fe0d63)
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:验证类别属性的初值。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P125_562259.jpg?sign=1739531876-7SGCJot3DEYH49jxUAGdm1gDY5p2Yll4-0-9b1edb25960ec5e893d6c9ed1541c35f)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P125_562282.jpg?sign=1739531876-n36kclN1lwsVZRz0eEPgFlNzOk8DR7Uw-0-304c588dfb898253406fab120a277bb3)
其实读者可以扩充上述程序,以便了解与验证其他数据类型的初值。
8-5-3 细读类参照的内存图示
这一节主要是用详细的内存图示讲解类参照的更深一层内涵。
程序实例ch8_6.java:类参照的内存图示与概念完整解说。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P126_562693.jpg?sign=1739531876-nzhs8UBNScNHq2gf0JWa8qFRQSW2f5Jg-0-52d6b27d1b7330495179d7953a19b50a)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P126_562699.jpg?sign=1739531876-TtAI3zrPqwhT0dEUqBUN5Cvp76hdTiTq-0-b59631dc8639faac6fcc0da480ddbc3c)
这个程序有不一样的地方是,在类内设置了属性的初值,在建立对象后name属性值就是Lily。程序第10~13行执行完成后,其实三个对象分别是指向不同的内存,内存图示如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P126_562702.jpg?sign=1739531876-xdp65rKB02nDisxhct4SMVIhG4vHSvXc-0-1bf03e06a0598ddb4a1b3cf750c0cd09)
虽然“对象.name”都是Lily,但是因为指向不同内存,所以第14~16行列出的结果都是false。第18行将bDog指向cDog,这时内存图示如下。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P127_563112.jpg?sign=1739531876-GXZuFUMt807FTM2vthon2xJMy21WBnXK-0-33eb4d7194ba39ad6db00a83c20cec7d)
所以第19行的结果是True。第21行更改了bDog.name的值,这时的内存图示将如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P127_563115.jpg?sign=1739531876-qKndgv9oOitx8GNd6OvUIcJzfBMWoul3-0-07ef959ee3f8d152e25069e7a2d86205)
所以虽然没有更改cDog.name的内容,但是因为它和bDog.name指向相同地址,所以最后第23~25行可以分别得到“Lily”“Hali”“Hali”的执行结果。