java - Java 中的按值传递与按引用传递

标签 java

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 类,专门设计用于支持调用具有“可返回参数”的方法(例如 IntHolderStringHolder )。它们主要与 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/

相关文章:

java - Java I/O 中的多线程是否受限于(或)CPU 受限

java.sql.SQLException : [Microsoft][ODBC Microsoft Access Driver] Too few parameters. 预期 2

java - 如何使用 JSOUP/Rest Assured Api 关闭 SSL 证书并获得登录响应?

Java Swing : multiple windows

java - 如何解释导致 OutOfMemoryError 的 G1 GC 日志?

java - 仅执行一个查询时的statement.executeBatch() 与statement.updateQuery()

java - 使用域在 Camel 上创建路由

java - log4j2 - 错误记录器记录器没有与元素 AppenderRef 匹配的参数

java - Spinner Fragment 不断崩溃

java - 服务器如何向客户端推送数据?