传入引用变量,然后生成新的对象并不会改变原来的对象
通过引用变量修改对象
像一个函数中传入引用变量,该变量指向一个堆中的一个对象。
如果利用该特性,可以通过引用变量修改堆中的对象(类比C中的指针 )
传入的是引用变量的一份拷贝,但是二者指向相同的对象
关于拷贝的代码示例
import java.util.Arrays;
public class Test0 {
public static void main(String[] args) {
int[] array = new int[]{1};
changeArray(array);
System.out.println(Arrays.toString(array));
}
public static void changeArray(int[] copy) {
int[] tmp = {0};
/* method 1 */
/* change original array */
copy[0] = tmp[0];
/* method 2 */
/* not change original array */
copy = tmp;
/* method 3*/
/* not change original array */
copy = Arrays.copyOf(tmp, tmp.length);
}
}
我们采用拷贝的思想,逐一分析上述三个例子
为简洁的说明情况,用 original
原来的引用变量, copy
代表传入的一份拷贝
示例1
original
和 copy
都指向同一个对象,copy
取下标就可以修改对象的内容
示例2
original
和 copy
指向同一个对象,tmp
指向另一个对象。copy = tmp
,则 copy
和 tmp
指向同一对象,则 copy
和 original
指向的对象不同,所以修改 copy
对原来的对象无影响
示例3
同上,original
和 copy
开始指向同一对象,然后 copy
指向 Arrays.copyOf
所生成的对象,所以修改 copy
对原来的对象不影响。
函数中使用引用变量的拷贝 来生成新的对象
通过对拷贝的理解,可以明白为什么原有的对象没有被改变
代码示例
public class Test0 {
public static void main(String[] args) {
int[] array = new int[]{1};
changeArray(array);
System.out.println(Arrays.toString(array));
}
public static void changeArray(int[] copy) {
copy = new int[1];
copy[0] = 0;
}
}
用几张图来说明一下
- 这是一开始的情况
然后生成了新的对象,拷贝的引用变量指向了新的对象
从上面可以明白,自此之后,拷贝的引用变量只会修改新的对象 ,而不会对原来的对象 产生任何影响。