【问题标题】:Java pass by value query [duplicate]Java按值传递查询[重复]
【发布时间】:2016-12-30 06:13:21
【问题描述】:

由于 java 是按值传递的。在下面的代码中,我们将值传递给 appendStringMethod 而不是引用,那么为什么在 main 方法中我们得到 HelloWorld 而不仅仅是在 main 中调用 appendStringMethod() 之后的 Hello。

public class test {
    public static void main(String args[]) {

        StringBuilder str = new StringBuilder("Hello");
        appendStringMethod(str);
        System.out.println(str);
    }

    static void appendStringMethod(StringBuilder s) {
        s.append("World");
    }
}

但是在下面的代码中,值不会交换。

public class Mock {
  public static void main(String args[]) {
    StringBuilder str1 = new StringBuilder("Hello");
    StringBuilder str2 = new StringBuilder("World");

   swap(str1, str2);
   System.out.println(str1);
   System.out.println(str2);

   }
   static void swap(StringBuilder s1, StringBuilder s2) {
   StringBuilder s= s1;
   s1=s2;
    s2=s1;
   }
}

【问题讨论】:

  • 在Java中,参数是按值传递的,但所有的对象都是引用(或指针)。所以你通过值传递一个指向 s 的指针。
  • 因为StringBuilder的引用是一个副本,但是StringBuilder的实例是一样的。 appendStringMethod 正在处理与 main 方法相同的对象。
  • I believe that much of the confusion on this issue has to do with the fact that different people have different definitions of the term "reference". People coming from a C++ background assume that "reference" must mean what it meant in C++, people from a C background assume "reference" must be the same as "pointer" in their language, and so on. Whether it's correct to say that Java passes by reference really depends on what's meant by "reference". - Gravity

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


【解决方案1】:

虽然 Java 在技术上 传递价值 对所有事情,as spoken about here,最好不要这样想。 p>

将类的实例传递给方法时,确实通过值传递对象的引用


StringBuilder str = new StringBuilder("Hello");
appendStringMethod(str);

在此代码中,您将对 StringBuilder 实例的引用按值传递到 appendStringMethod。

因此,一旦调用该方法,str 将变为“HelloWorld”。


注意:这不适用于intchar 等基元。由于它们不是 实际 对象,因此它们没有引用。这意味着它们将以“预期”的方式按值传递。

【讨论】:

【解决方案2】:

这是因为对 StringBuilder 的 reference 是按值传递的。您可以添加字符,它们将在方法返回后出现在实例中。这最终就像通过引用传递一样。它与 Collection 类(List、Map...)以及您自己的类类似。

对于原始类型 (int,...),Java 行为很简单:将值复制到原始类型的另一个实例中。

对于Objects,情况相同:对象变量是保存Object地址的指针,因此引用被复制。我能想到的唯一例外是 String 对象,因为字符存储在声明为 final 的数组中,因此无法修改。

【讨论】:

  • 通过引用传递,java引用的意思。
【解决方案3】:

在 java 中,我们通过引用值传递。请看以下示例:

public void foo(Integer i) {
    i = new Integer(1000);
}

public void bar(Integer i) {
    i++;
}

Integer n = new Integer(2000);
foo(n);
bar(n);
System.out.println(n.toString());

我相信这个问题上的很多困惑与 事实上,不同的人对这个词有不同的定义 “参考”。来自 C++ 背景的人认为 “参考”必须是指它在 C++ 中的含义,来自 C 背景的人 假设“reference”在他们的语言中必须与“pointer”相同, 等等。说Java通过引用传递是否正确 真的取决于“参考”是什么意思。

--first comment

【讨论】:

  • 您忘记解释该代码 sn-p 的用途。它打印 2000。
猜你喜欢
  • 2011-12-23
  • 2013-12-02
  • 2012-03-12
  • 2013-09-15
  • 2012-03-13
  • 2014-09-10
  • 2016-04-22
  • 2019-03-30
  • 2011-05-16
相关资源
最近更新 更多