-1

我有以下代码:

public class PassReferenceByValue {


    static void modify(String m)
    {
       m = "Else";
    }


    public static void main(String [] arg)
    {
       String actual = "Something";

       modify(actual);

       System.out.println(actual);

    }
}

它将打印Something.

我知道Java根本不传递对象。相反,它会创建传递的引用的副本。如果我理解正确,当我调用modify(actual)Java 时,会创建对同一对象的另一个引用。所以,现在我们有两个引用对象的引用actual。现在,通过第二个引用,我们修改了对象,对象应该会改变。对象actual应该改变,因为通过复制的引用我们对对象具有相同的访问权限。

有人可以解释一下我在哪里无法理解按值传递引用的概念吗?

4

5 回答 5

0
static void modify(String m)
    {
       m = "Else";
       System.out.println(m);
    }

如果你这样做 m 将打印 Else,它只是局部变量 m 被分配给一个新值。main 方法中的实际值在这里没有改变。

于 2013-05-06T11:19:51.737 回答
0

Java 中的所有“变量”都是对象驻留时对内存中地址的引用。

所以你有了:

actual -> String("Something")

方法调用后你有

actual -> String("Something")

m -> String("Something")

你只是在改变m -> String("Else")

机器人不是actual -> String("Something")

其中String("...")符号表示具有值“...”的对象字符串。

于 2013-05-06T11:20:29.133 回答
0

Check this

Java's pass by value and pass by reference is nicely explained

于 2013-05-06T11:21:08.840 回答
0
  1. 字符串是不可变的,但这是一个不同的讨论
  2. 您没有修改 String reference 指向的“对象” actual。在该方法modify()中,您只是覆盖引用以指向一个名为 的新 String对象"Else"。现在这不会对 .指向的对象产生任何“影响”actual。因此,当您打印时actual,它仍然保持不变

为什么我要提出第 1 点是,说你的modify方法如下

public void modify(String s) {
   s.replaceAll("Some", "Many");
}

由于' 的不可变行为,仍然actual会打印。"Something"String

于 2013-05-06T11:21:15.387 回答
0

您正在更改m仅在modify()引用对象时可见的局部变量。您正在创建一个新的 String 对象,其值为“Else”并m指向它。

当您退出modify()并 printactual时,它仍然是对包含文本“Something”的 String 对象的引用。

于 2013-05-06T11:21:41.430 回答