方法为什么这两个java程序的输出不同
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传递方法参数的方式。我知道对对象的引用是通过值传递的。然而,我无法将我的理解与这些项目的结果相协调
# 1 楼答案
在版本“2”中,更改方法“不做任何事情”,因为您正在为
a
分配一个新数组,它是本地(参数)变量a
。这对分配给main方法中声明的变量a
的数组没有影响当
change()
方法完成时,新数组超出范围,无法访问(因此指定用于垃圾收集)# 2 楼答案
这是因为Java按值传递,而不是按引用传递。在引用的情况下,复制引用。可以修改引用后面的值(版本1),但不能修改引用本身(版本2)
# 3 楼答案
因为Java在方法之间通过值传递对象,而不是通过引用传递对象。在第一个示例中,您在main中实例化一个对象,并将其传递给
change
,后者只通过设置值来改变它。在第二个示例中,在已经在main中实例化了一次之后,实际上在change
(使用new
)中重新实例化了它。在change
中重新实例化的char[]
的作用域将是方法,只有这样,当您返回调用它的main时,它将恢复到自己的实例,而不是change
在本地使用的实例# 4 楼答案
这是因为你传递数据的方式。在第一个示例中,数组被更改,因为您正在向Change()方法传递数组的地址,而该方法正在更改地址中的数据
在第二个示例中,数组被传递,但是您正在初始化一个新的数组,该数组声明新的内存空间并更改传递的地址。然而,这并不会删除main方法中最初声明和初始化的char[]实例,因此当您打印出来时,它会打印出本地char[],而不是您试图创建的新实例
# 5 楼答案
首先,您正在更改传入并由“a”引用的数组
第二,您正在更改“a”引用的数组
实际上,你正在做的第二件事
所以a引用的是一个新数组,而原始数组仍然引用原始数组
# 6 楼答案
有人打电话给我
所发生的一切是,为方法的局部变量
a
分配了一个新的引用,这对仍然引用旧数组的主方法中的变量a
没有任何影响