Java 值传递问题
题目描述
请问为什么传递同样的参数,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
public static void test(a A){ var tmp = new A("def");
a = tmp;
}
你没有改变0x111111111
和0x99999999
内存空间存的内容。
但是,你修改值空间的具体值,肯定是影响外面形参的,因为复制后依然指向的是原来的值空间。如:
public static void test(a A){ a.name="def";
}
这个函数改变的其实是0x99999999
的空间里的某区域的内容,
所以你通过0x111111111
来取数据,数据肯定是变了的。
回答:
JAVA传参传的是值,但是准确点来说,对于基本数据类型,传的是数据的值;对于引用数据类型,传的是引用的值。
这个reverse方法,是把数组的引用传到了方法内,就是说形参和实参指向同一个对象。修改形参所指向的对象的属性,对象发生了变化,所以再查看实参,对象是变化了的。
reverse2方法,形参重新指向了另外一个新的对象,而原先的对象没有任何变化,所以查看实参,没有变化。
回答:
我曾经为传递值不审传递引用的问题纠结了很久,其实本质就是
- 基本数据传值
- 对象传递引用
但是这里的引用,非要说成是值也没毛病。引用如果看作一个指针,就是一个地址值。而且这里的引用,和 C++ 的引用是不同的概念,这个引用更像是不能参与计算的 C++ const 指针。
不管怎么说,引用传递(赋值)多少次,它指向的始终是同一个对象。如果对这个对象进行的操作(方法调用、属性修改等),是作用在对象上的,所有引用到这个对象的引用,去取属性的时候都会取到变更后的值。引用参数可以看作是局部变量,对一个局部变量本身重新赋值,实际上是让它指向了另一个对象(相同和相兼容的类型),这并不会改变其他引用。
回答:
java 参数传递分为值传递和引用传递
一般来说值传递是基础类型
引用传递形参是对象,java中对象创建时对应对象产生一个引用hash地址
reverse方法操作的是对象,引用不会改变,所以作为形参的参数地址不变数据会变化
reverse2中重新创建了对象,并且赋值给形参,所以引用地址已经改变
以上是 Java 值传递问题 的全部内容, 来源链接: utcz.com/p/944233.html