【问题标题】:Java - Parameter Passing Confusion [duplicate]Java - 参数传递混乱[重复]
【发布时间】:2013-09-08 17:35:51
【问题描述】:

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

【问题讨论】:

  • 在 Java 中,对象总是按引用传递,而变量是按值传递。字符串也是不可变的对象。
  • @H-Patel 每篇文章,甚至 JLS 都说 Java 是严格按值传递的,无论数据类型如何。
  • @Thilo 这是一个很好的问题。我还尝试阅读答案并制作我的场景。我实际上是在询问我的示例背后发生了什么。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    严格来说,Java 传值。

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

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

    例如

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多