我有以下代码:
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
应该更改,因为通过复制的引用,我们可以访问对象。
有人可以解释一下我无法理解按值传递引用的概念吗?
答案 0 :(得分:0)
static void modify(String m)
{
m = "Else";
System.out.println(m);
}
如果你这样做,我将打印Else,它只是局部变量m被分配给一个新值。 main方法中的实际值在这里没有改变。
答案 1 :(得分:0)
Java中的所有“变量”都是对象所在的内存中的地址引用。
所以你有:
actual -> String("Something")
在方法调用之后你有
actual -> String("Something")
和
m -> String("Something")
您只是在改变m -> String("Else")
bot not actual -> String("Something")
其中String("...")
表示法是指具有值“...”的对象字符串。
答案 2 :(得分:0)
Java的值传递和传递引用很好地解释了
答案 3 :(得分:0)
actual
指向的“对象”。在方法modify()
中,您只需覆盖引用以指向名为"Else"
的新String 对象。现在, 对actual
指向的对象进行任何“效果”。因此,当您打印actual
时,它仍然保持不变为什么我要尝试指出第1点,比如你的modify
方法如下
public void modify(String s) {
s.replaceAll("Some", "Many");
}
由于actual
的不可变行为,"Something"
仍然打印String
。
答案 4 :(得分:0)
您正在更改m
,这是一个仅在引用对象的modify()
中可见的局部变量。您正在使用值“Else”创建一个新的String对象,并使m
指向它。
当你离开modify()
并打印actual
时,它仍然是对包含文本“Something”的String对象的引用。