-1

“Java is 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 的 Objects 是pass-by-reference,而原始类型是pass-by-value. 但是,如果您尝试将int原始类型替换为IntegerObject,结果将是相同的。如果有人在这里解释这两个例子,我会很高兴。

4

2 回答 2

3

严格来说,Java按值传递的。

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

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

例如

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

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

于 2013-09-05T02:50:47.523 回答
-2

你是对的,java对象总是通过引用传递,但是,你可以看到像'Integer','String','Short'等包装类的源代码。它们是'value'被定义为final。它无法更改。所以,问题'如果您尝试将 int 原始类型替换为 Integer Object,结果将是相同的。与它相关。当您替换为整数对象并更改方法中的值时。对象发生变化。所以,你可以看到结果。

于 2013-09-05T04:58:52.603 回答