![Java王者归来:从入门迈向高手](https://wfqqreader-1252317822.image.myqcloud.com/cover/394/27563394/b_27563394.jpg)
7-3 Java参照数据类型
Java有关变量数据处理可以分成原始数据类型与参照数据类型。
7-3-1 原始数据类型
原始数据类型指的是byte、short、int、long、float、double、boolean、char等8种,这8种原始数据类型最大的特点是当我们定义变量同时设置变量值时,变量值内容是直接放在变量内,如下方左图所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_554211.jpg?sign=1738814098-O4ce8qNkm6IF3DdRbMRTt6Ovcx2tdebA-0-c16f1a0f80bc124438f67ed5374fe694)
例如,有一个声明如下:
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_758942.jpg?sign=1738814098-LV3JZuQ55CIoT3DqVBbvm8tqKpZwTiY2-0-d83d3871b5d30a1da51a3d44872535a7)
这时如上方右图所示,如果执行下列等号运算。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_758943.jpg?sign=1738814098-OBabjInCh4MDNIXcOmDabRg1jYJSSJfn-0-96f6defd0042652e7dbd41b58cfe16ca)
过程如下图所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_554217.jpg?sign=1738814098-4nX2tnbdg1AFTW6YLlarLViGLuJHXe7X-0-502e345f8030705588496ca7a5e7a10c)
如果执行下列运算。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_758945.jpg?sign=1738814098-5Mc48I2qUePvSwyxYVavrqbPjElzIhaA-0-334bbc18908d25f0023b865ba7e41b39)
过程如下图所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_554220.jpg?sign=1738814098-sg4E7tcHnqiXmHajHO7KoIsdJ8rRShSI-0-33fec989523819022ab62e9fb09b7fca)
程序实例ch7_16.java:使用程序设计验证上述执行结果。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_554223.jpg?sign=1738814098-kKSY5R8kmDa0uX2Ta1rK0OSHD483WSUL-0-859969eb1d9f6bc866aee7864de72edb)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_763304.jpg?sign=1738814098-OqmhmVAKN5GVR8H1exUq2zRZfJh8Gon3-0-86455dc47073f28ecafcc7692e922822)
7-3-2 参照数据类型
除了原始数据类型以外的数据类型都是参照数据类型,例如,目前已经学习的字符串(String)、数组(Array),后面还会介绍类对象,都算是参照数据类型。参照数据类型最大的特点是使用间接方式存取变量内容,本章的重点是数组,所以就用数组做说明。
例如,有一个整数数组声明如下。
int[ ] score={90, 79, 92};
声明完后的内存如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P107_554289.jpg?sign=1738814098-IxNQAO53HYmr48DwKEf8tTugpapRlF94-0-4437a6c97927813cfe9addd58de38357)
对于数组变量score而言,所存的内容并不是数组的元素内容,而是一个内存位置,此内存位置才是真正存放数组元素内容的起始地址,在该内存的连续空间才是真正存放元素内容。由于这个范例的数组是整数(32位),8位代表一个内存位置,所以内存位置以每次递增4的方式存放整数,如果数组内容是其他的原始数据类型,每次递增的数字将会不一样。
参照数据类型在执行指定表达式(=)时,并不是复制整个数据,而是复制所指内存地址。延续score数组,如果执行下列设置:
int[ ] myscore=score;
这时内存如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P108_554720.jpg?sign=1738814098-pbaAePCi2FyxRHERZhkLFd1EDQCKTn3d-0-dfa9e62f403a1c157e6747837d86fc76)
假设执行下列语句:
myscore[1]=100;
这时内存如下所示。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P108_554723.jpg?sign=1738814098-SppRf8yKfhpaF4t8N83QLj3EsB6P4eN4-0-c85f7b13e6f479ba9a8f29e5d0f86ae8)
如果这时输出score[1]或myscore[1]都可以获得100的结果,其实并没有更改score[1]的值,但是因为这个内存内容被更改了,所以也获得100的结果。这也是参照数据类型的一大特点,所以程序设计时一定要特别留意。
程序实例ch7_17.java:上述参照数据类型的验证。
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P108_554734.jpg?sign=1738814098-8mElq6Z2szwPUhlcoynZpkKUgWrnPLJc-0-f12723f306a51828a0c5c4e92fe4862d)
执行结果
![](https://epubservercos.yuewen.com/9E44AA/15825993204148006/epubprivate/OEBPS/Images/Figure-P108_554740.jpg?sign=1738814098-c6iISQaKiklYzC4Csf8qbXzzubyPBmLd-0-4cc5928d5d76d5025773e61f6bc5e91c)