static void f(String s)
{
s = "x";
}
public static void main(String[] args) {
String s = null;
f(s);
}
为什么调用f(s)后s的值为null而不是" x"?
答案 0 :(得分:5)
因为s
是参考。您将该引用的副本传递给该方法,然后在该方法内修改该副本。原件不会改变。
答案 1 :(得分:2)
将Object变量传递给java中的函数时,它通过引用传递。如果为函数中的对象分配新值,则覆盖传入的引用,而不修改任何仍保留原始引用的调用代码所看到的值。
但是,如果您执行以下操作,则会更新该值:
public class StringRef
{
public String someString;
}
static void f(StringRef s)
{
s.someString = "x";
}
public static void main(String[] args)
{
StringRef ref = new StringRef;
ref.someString = s;
f(ref);
// someString will be "x" here.
}
答案 2 :(得分:0)
在函数f()中,值为“x”。在此函数之外,s的值将为null。参考数据类型(例如对象)通过值传递,请参阅here(阅读“传递参考数据类型参数”部分)
答案 3 :(得分:0)
鉴于s
属于String
类型,它是一种引用类型(不是基元):
s = "x";
不意味着“将s
引用的内容转换为值"x"
”。 (在null
可能的语言中,它无论如何都无法真正做到这一点,因为没有实际的“s
所指的”转换的东西。)
它实际上意味着“导致s
停止引用它当前引用的内容,并开始引用值"x"
”。
s
中的f()
名称是f()
的本地名称,因此一旦该函数返回,该名称就无关紧要了; s
中的main()
名称是不同的名称,仍然是null
引用。
参数传递完成的唯一事情是使s
中的f()
以null
开头。
如果你没有使用null
,这个解释实际上会更顺利:(
答案 4 :(得分:0)
实际上你没有改变你创建新值的值,它完全不同,如果你在方法中更改abject的属性,那么我将在你的引用中更改。但是你正在创造新的对象。