Java 按值传递引用
我有以下代码:Java 按值传递引用,java,function,reference,Java,Function,Reference,我有以下代码: public class PassReferenceByValue { static void modify(String m) { m = "Else"; } public static void main(String [] arg) { String actual = "Something"; modify(actual); System.out.println(ac
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);
}
}
它将打印内容
我知道Java根本不传递对象。相反,它创建传递的引用的副本。如果我理解正确,当我调用modify(actual)
Java时,会创建对同一对象的另一个引用。现在我们有两个引用对象actual
。现在,通过第二个引用,我们修改了对象,对象应该改变。对象actual
应该更改,因为通过复制的引用,我们对该对象具有相同的访问权限
有人能解释一下我在哪里不理解按值传递引用的概念吗
static void modify(String m)
{
m = "Else";
System.out.println(m);
}
如果执行此操作,m将打印Else,则只会将局部变量m分配给新值。这里不会更改主方法中的实际值。Java中的所有“变量”都是对象驻留时对内存中地址的引用
所以你有:
actual -> String("Something")
在方法调用之后
actual -> String("Something")
及
您只是在更改m->String(“Else”)
bot notactual->String(“某物”)
其中,String(“…”)
表示值为“…”的对象字符串
Java的按值传递和按引用传递得到了很好的解释
actual
。在方法modify()
中,您只是覆盖了指向名为“Else”
的新字符串的引用。现在这个不会对实际所指向的对象产生任何“影响”。因此,当您打印实际
时,它仍然保持不变
modify
方法如下所示
public void modify(String s) {
s.replaceAll("Some", "Many");
}
由于
字符串的不可变的行为,实际的会打印出“某物”
。您正在更改m
,它是一个局部变量,仅在引用对象的modify()
中可见。您正在创建一个值为“Else”的新字符串对象,并使m
指向它
当您从modify()
出来并打印actual
时,它仍然是对包含文本“Something”的字符串对象的引用。(并查看右侧的各种其他相关问题。)m=“Else”;不要修改任何对象。它创建一个包含字符串“Else”的新字符串对象,然后将m更改为引用此新对象。不同意重复项,因为引用问题的答案不会消除提问者的混淆点。最好编辑该问题,使其询问“字符串重新分配是否会更改基础对象,或创建新字符串并为其分配引用?”@是否要签出。这应该可以消除您的困惑。在进行反对投票之前进行评论。此外,一旦您离开modify()
变量m
已超出范围,因此它和它引用的字符串都不能使用。
public void modify(String s) {
s.replaceAll("Some", "Many");
}