本文漏的图片已经补上,请放心阅读。数组
前面的文章有时候会留一些思考题,主要是想让你们多想一想文章的内容,因此没留答案,评论区回复也是五花八门。写这篇文章是想再帮你们巩固一下以前的内容,子曾经说过:“温故而知新,能够上王者”。Java中一共有四类八种基本数据类型,看下表:post
除掉这四类八种基本类型,其它的都是对象,也就是引用类型,包括数组。学习
来看一段示例代码:测试
一个Person类,提供了一个构造方法,一些get/set方法:3d
下面是测试的main方法:cdn
先看第一句代码:对象
方法体里声明的基本数据类型在栈内存里,咱们画一下blog
继续执行如下代码图片
对于基本数据类型来讲,赋值(=号)就至关于拷贝了一份值,把int1的值100,拷贝给int2,继续画图内存
int1=500,直接修改int1的值为500,表现以下图
分别打印int1,int2的值,相信没有人会答错,分别是500,100。
再来看数组的初始化
先初始化arr1,当执行到new这个关键字,会在堆内存分配内存空间,并把该内存空间的地址赋值给arr1。
继续执行如下代码
这儿arr2初始化时并无new关键字,并不会在堆内存里新开辟一块空间,而是把arr1里存的堆内存地址直接赋值给了arr2,对于引用类型来讲,赋值(=号)就至关于拷贝了一分内存地址,也就是说arr1,arr2如今指向了同一块堆内存,表现形势以下图
这时候执行以下代码
虽然只是修改arr1数组下标位置为3的值
但因为数组arr1和数组arr2指向同一块堆内存,打印arr1[3]和arr2[3]的值,都是8。你答对了吗?
再来看对象的初始化
当看到这个new,这货确定在堆内存里开辟了一块内存空间,Person里有一个叫name的String对象,String这个对象有点特殊,虽然没有new这个关键字,但仍是在堆内存中开辟了一块空间,在String是一个很普通的类一文中已经讲解过了,这里就再也不细讲了,String底层是数组实现的,数组也是引用类型,age为基本数据类型,表现以下图
上图中大框里的内容就是整个Person对象在堆内存中的体现,继续执行如下代码
没有new关键字,per2不会在堆内存中新开辟空间,和数组同样,也是把per1的内存地址直接赋值给了per2
当咱们修改per1的属性的时候
以下图两个红框里的内容,给对象(数组也是对象)赋值其实就是至关于引用从新指向一块堆内存,基本数据类型是直接修改值,表现以下图
因此,无论打印per1仍是per2的name、age,打印出来的结果都是“李四”、35,这个你也答对了吗?最后,咱们来验证一下,结果是否是和文中说的一致。
结果彻底一致,回过头来看看Java里的“==”比较符,结果就不难理解了,代码以下
结果分别是false,true,true,当==两边是基本数据类型时,==于比较的是两边的两个值是否相等,当==两边是引用类型时比较的是两个内存地址,也能够当作是看这两个引用是否指向堆内存里的同一块地址,以下图
新手在学习Java时,在引用类型上可能常常容易犯错误,如本文中所讲的arr1,arr2,不少人在写代码的时候是想拷贝一份值来用,殊不知道在修改arr1的时候,arr2的值也变了。
本篇内容就讲解到这儿,画图不易,但愿你们之后多想一想变量在内存中的样子,学习起来能够事半功倍。四类八种基本数据类型,本文只列举了int类型,其它的7中基本类型和int的表现形式一致,这里就不一一举例了。
最后,说一下前面的文章留的文末思考,首先是让人疑惑的Java代码一文中的文末思考
很简单是false
两个对象都是新new出来的,开辟了两块内存空间,i7和i8的引用不是指向堆内存里的同一块地址,所以打印出来是false。
至于Java中的数组一文中的文末思考
相信认真看过本文的朋友都知道打印出来是多少了,还不清楚的,建议从新阅读本文,直到弄明白为止。
注:char数组的打印有点特殊,int数组打印是打印出来一个地址,而char数组是打印数组里的内容。本文中全部代码已经上传至公众号:saysayJava,须要请自行关注下载。
若是喜欢本系列文章,请为我点赞或顺手分享,您的支持是我继续下去的动力,您也能够在评论区留言想了解的内容,有机会本专栏会作讲解,最后别忘了关注一下我。
转载无限欢迎,但请注明「做者」和「原文地址」。转载请在文中保留此段,感谢您对做者版权的尊重。如需商业转载或刊登,请联系做者得到受权