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 not
actual->String(“某物”)

其中,
String(“…”)
表示值为“…”的对象字符串

Java的按值传递和按引用传递得到了很好的解释

  • 字符串是不可变的,但这是不同的讨论
  • 您没有修改字符串引用所指向的“对象”
    actual
    。在方法
    modify()
    中,您只是覆盖了指向名为
    “Else”
    新字符串的引用。现在这个不会对
    实际所指向的对象产生任何“影响”。因此,当您打印
    实际
    时,它仍然保持不变
  • 我之所以要提出第1点,是因为,假设您的
    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");
    }