Java的。争论不会改变

时间:2011-12-16 01:12:25

标签: java arguments

static void f(String s)
{
    s = "x";
}

public static void main(String[] args) {
  String s = null;
  f(s);
}

为什么调用f(s)后s的值为null而不是" x"?

5 个答案:

答案 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的属性,那么我将在你的引用中更改。但是你正在创造新的对象。