Java-参数传递混乱



"Java是pass-by-value"
-Java语言规范

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

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对象,结果将是相同的。如果有人在这里解释这两个例子,我会很高兴的。

严格来说,Java是通过值传递的。

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

传递引用意味着您可以更改调用端变量指向的位置。这在Java中是做不到的。

例如

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

在方法之外没有任何效果。在传递引用中,实际上是将新的StringBuilder重新分配到调用方法变量中。

你是对的,java对象总是通过引用传递,但是,你可以看到包装类的源代码,如"Integer"、"String"、"Short"等。它们是"value",被定义为final。它不能更改。所以,问题是"如果你试图将int基元类型替换为Integer object,结果会是一样的。"当您替换为Integer Object并更改方法中的值时。对象发生变化。所以,你可以看到结果。

最新更新