按值Java传递引用

时间:2013-05-06 11:17:05

标签: 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(actual);

    }
}

它会打印Something

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

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

5 个答案:

答案 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)

Check this

Java的值传递和传递引用很好地解释了

答案 3 :(得分:0)

  1. 字符串是不可变的,但这是一个不同的讨论
  2. 您没有修改字符串引用actual指向的“对象”。在方法modify()中,您只需覆盖引用以指向名为"Else"新String 对象。现在, actual指向的对象进行任何“效果”。因此,当您打印actual时,它仍然保持不变
  3. 为什么我要尝试指出第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对象的引用。