目录
前言:
打卡!打卡!
今天看到这个容易混淆的地方,在这之前我都不知道、没注意,今天补上,当个笔记。
1、什么是值拷贝?
简单来说就是复制,把第一个变量的值复制给第二个变量,改变第二个变量的值不会影响第一个变量的值。
2、什么是引用赋值?
就是引用值,在堆中放有一堆数据,栈中的变量1和变量2去引用这个堆里的数据,改变任何一个变量的值,就是改变堆里的值,另一个变量的值也会随之而变。
3、例子:
(1)代码1:值拷贝
int n1 = 10; //初始化
int n2 = n1; //初始化
n2 = 80; //改变n2的值
System.out.println(n1); //结果为10
System.out.println(n2); //结果为80
我们可以看到上面代码,值拷贝只改变一个变量,另一个变量不会改变。
(2)代码2:引用赋值
int[] arr1 = { 1, 2, 3}; //数组初始化
int[] arr2 = arr1; //数组初始化
arr2[0] = 10; //改变第二个数组的第一个元素
System.out.println(arr1[0]); //结果为10
System.out.println(arr2[0]); //结果为10
为什么两个结果都改变了呢?因为数组赋值(arr2 = arr1)是赋的地址,把arr1的地址给了arr2,两个数组使用的是同一个堆中的数据,所以无论改变哪个数据,另一个也会改变。
那怎么使两个数组数据分开,互不干扰呢?前面说了,是因为使用了同一个堆,那我们再开辟一个堆出来不就解决问题了。
4、代码纠正:
int[] arr1 = { 1, 2, 3}; //赋初值
int[] arr2 = new int[arr1.length]; //开辟新的堆,然后再赋值
arr2[0] = 10; //改变其中一个值
System.out.println(arr1[0]); //结果为1
System.out.println(arr2[0]); //结果为10
在开辟一个新的堆后,两个数组各自使用各自的堆,会不干扰,所以改变其中一个,另一个不会变了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/66233.html