题目描述
请问为什么传递同样的参数,reverse()
可以对原数组进行修改将数组 a 逆置,而 reverse2()
却不行。
我查询了资料,了解到 Java 是值传递,能理解 reverse2()
,但理解不了reverse()
。麻烦各位老师讲解一下。
本人初学者,轻喷QAQ。
相关代码
public static void reverse(int[] array){
for (int i = 0; i< array.length/2;i++){
int temp = array[i] ;
array[i] = array[(array.length -1) - i];
array[(array.length -1) - i] = temp;
}
}
public static void reverse2(int[] array){
int[] temp = new int[array.length];
int count = array.length-1;
for(int temp2 : array){
temp[count--] = temp2;
}
array = temp;
}
public static void main(String[] args) {
int[] a = {1,2,3,4};
reverse2(a);
reverse(a);
}
看了一堆回答,发现没有一个是正确的。包括被采纳的。
说重点,指针传递本质也是值传递,同样有拷贝。
不同的是,指针传递拷贝的
值
,指的是指针地址
。比如
var a= new A("abc");
假设a的指针地址是
0x111111111
这个指针地址空间存的是对应值是0x99999999
,而内存地址0x99999999
存的是{"name":"abc"}
那么当调用函数
public static void test(a A){}
的时候,是发生了拷贝的,不过拷贝的是指针地址,假设函数体内a的指针地址是
0x22222222
,这个指针对应的内存空间存的值也是0x99999999
所以,你讲a赋给一个新对象,实际是将
0x22222222
对应的空间存的值改成了tmp的值空间指针,如0x77777777
你没有改变
0x111111111
和0x99999999
内存空间存的内容。但是,你修改值空间的具体值,肯定是影响外面形参的,因为复制后依然指向的是原来的值空间。如:
这个函数改变的其实是
0x99999999
的空间里的某区域的内容,所以你通过
0x111111111
来取数据,数据肯定是变了的。