-1

Since java is pass by value.In below code we are passing a value to appendStringMethod not a reference, then why in main method we get HelloWorld not just Hello after calling appendStringMethod() in main.

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");
    }
}

However in below code, values are not swapped.

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;
   }
}
4

3 回答 3

1

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

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

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

于 2016-08-23T12:15:39.033 回答
0

在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 背景的人认为“引用”必须与他们语言中的“指针”相同,等等。说 Java 通过引用传递是否正确取决于“引用”的含义。

--第一条评论

于 2016-08-23T12:21:22.377 回答
0

虽然 Java 在技术上是 通过价值传递的正如这里所说的,但最好不要这样想。

将类的实例传递给方法时,实际上是按值传递对象的引用


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

在此代码中,您将对 StringBuilder 实例的引用通过 value传递给 appendStringMethod 。

因此,str一旦方法被调用,就会变成“HelloWorld”。


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

于 2016-08-23T12:15:24.500 回答