[英]Java. Argument does not change
static void f(String s)
{
s = "x";
}
public static void main(String[] args) {
String s = null;
f(s);
}
为什么调用f(s)后s的值为null而不是“ x”?
因为s
是参考。 您将该引用的副本传递给该方法,然后在该方法内部修改该副本。 原件不变。
将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.
}
在函数f()中,该值为“ x”。 在此函数之外,s的值为null。 参考数据类型(例如对象)通过值传递,请参见此处 (请阅读“传递参考数据类型参数”一节)
假设s
是String
类型,这是引用类型(不是原始类型):
s = "x";
并不意味着“变换的东西s
是指到值"x"
”。 (在可能存在null
的语言中,它无论如何都不能真正做到这一点,因为没有实际的“ s
所指事物”来进行转换。)
实际上,它的意思是“使s
停止引用其当前引用的事物,而开始引用值"x"
”。
该名s
在f()
是本地的f()
所以一旦函数返回时,该名称是无关紧要的; main()
的名称s
是一个不同的名称,并且仍然是null
引用。
传递的参数唯一要做的就是使f()
s
从null
开始。
如果您没有使用null
:(
实际上,您并没有更改要创建的值,而是完全不同的。如果您在方法中更改对象的属性,那么我的引用将被更改。 但是您正在创建新对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.