2017-06-26 42 views
-2

我想知道为什么这段代码的输出是“轰鸣声!!!”不是“咆哮!!!吼!!!”? 的代码是:代码中的字符串和stringbuilder之间有什么不同?

public class Lion 
{ 
    public void roar(String roar1, StringBuilder roar2) { 
    roar1.concat("!!!"); 
    roar2.append("!!!"); 
} 
public static void main(String[] args) 
{ 
    String roar1 = "roar"; 
    StringBuilder roar2 = new StringBuilder("roar"); 
    new Lion().roar(roar1, roar2); 
    System.out.println(roar1 + " " + roar2); 
} } 

我试图找到方法的concat的原因()不要追加一个字符串的另一端部。请解释。

+2

字符串是不可变的请参阅[javadocs](https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#concat(java.lang.String)) –

回答

0

这里roar1是你的字符串变量,而roar2是你的类字符串生成器的对象,只有字符串生成器是可变的,字符串不能被突变....因为只有内置的函数在类字符串生成器中可以工作其对象roar2。

Roar1不是字符串生成器的对象,因此,concateate函数将不起作用。

+0

' String'提供了创建新实例的方法,而不是修改实例本身,因为它是不可变的。所以你最后一句话是不正确的。而对于其余的问题,我有问题要理解一半的答案。如果可以,请使用一些标签并尝试纠正自己 – AxelH

+0

我之所以这样说,是因为roar1是变量,而不是字符串构建器类的对象,并且级联函数仅适用于字符串构建器对象,而不适用于基元数据类型。 –

0

如前所述,String类的对象总是不可变的。 此外,你必须记住JAVA中的变量是如何传递给某些方法的。 在你的情况下,你建立一个String和一个StringBuilder,并将它们传递给你的roar()方法。 JVM将创建两个引用两个orignal对象的新变量。由于本地字符串变量的不可变性,如果要更改此对象,则会创建一个新对象。 String对象的append()方法通常会创建并返回一个新的String实例,并进行所做的更改。您没有该对象的参考。即使您的本地字符串引用此对象,但外部的字符串变量仍然引用旧的字符串(“咆哮”)。 这就是为什么你的System.out.println不显示你所做的改变的原因。

+0

'你的本地变量引用了这个新的字符串(“roar !!!”)'这是不正确的。再次阅读代码;)但即使这是正确的书面,你也没有错。 – AxelH

相关问题