Possible Duplicate:
Is Java “pass-by-reference”?
我试图理解下面编写的 2 个 Java 程序之间的区别:
public class Swapping {
public static void main(String[] args) {
IntWrap i = new IntWrap(10);
IntWrap j = new IntWrap(20);
swap(i, j);
System.out.println("i " + i.i + ", j " + j.i);
}
public static void swap(IntWrap i , IntWrap j){
int x = i.i;
i.i = j.i;
j.i = x;
System.out.println("i " + i.i + ", j " + j.i);
}
}
public class IntWrap {
int i;
public IntWrap(int i){
this.i = i;
}
}
输出:
i 20, j 10
i 20, j 10
第二个:
public class Swapping {
public static void main(String[] args) {
Integer i = new Integer(10);
Integer j = new Integer(20);
swap(i, j);
System.out.println("i " + i + ", j " + j);
}
public static void swap(Integer i , Integer j){
Integer temp = new Integer(i);
i = j;
j = temp;
System.out.println("i " + i + ", j " + j);
}
}
输出:
i 20, j 10
i 10, j 20
我无法理解,即使我传递了 Integer 对象,它也应该在原始程序中被交换。如果我在它的顶部编写包装类,因为我再次只传递对象,那么它会产生什么区别。
最佳答案
所有方法参数,包括对象引用,在 Java 中都是按值传递的。您可以为方法参数分配任何值 - 调用代码中的原始值不会被修改。但是,您可以修改传递的对象本身,并且当方法返回时,更改将持续存在。
J2SE API 中有旧的 Holder 类,专门设计用于支持调用具有“可返回参数”的方法(例如 IntHolder 或 StringHolder )。它们主要与 IDL 语言生成的代码一起使用,因为 IDL 需要支持 in、out 和 inout 参数。这些持有者在其他代码中非常罕见。
您还可以使用数组模拟按引用传递:
String [] a = new String[1]; String [] b = new String[1];
void swap(String [] a, String [] b) {
String t = a[0]; a[0] = b[0]; b[0] = t;
}
关于java - Java 中的按值传递与按引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14314983/