2017-09-01 54 views
-1

在给定的代码中,'s'是类String的对象。 当我们将's'传递给一个函数时,会创建一个s的副本,它将指向同一个字符串。 但即使如此,该函数所做的更改过法1这样做,但我们去的时候用的方法也越来越体现在没有得到反映2.在java中使用字符串

方法1:

class ST{ 
    public static void main (String[] args) { 
     String s="Test"; 
     change(s); 
     System.out.println(s); 
    } 
    static void change(String s) 
    { 
     s=s+"test"; 

    } 
} 

方法2:

class ST{ 
    public static void main (String[] args) { 
     String s="Test"; 
     s=change(s); 
     System.out.println(s); 
    } 
    static String change(String s) 
    { 
     return s+"test"; 

    } 
}  

我的问题是,如果每次创建原始引用的副本时,它也指向同一个字符串,那么为什么方法一会失败?

+0

我看不出有任何的问题在这里。 –

+2

方法1正在改变本地作用域变量's'来指向一个字符串的新实例。一旦退出该功能,该新字符串将被丢弃。原始变量's'仍然指向原始字符串'Test'。 一旦超出方法范围,返回'main'没有任何改变。方法2将'main'的变量's'设置为函数调用的结果,从而将's'改为指向一个新的字符串。 –

+0

这里的商店refrence和参考文献中作出的变化应该反映在......只是问。 – user8542418

回答

4

字符串对象是不可变的!你不能改变它们,所以s=s+"test"创建一个全新的字符串。

所以来管理它的唯一途径就是你的方法号2

+0

感谢您的答案......但是这是否意味着方法2中的's'已经开始指向全新的字符串“Testtest” – user8542418

+0

不,这意味着您将返回一个NEW字符串对象,与's'不同用's' + test的值 – DamCx

+0

我在说's'在方法2的主要部分's = change(s);' – user8542418