public void changeParams(int k, int[] A, String s){
k++;
A[0]++;
s += "X";
}
public void print(){
int k = 0;
int[] A = {10, 20};
String s = "aaa";
changeParams(k, A, s);
System.out.println(k + " " + A[0] + " " + s);
}问题是“调用方法打印时输出是什么?”我认为答案是0 10 aaa,但答案键上写着0 11 aaa,有人能解释一下为什么吗?谢谢
发布于 2014-03-22 21:45:03
是0 11 aaa。
A[0]++在changeParams()中影响存储在数组中的值,因为指针被传递到方法中,所以操作会影响共享数据。调试这个并逐步完成..。
public class SO {
public void changeParams(int k, int[] A, String s){
k++;
A[0]++;
s += "X";
}
public void print(){
int k = 0;
int[] A = {10, 20};
String s = "aaa";
changeParams(k, A, s);
System.out.println(k + " " + A[0] + " " + s);
}
public static void main(String... args) throws Exception {
new SO().print();
}
}发布于 2014-03-22 22:00:07
答案是0 11 aaa。其原因是Java是通过值传递的。
这是什么意思。
在changeParams方法中,影响到它的所有三个参数-- int传入、数组和String。
当您按值传递某物时,您就是该值的giving them a copy (某种类型)。这意味着,一般来说,您不能销毁或篡改传入的原始值--对于原语和不可变类。String是不可变的,所以对它所做的任何操作都会产生一个新的String -而对它所做的操作只会存在于该方法中。
数组are not immutable。如果您传入一个数组,您就有能力对其进行索引并更改任何您喜欢的值,这对程序的意图来说可能是可取的,也可能是不可取的。
如果传入一个可变对象(例如,Calendar;如果传入一个Calendar实例,则可以修改其状态(一周中的一天、小时、秒、毫秒等),并且在以后尝试使用同一个实例时可能会造成破坏。
这个是为什么唯一改变的东西是11。A[0]上的值已经增加,而且由于数组不是不可变的,因此实际上正在更改给定位置的数组的值。
https://stackoverflow.com/questions/22583866
复制相似问题