我是新手。
请问一下。
class a{
    public static void main(String [] args)
    {
        String str= null;
        str += "aaa";
        System.out.println(str);
    }
}
为什么打出来的str是"nullaaa"?而
class a{
    public static void main(String [] args)
    {
        String str= null;
        str = "aaa";
        System.out.println(str);
    }
}
打出来的str 是"aaa"呢?
我是想问具体的过程是如何实现的呢?谢谢

解决方案 »

  1.   

    还有不是说String类对象中的内容只要初始化就不能改变的吗?那么String里面的replace和toLowerCase类似这样的方法是怎么回事呢?谢谢
      

  2.   

    String里面的replace和toLowerCase还有类似的方法都是返回了一个新的String对象String的 a += b操作等价于a = new StringBuffer().append(a).append(b).toString();a = new StringBuffer().append(null).append("abc").toString();StringBuffer.append(Object) 使用了String.valueOf(Object obj):String -> return obj == null ? "null" : obj.toString();
      

  3.   

    String 可以作为java的一个基本类型理解。它的“+”操作和其它基本类型有些相似。每个“+”操作都会有新的临时变量产生。那么 a += b 等价于 a = a+b,当前如果a 的初始值是null的话就会有null出现了。而 "=" 只是一个付值操作。如果对String的连加比较多的话最好使用StringBuffer替代
      

  4.   

    ompiled from "a.java"
    class a extends java.lang.Object{
    a();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: returnpublic static void main(java.lang.String[]);
      Code:
       0: aconst_null
       1: astore_1
       2: new #2; //class java/lang/StringBuilder
       5: dup
       6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V
       9: aload_1
       10: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       13: ldc #5; //String aaa
       15: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       18: invokevirtual #6; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
       21: astore_1
       22: getstatic #7; //Field java/lang/System.out:Ljava/io/PrintStream;
       25: aload_1
       26: invokevirtual #8; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
       29: return
    }
      

  5.   

    二楼  shine333(enihs) 关于StringBuffer的解释的str += "aaa";是非常准确的。你可以参考一下Gosling, Joy, and Steele, Java Language Specification就是这个解释