JAVA争论没有改变

JAVA争论没有改变,java,arguments,Java,Arguments,为什么调用f(s)后s的值为null而不是“x”?因为s是一个引用。将该引用的副本传递给该方法,然后在该方法内部修改该副本。原始版本不会更改。因为s是一个参考。将该引用的副本传递给该方法,然后在该方法内部修改该副本。原始值不变。在函数f()中,值将为“x”。在此函数之外,s的值将为null。引用数据类型(如对象)按值传递请参阅(阅读“传递引用数据类型参数”一节)在函数f()中,值将为“x”。在此函数之外,s的值将为null。引用数据类型(如对象)按值传递请参阅(阅读“传递引用数据类型参数”一节)

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

因为
s
是一个引用。将该引用的副本传递给该方法,然后在该方法内部修改该副本。原始版本不会更改。

因为
s
是一个参考。将该引用的副本传递给该方法,然后在该方法内部修改该副本。原始值不变。

在函数f()中,值将为“x”。在此函数之外,s的值将为null。引用数据类型(如对象)按值传递请参阅(阅读“传递引用数据类型参数”一节)

在函数f()中,值将为“x”。在此函数之外,s的值将为null。引用数据类型(如对象)按值传递请参阅(阅读“传递引用数据类型参数”一节)

在java中将对象变量传递给函数时,它是按引用传递的。如果将新值指定给函数中的对象,则覆盖传入的引用,而不修改仍保留原始引用的任何调用代码看到的值

但是,如果执行以下操作,则会更新该值:

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

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

在java中将对象变量传递给函数时,它是通过引用传递的。如果将新值指定给函数中的对象,则覆盖传入的引用,而不修改仍保留原始引用的任何调用代码看到的值

但是,如果执行以下操作,则会更新该值:

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

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

假定
s
属于
String
类型,这是一种引用类型(而不是原语):

不是的意思是“将
s
引用的事物转换为值
“x”
”。(在一种可能出现
null
的语言中,无论如何它都不能真正做到这一点,因为没有真正的
s
所指的“东西”来进行转换。)

它实际上意味着“使
s
停止引用它当前引用的内容,并开始引用值
“x”

f()
中的名称
s
f()
的本地名称,因此一旦函数返回,该名称就不相关了;
main()
中的名称
s
是另一个名称,仍然是
null
引用

参数传递完成的唯一一件事是使
f()
中的
s
null
开头


如果您没有使用
null
:(

假设
s
String
类型,这是一种引用类型(不是原语),那么这个解释实际上会更顺利一些:

不是的意思是“将
s
引用的东西转换成值
“x”
”(在一种可能为
null
的语言中,它实际上不能这样做,因为没有
s
引用的实际“东西”进行转换。)

它实际上意味着“使
s
停止引用它当前引用的内容,并开始引用值
“x”

f()
中的名称
s
f()
的本地名称,因此一旦函数返回,该名称就不相关了;
main()
中的名称
s
是不同的名称,仍然是
null
引用

参数传递完成的唯一一件事是使
f()
中的
s
null
开头


如果您没有使用
null
,这个解释实际上会更顺利一些:(

实际上,您没有更改创建新对象的值,这是完全不同的,如果您在方法中更改abject的属性,那么我将在您的引用中更改。但您正在创建新对象。

实际上,您没有更改创建新对象的值,如果您更改属性,这是完全不同的在这个方法中,我会改变你的引用。但是你正在创建新的对象。

AS @ Oli说。你可以考虑在方法参数中使用最终值,即:声明静态空格F(最终字符串S)。为了避免这种潜在的混淆,当我通过C++中的一个指针时,我传递了一个指针的副本,得到了预期的结果。有什么不同?它是引用的拷贝,不是对象的复制。@用户:这与<代码>空隙f(char *){s=“x”);}int(){char * s=null;f(s);}<代码> >如@ Oli所说。您可以考虑在方法参数中使用最终值,即声明:静态空隙F(最终字符串S)。为了避免这种潜在的混淆,当我通过C++中的一个指针时,我传递了一个指针的副本,得到了预期的结果。有什么不同?它是引用的拷贝,不是对象的复制。@用户:这与<代码>空隙f(char *){s=“x”);}int(){char * s=null;f(s);}。值得注意的是,尽管大多数经验丰富的Java程序员都能直观地理解它为何以这种方式工作,但很难解释。整个“按值传递引用”过程这是一个很难理解的概念,更不用说解释了。问得好。不要再问了。请注意,尽管大多数资深Java程序员直观地理解了它为什么以这种方式工作,但很难解释。整个“按值传递引用”是一个很难理解的概念,更不用说解释了。好问题。不要再问了。请
s = "x";