全文详见个人博客:https://www.coderli.com/null-string/ 未初始化的String相 "+" 为什么会打印出“nullnull"今天在我的一个qq群里有人问了这样一个问题。 private static String a; private static String b; public static void main(String[] args) { String c = a+b; System.out.println(c); } 输出是nullnull。问为什么是这样。 其实问题并不复杂,很多同学也觉得自己知道原因,遂不予关注。但是我相信还是有初学Java的同学在这里是存在误会的。很典型的误会就是如一个群里的朋友说的String类型的变量如果没有显示初始化,默认的值就是”null”。支持的理由就是 private static String a; public static void main(String[] args) { System.out.println(a); } 输出是null。 这个现象确实很容易迷惑一些初学的人,包括我也忽略了挺久。其实呢证明这种想法错误很简单。如果默认值是null,那么就意味着,该变量不是空(null)。而是字符串的“null”。 private static String a; public static void main(String[] args) { System.out.println(a==null); System.out.println("null".equals(a)); } 上述代码输出分别是true,false。(呵呵,挺弱智的。) 说明String类型变量a,其实是空(null),而并没有被赋值。那么打印出null是为什么呢?我们查看PrintStream的源码就很清晰的明白了,其实是Java在println的时候进行了处理。 public void print(String s) { if (s == null) { s = "null"; } write(s); } 回到开头的问题,既然没有初始化赋值,那么输出为什么是”nullnull“,两个”null“连接的结果呢。这里略微细说一下,查看编译过的class文件,我们可以看到 public