字符串问题?

public class testNull {

/**
 * @param args
 */
public static void main(String[] args) {
    String a=null;
    String b="";
    String c=b+a;
              //String c=b+a;
    System.out.println(c);

//输出都为null

}

}
结果都为null,有人可以帮助解释一下吗?

对String的+操作实际上是通过StringBuffer实现的,也就是append方法
该方法会将将null转换为“null”字符串,所以得到的结果是c="null"

null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。

String a=null;
String b="";
String c=b+a;

a 是String 类型 但是他是不确定的对象! 是 null
b 是string 类型 确定的 字符串对象 分配了内存的!

a+b =c c 也是不确定的对象! 所以是null

输出一下 a == null 和 c == null,就看到不同了

二楼说的是,一楼的还得回去复习

具体原因不是很明确,不过
[code="java"]
String b = "|";
String a = null;
Integer i = null;
Object o = null;
boolean s1 = true;
boolean s2 = false;

String c = a + b + i + b + o + b + null + b + s1 + b + s2;
System.out.println(c);
[/code]

从上面代码可以看出 String 相加操作,对于正常的对象类型,采取的策略是
“Java 语言提供对字符串串联符号("+")和其他对象到字符串的转换的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中所有类继承”
而对于一下类型的数据,则转换为一种字符串意义的表达
[code="java"]
null -- "null "
true -- "true "
false -- "false "
[/code]

希望有人能从VM角度解释一下 共同学习

String a=null; 'aconst_null
'astore_0
String b=""; 'ldc ""
'astore_1
String c=b+a; 'new Ljava/lang/StringBuilder;
'invoke_special Ljava/lang/StringBuilder.()V
'aloat_1
'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
'aloat_0
'invoke_virtual Ljava/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
'invoke_virtual Ljava/lang/StringBuilder.toString()Ljava/lang/String;
'astore_2
System.out.println(c); 'get_static Ljava/lang/System.out;
'aload_2
'invoke_virtual Ljava/io/PrintWriter.println(Ljava/lang/String;)V
编译器在处理string的+运算时使用的是StringBuilder如上面的字节码,
b和c的相加是通过两次调用stringbuilder.append方法实现,第一次调用时参数是"",此时stingbuilder的内容没有变化,第二次调用的参数为null,此时stringbuilder的内容为“null” ,然后调用toString方法并将结果赋值给c
参考AbstractStringBuilder的append实现
[code="java"]
public AbstractStringBuilder append(String str) {
//当参数为null时设置参数为"null"
388 if (str == null) str = "null";
389 int len = str.length();
390 if (len == 0) return this;
391 int newCount = count + len;
392 if (newCount > value.length)
393 expandCapacity(newCount);
394 str.getChars(0, len, value, count);
395 count = newCount;
396 return this;
397 }
[/code]