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;

}

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

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

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

回到顶部