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有人可以解释为什么吗?感谢
答案 0 :(得分:3)
是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();
}
}
答案 1 :(得分:2)
答案是0 11 aaa
。 原因是因为Java是按值传递的。
这就是意思。
在你的changeParams
方法中,你正在影响它的所有三个参数 - 传入的int,数组和String
。
当您按值传递某些内容时,您的值为giving them a copy(各种)。这意味着,一般来说,你不能破坏或篡改传入的原始值 - 关于原语和不可变类。 String
是不可变的,因此对其执行的任何操作都将生成一个新的String
- 并且对其执行的操作将仅存在于该方法内。
阵列are not immutable。如果你传入一个数组,你就可以索引它并改变你喜欢的任何值,这对你的程序的意图可能是也可能不合适。
如果你传入一个可变对象 - Calendar
,也是如此;如果您传入Calendar
实例,您将能够修改其状态(星期几,小时,秒,毫秒等),并且当您尝试使用相同的实例执行某些操作时可能会造成严重破坏别的以后。
这就是为什么唯一改变的是11
。 A[0]
处的值已递增,并且因为数组不是不可变的,所以您实际上是在给定位置更改数组的值。