java中引用类型有哪些_Java基本数据类型和引用类型 - Java那些事儿

本文漏的图片已经补上,请放心阅读。

前面的文章有时候会留一些思考题,主要是想让大家多想想文章的内容,所以没留答案,评论区回复也是五花八门。写这篇文章是想再帮大家巩固一下之前的内容,子曾经说过:“温故而知新,可以上王者”。Java中一共有四类八种基本数据类型,看下表:

fb00dfa4823469a0791344dc3a5a7091.png

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

来看一段示例代码:

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

d9332ae43b2d51fc16b4792497567ce2.png

下面是测试的main方法:

9e1931ebe794958869dbe7a4f14dc169.png

先看第一句代码:

1238238e02cc0c94a6fd3e45f6864c44.png

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

0a50dcddadaf0eaa0f2f3f851d921490.png

继续执行以下代码

c719ddd213364318eeee3063a845a4a5.png

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

fbd1ef77c8b6474740c1518150bddcc8.png

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

0992255bcea25d82bb648540e6e33613.png

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

再来看数组的初始化

9a4bc02f3c63c1b1f172425db7ea7b7a.png

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

a8aaf1ff644765edd3c1e986445d47d3.png

继续执行以下代码

37a6f4f2abc90e1c0da49d381bbb3381.png

这儿arr2初始化时并没有new关键字,并不会在堆内存里新开辟一块空间,而是把arr1里存的堆内存地址直接赋值给了arr2,对于引用类型来说,赋值(=号)就相当于拷贝了一份内存地址,也就是说arr1,arr2现在指向了同一块堆内存,表现形势如下图

9890ab6e8954197a9c559118bf38ec2f.png

这时候执行如下代码

df3d05a9ad64b80d71fbea2d272da63f.png

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

3df61b98951d35ce1ac8f6cc92a3f1fa.png

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

再来看对象的初始化

7ae1c6181acdc0e0c982a743b73dbf62.png

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

74a013401fc9baed317ababf0e701435.png

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

4f7f3d816a045aa873132dc7c6584f56.png

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

ad4bbc96d2071b9dfc52d6ff921de737.png

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

29b3163799b3785551520df989d91640.png

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

9b8d41d6c7a93480d9b896d08d079195.png

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

2067dee121194c7cdbf18ce43c8d00f6.png

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

69c146b76b10e543bddcacc6cb018719.png

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

97c432a1c7146054d487be572f85e054.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值