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);
}
阅读 2.7k
4 个回答

看了一堆回答,发现没有一个是正确的。包括被采纳的。
说重点,指针传递本质也是值传递,同样有拷贝。

不同的是,指针传递拷贝的,指的是指针地址

比如 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;

}

你没有改变0x1111111110x99999999内存空间存的内容。

但是,你修改值空间的具体值,肯定是影响外面形参的,因为复制后依然指向的是原来的值空间。如:

public static void test(a A){
 a.name="def";

}

这个函数改变的其实是0x99999999的空间里的某区域的内容,
所以你通过0x111111111来取数据,数据肯定是变了的。

JAVA传参传的是值,但是准确点来说,对于基本数据类型,传的是数据的值;对于引用数据类型,传的是引用的值。
这个reverse方法,是把数组的引用传到了方法内,就是说形参和实参指向同一个对象。修改形参所指向的对象的属性,对象发生了变化,所以再查看实参,对象是变化了的。
reverse2方法,形参重新指向了另外一个新的对象,而原先的对象没有任何变化,所以查看实参,没有变化。

我曾经为传递值不审传递引用的问题纠结了很久,其实本质就是

  • 基本数据传值
  • 对象传递引用

但是这里的引用,非要说成是值也没毛病。引用如果看作一个指针,就是一个地址值。而且这里的引用,和 C++ 的引用是不同的概念,这个引用更像是不能参与计算的 C++ const 指针。

不管怎么说,引用传递(赋值)多少次,它指向的始终是同一个对象。如果对这个对象进行的操作(方法调用、属性修改等),是作用在对象上的,所有引用到这个对象的引用,去取属性的时候都会取到变更后的值。引用参数可以看作是局部变量,对一个局部变量本身重新赋值,实际上是让它指向了另一个对象(相同和相兼容的类型),这并不会改变其他引用。

新手上路,请多包涵

java 参数传递分为值传递和引用传递
一般来说值传递是基础类型
引用传递形参是对象,java中对象创建时对应对象产生一个引用hash地址
reverse方法操作的是对象,引用不会改变,所以作为形参的参数地址不变数据会变化
reverse2中重新创建了对象,并且赋值给形参,所以引用地址已经改变

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏