在JAVA中更新空字符串的值?

在JAVA中更新空字符串的值?,java,string,Java,String,我有一个java类,它有两个方法,如下所示 public class HelloWorld { public static void main(String[] args) { String a=null; returnOriginalString(a); System.out.println(a); a="Hello"; System.out.println(a); } priv

我有一个java类,它有两个方法,如下所示

public class HelloWorld
{
    public static  void main(String[] args)
    {
        String a=null;
        returnOriginalString(a);
        System.out.println(a);
        a="Hello";
        System.out.println(a);
    }

    private static void returnOriginalString(String a)
    {
        a="Hello World";
    }


}

当我打印上面的消息时,即使在第二个方法中更改了字符串,我仍然将字符串a设置为null。还有一件事,如果我在同一个方法中更新字符串,它将返回正确的值。我如何在不使用任何字符串方法的情况下更新a的值?

为什么会发生这种情况?

Java是“按值传递”——当您将参数传递给方法时,该参数的值将被传递。对于对象,传递的值是对该对象的引用

这就是它变得有趣的地方——您可能会认为,如果更改了字符串的内容,那么由于传入了引用,也会在方法之外看到更改。如果这是其他类型的对象(比如List),那就是真的

但是字符串是不可变的。当您创建一个新的引用时(如在
a=“Hello World”
中),您会得到一个新的引用-现有的字符串对象(带有传递到方法中的引用)的内容没有更改

如何修复它?

可以通过从
returnOriginalString
方法返回新字符串并将其分配给主方法中的
a
来修复此问题:

a = returnOriginalString();

更新方法参数值不会更新
returnString()
String a
的值。您需要从
returnOriginalString(String a)
返回一个字符串,然后将该字符串分配给
a

class HelloWorld
{
   public String returnString()
  {
    String a=null;
    a=returnOriginalString();
    System.out.println(a)
      a="Hello"
    System.out.println(a)
   }

   public static String returnOriginalString()
   {
     return "Hello World;"
   }
} 

这些代码甚至不应该编译,更不用说返回null了。请展示您真正的可编译和可运行代码,包括您的主方法,我们可以自己运行的代码。请注意,Java编译器是不可原谅的,您需要一定程度的OCD来编写代码(并在此网站上提问)。更新了代码。没有空字符串。只有空引用。此处没有或。不要不加区分地标记。不知道谁会投反对票,但这是正确的答案。我没有投反对票,但这只解释了一种解决方法,而不是为什么它会首先发生。@Jason我同意,没有,但你关于字符串是不可变的说法也没有。真正的原因是Java是通过引用传递的,这两位都没有说明。是我做的,我把它作为复制品关闭了,与它无关。问题是为什么
main()
中的变量
字符串a
没有更新,这不是原因。如果您不同意原始答案与此无关,为什么您觉得需要更改它?你不能两全其美。字符串是不可变的这一事实与此毫无关系。这同样适用于任何对象。正如我已经说过的,
a=
也是如此。这是一个赋值,它会丢失先前的
a
。一成不变与此无关。我从来没有遇到过任何人认为
a=
a,set(…)
是一样的。这根本不是一个“常见的错误”,这只是你自己想出来的。