【发布时间】:2015-07-23 02:52:34
【问题描述】:
请看下面的代码:
public static void main(String[] args) {
Random random = new Random();
int[] array = new int[10];
Arrays.setAll(array, operand -> random.nextInt(10));
System.out.println(Arrays.toString(array));
swap(array, 0, 9);
System.out.println(Arrays.toString(array));
}
static void swap(int[] array, int i, int j) {
int temp = array[i]; // pass by value ??
array[i] = array[j]; // the value of temp doesn't change, why?
array[j] = temp; // temp == array[i]
}
swap 方法中究竟发生了什么?
我需要一个完整的解释和一个低级。
编辑:
好的,让我再举一个例子:
public class StringHolder {
private String value;
public StringHolder(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return getValue();
}
}
主要方法:
public static void main(String[] args) {
StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
StringHolder tmp = holders[0];
holders[0].setValue("string 2");
System.out.println(tmp);
System.out.println(holders[0]);
}
输出:
string 2
string 2
根据@chokdee 的回答,tmp 是一个新变量,并且拥有自己的内存...
但是当我们对原始变量 (holder[0]) 应用更改时,它也会影响 tmp。
另一个例子:
public static void main(String[] args) {
StringHolder[] holders = new StringHolder[]{new StringHolder("string 1")};
StringHolder tmp = holders[0];
holders[0] = new StringHolder("string 2");
System.out.println(tmp);
System.out.println(holders[0]);
}
输出:
string 1
string 2
提前致谢。
【问题讨论】:
-
这感觉很像是一道作业题……
-
你确定吗?我记得大学时代有一个几乎与家庭作业相同的问题:)
-
我需要一个完整的解释和一个低级。当然,这不是家庭作业?
-
如果您能从 sn-p 中分辨出您的推论是什么,以及您不明白什么,人们会很乐意帮助您。你看到的 sn-p 没有什么大不了的..
-
不同之处在于第一个示例中您使用原始值,而第二个示例中您使用对象。请看javadude.com/articles/passbyvalue.htm
标签: java arrays pass-by-reference pass-by-value