声明一个变量:
private String concatenation;
会System.out.println(concatenation)
显示:
null
这是一个长度为4的字符串,而不是null
(布局类型,如null
或!null
)值。如果我对它… = "null";
进行审计,这是有道理的,但我没有。{/ p>
但如果声明为:
private String concatenation = "";
然后,System.out.println(concatenation)
会显示:
` ` // No clue how to get a space to show up in SO so I am surrounding it with ticks
为什么Java不只是将其创建为具有空字符串的Object,为什么我必须将其定义为空。
答案 0 :(得分:16)
不是"null"
,而是null
。但println
显示它是因为它被定义为这样做(见the Javadocs)。
至于为什么它没有初始化为空字符串,那是因为String
是类类型,并且对类实例的引用的默认值始终是null
。
根本没有对象(即null
)和处于“空”状态的对象之间存在很大差异。
答案 1 :(得分:1)
这是因为这是println系统工作的方式 - >当发送给它的对象为null(或者它没有当前引用的引用)时,它会输出null
你可以写一遍:
String concatenation = null;
System.out.println(concatenation ==null ? "" : concatenation )
这是向println函数发送一个空字符串而不是null。仅供参考:该函数实际上在大多数对象上调用toString来获取应该显示的内容,除非它自己的对象是一个字符串。
更多理论,试试:
System.out.println(concatenation == null);
看看会发生什么。 - (jlordo)
答案 2 :(得分:0)
如前所述,String是一个类,变量连接是一个引用变量,引用变量的默认值为null,这个输出告诉你,无论是什么引用变量,它都没有初始化,指向没有对象,所以空string!= null,这是两个不同的值,表示不同的东西。我想如果它在哪里自动创建一个空字符串,它就会创建不必要的对象..
答案 3 :(得分:-1)
String不是一个对象,它是一个类。如果您想要创建一个对象,它就像任何其他类一样需要它。举个例子,如果你做了:
int i;
你最终必须初始化并为i设置一个值。就像String一样。你不能让一个持有NULL的对象(在内存中没有分配特定的位置),这将告诉程序该对象内没有这样的内存。这就是你打印出来的原因。如果你做“”,它是空白的,但它也被初始化,因为对象在内存系统中有一个点放置“”,并最终搜索和访问。我在整个Java编程中都遇到过这方面的困难,但我最终了解到如果我将我的字符串,int(s)等初始化(稍后将值设置为对象以供内存引用)那么什么都不会导致问题