public class Test {
public static void change(char[] a){
a[0] = '1';
a[1] = '2';
}
public static void main(String args[]){
char[] a = new char[]{'a','b'};
change(a);
System.out.println(a);
}
}
输出为12
public class Test {
public static void change(char[] a){
a = new char[]{'1','2'};
}
public static void main(String args[]){
char[] a = new char[]{'a','b'};
change(a);
System.out.println(a);
}
}
输出为ab。我理解我错过了一些关于java传递方法参数的方法。我理解对象的引用是按值传递的。但是,我无法将我理解的内容与这些程序的结果相协调。
答案 0 :(得分:8)
在版本“2”中,更改方法“不执行任何操作”,因为您要将新数组分配给a
,即本地(参数)变量 {{1 }}。这对分配给main方法中声明的变量a
的数组没有影响。
当a
方法完成时,新数组超出范围且无法访问(因此专门用于垃圾回收)。
答案 1 :(得分:4)
这是因为Java按值传递,而不是通过引用传递。在引用的情况下,您复制引用。您可以修改引用(版本1)后面的值,但不能修改引用本身(版本2)。
答案 2 :(得分:2)
致电
a = new char[]{'1','2'};
所有发生的事情都是为方法本地的变量a
分配了一个新引用,这对主方法中仍然引用旧数组的变量a
没有任何影响。
答案 3 :(得分:1)
第一个,您正在更改传入的数组并由'a'
引用第二个,您正在更改'a'
引用的数组有效地,你正在做的第二个
char[] original = new char[]{'a','b'};
// this is basically what your function call is doing from here....
char[] a = original; // a is now also referencing the ab array
a = new char[]{'1','2'}; // now a is referencing a 1 2 array.
// then the function returns....and original is the same still
所以a引用一个新数组,而原始引用原始数组
答案 4 :(得分:1)
由于您传递数据的方式,这种情况正在发生。在第一个示例中,数组已更改,因为您正在传递Change()方法数组的地址,并且该方法正在更改地址中的数据。
在第二个示例中,数组IS已传递,但是您正在初始化一个新数组,该数组声明新的内存空间并更改传入的地址。但是,这不会删除char []的原始声明和初始化实例。在main方法中,当你打印出来时,它打印出本地char []而不是你试图创建的新char。
答案 5 :(得分:1)
因为Java在方法按值和不按引用之间传递对象。在第一个示例中,您在main中实例化一个对象并将其传递给change
,change
仅通过设置值来更改它。在第二个示例中,您实际上已经在main中实例化了new
(使用char[]
)后实际重新实例化它。 change
中重新实例化change
的范围将只是方法,因此当您返回调用它的main时,它将恢复为自己的实例,而不是{{1本地使用的实例}}