Java - 参数传递混乱

时间:2013-09-05 02:47:48

标签: java object parameters pass-by-reference pass-by-value

“Java是pass-by-value” - Java Language Specification

然而,有些事情让我感到困惑。请瞥一眼我的例子

public class Main {

    public static void main(String[] args) {

        StringBuilder myBuilder = new StringBuilder("Michael");

        editString(myBuilder);

        System.out.println(myBuilder);

    }

    public static void editString(StringBuilder x){
        x.append(" Ardan");
    }

}

输出:

Michael Ardan

这个例子:

public class Main {

    public static void main(String[] args) {

        int myInt = 10;

        editInt(myInt);

        System.out.println(myInt);

    }

    public static void editInt(int x){
        x ++;
    }
}

输出:

10

我尝试阅读其他文章,并且都说Java总是pass-by-value。我做了一些测试场景。将这两个示例相互比较使我认为Java的对象是pass-by-reference而原始类型是pass-by-value。但是,如果您尝试将int基元类型替换为Integer对象,则结果将是相同的。如果有人在这里解释这两个例子我会很高兴。

2 个答案:

答案 0 :(得分:3)

严格地说,Java 传递值。

然而,通过值传递的是对象的“指针”。因此,您将能够从被调用方法内部访问和修改该对象的状态(并且这些更改对于具有指向同一对象的“指针”的所有其他人都可见。)

传递引用意味着您可以更改主叫方变量指向的位置。你不能用Java做的。

例如

  public static void editString(StringBuilder x){
     x = new StringBuilder("Foo");
  }

在方法之外没有任何影响。在pass-by-reference中,您实际上会将新的StringBuilder分配回调用方法变量。

答案 1 :(得分:-2)

你是对的,java对象总是按引用传递,但是,你可以看到包装类的源代码,如'Integer','String','Short'等等。它们的'价值'是定义的因为最终.it无法改变。所以,问题是“如果你试图将int原语类型替换为Integer Object,结果将是相同的。”当它替换为整数对象并更改方法中的值时,它与它有关。对象发生了变化。所以,你可以看到结果。