java引用类型st_Java基本数据类型和引用类型

d33c86438531596dd29560335fc6c565.png

Java中一共有四类八种基本数据类型,看下表:

java引用类型st_Java基本数据类型和引用类型_第1张图片

除掉这四类八种基本类型,其它的都是对象,也就是引用类型,包括数组。

来看一段示例代码:

一个Person类,提供了一个构造方法,一些get/set方法:

java引用类型st_Java基本数据类型和引用类型_第2张图片

下面是测试的main方法:

java引用类型st_Java基本数据类型和引用类型_第3张图片

先看第一句代码:

776f4748b03e7ae8a3d448ede494f955.png

方法体里声明的基本数据类型在栈内存里,我们画一下

java引用类型st_Java基本数据类型和引用类型_第4张图片

继续执行以下代码

d723720fdcca779f59fb0795018c4ad3.png

对于基本数据类型来说,赋值(=号)就相当于拷贝了一份值,把int1的值100,拷贝给int2,继续画图

java引用类型st_Java基本数据类型和引用类型_第5张图片

int1=500,直接修改int1的值为500,表现如下图

java引用类型st_Java基本数据类型和引用类型_第6张图片

分别打印int1,int2的值,相信没有人会答错,分别是500,100。

再来看数组的初始化

023eef7e54728a503fbaf8ebd575357c.png

先初始化arr1,当执行到new这个关键字,会在堆内存分配内存空间,并把该内存空间的地址赋值给arr1

java引用类型st_Java基本数据类型和引用类型_第7张图片

继续执行以下代码

34834306940d08037d12d8cac668298e.png

java引用类型st_Java基本数据类型和引用类型_第8张图片

这时候执行如下代码

4ff081778a3d80cb961b714d70b6686b.png

虽然只是修改arr1数组下标位置为3的值

java引用类型st_Java基本数据类型和引用类型_第9张图片

但由于数组arr1和数组arr2指向同一块堆内存,打印arr1[3]和arr2[3]的值,都是8。你答对了吗?

再来看对象的初始化

901308a656f5e2a0c721055cb5d4dcab.png

当看到这个new,这货肯定在堆内存里开辟了一块内存空间,Person里有一个叫name的String对象,String这个对象有点特殊,虽然没有new这个关键字,但还是在堆内存中开辟了一块空间,在 String是一个很普通的类 一文中已经讲解过了,这里就不再细讲了,String底层是数组实现的,数组也是引用类型,age为基本数据类型,表现如下图

java引用类型st_Java基本数据类型和引用类型_第10张图片

上图中大框里的内容就是整个Person对象在堆内存中的体现,继续执行以下代码

83c2daa9c41b6315f5aa22f1b59e6e7a.png

没有new关键字,per2不会在堆内存中新开辟空间,和数组一样,也是把per1的内存地址直接赋值给了per2

java引用类型st_Java基本数据类型和引用类型_第11张图片

当我们修改per1的属性的时候

c71c90005fd24c25e2ef1d3f7af13c94.png

如下图两个红框里的内容,给对象(数组也是对象)赋值其实就是相当于引用重新指向一块堆内存,基本数据类型是直接修改值,表现如下图

java引用类型st_Java基本数据类型和引用类型_第12张图片

所以,不管打印per1还是per2的name、age,打印出来的结果都是“李四”、35,这个你也答对了吗?最后,我们来验证一下,结果是不是和文中说的一致。

java引用类型st_Java基本数据类型和引用类型_第13张图片

结果完全一致,回过头来看看Java里的“==”比较符,结果就不难理解了,代码如下

c5b9c56f2dfe68e100da46314d9d514d.png

结果分别是false,true,true,当==两边是基本数据类型时,==于比较的是两边的两个值是否相等,当==两边是引用类型时比较的是两个内存地址,也可以看成是看这两个引用是否指向堆内存里的同一块地址,如下图

java引用类型st_Java基本数据类型和引用类型_第14张图片

新手在学习Java时,在引用类型上可能经常容易犯错误,如本文中所讲的arr1,arr2,很多人在写代码的时候是想拷贝一份值来用,却不知道在修改arr1的时候,arr2的值也变了。

本篇内容就讲解到这儿,画图不易,希望大家以后多想想变量在内存中的样子,学习起来可以事半功倍。四类八种基本数据类型,本文只列举了int类型,其它的7中基本类型和int的表现形式一致,这里就不一一举例了。

最后,说一下前面的文章留的文末思考,首先是 让人疑惑的Java代码 一文中的文末思考

79f8160bb7343f2ca2d9f6dbaba1850e.png

很简单是false

java引用类型st_Java基本数据类型和引用类型_第15张图片

两个对象都是新new出来的,开辟了两块内存空间,i7和i8的引用不是指向堆内存里的同一块地址,因此打印出来是false。

至于 Java中的数组 一文中的文末思考

java引用类型st_Java基本数据类型和引用类型_第16张图片

相信认真看过本文的朋友都知道打印出来是多少了,还不清楚的,建议重新阅读本文,直到弄明白为止。

注:char数组的打印有点特殊,int数组打印是打印出来一个地址,而char数组是打印数组里的内容。

65353df7cfea0c1dc206d219b6a8d20c.png

你点的每个“在看”,我都当成了喜欢

1cdd6e71d2682aa50a76551cbe32715a.png

你可能感兴趣的:(java引用类型st)