1

像这样声明一个变量:

private String concatenation;

System.out.println(concatenation)显示这个:

null

这将是一个长度为 4 的字符串,而不是null(布尔类型,如nullor !null)值。如果我将它删除,这将是有道理的… = "null";,但我没有。

但如果它被声明为:

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不只是将它创建为带有空字符串的对象,为什么我必须将其定义为空。

4

4 回答 4

16

不是"null",是null。但是println这样显示它是因为它被定义为这样做(请参阅Javadocs)。

至于为什么不初始化为空字符串,那是因为String是类类型,而对类实例的引用的默认值是 always null

null根本没有对象(即)与处于“空”状态的对象之间存在很大差异。

于 2013-06-09T20:24:31.720 回答
1

这是因为这是系统输出 println 的工作方式->当发送给它的对象为空(或其没有当前引用的引用)时,它会打印空

你可以重写它:

String concatenation = null;
System.out.println(concatenation ==null ? "" : concatenation )

这是向 println 函数发送一个空字符串而不是 null。仅供参考:该函数实际上在大多数对象上调用 toString 以获取应显示的内容,除非它自己的对象是 string 。

更多理论,请尝试:

System.out.println(concatenation == null);

看看会发生什么。–(杰洛多)

于 2013-06-09T20:30:45.117 回答
0

如前所述,String 是一个类,变量连接是一个引用变量,引用变量的默认值为 null,看到这个输出告诉你,无论是什么引用变量,它没有初始化,都指向没有对象,所以一个空字符串!= null,这是两个不同的值,意味着不同的东西。我认为如果它在哪里自动创建一个空字符串,它将创建不必要的对象..

于 2013-06-09T21:50:18.600 回答
-1

String 不是一个对象,它是一个类。如果你想创建一个对象,它就像任何其他类一样需要它。一个例子,如果你这样做:

int i;

您最终将不得不为 i 初始化并设置一个值。就像字符串一样。你不能有一个持有 NULL 的对象(在内存中没有分配特定的位置),这将告诉程序该对象内没有这样的内存。这就是为什么你会得到 null 被打印出来。如果你做“”,它是空白的,但是,它也会被初始化,因为对象在内存系统中有一个位置用于放置“”,并最终在以后搜索和访问。在我的 Java 编程过程中,我遇到了一些困难,但我最终了解到,如果我初始化了我的字符串、int(s) 等(为对象设置一个值以便稍后进行内存引用),那么什么都不会导致问题

于 2013-06-09T20:43:07.497 回答