Java中的null是什么?

问题:

什么是null
null是否是任何事情?
null属于哪一套?
在记忆中如何表现?

回答:

没有任何东西的实例?

不,没有nullinstanceof的类型

15.20.2类型比较运算符<代码>的instanceof

在运行时,如果RelationalExpression的值不是null,并且引用可以转换为ReferenceType而不提高ClassCastException,则instanceof运算符的结果为true。否则结果是false

这意味着对于任何类型ER,对于任何E o,其中o == nullo instanceof R总是false

什么设置“null”属于?

JLS 4.1类型和价值的种类< / A>

还有一个特殊的null类型,表达式null的类型没有名称。因为null类型没有名称,所以不可能声明一个null类型的变量或者转换为null类型。 null引用是null类型的表达式的唯一可能值。 null引用始终可以转换为任何引用类型。实际上,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字。

什么是null

正如上面的JLS引用所说,实际上你可以简单地假装它只是一个可以是任何引用类型的特殊文字。
在Java中,null == null(其他语言并不总是如此)。还要注意,通过合同,它也有这个特殊的属性(从
java.lang.Object):

 public boolean equals(Object obj)
对于任何非null参考值xx.equals(null)应该return false

对于所有引用类型,它也是default value(有变量))

JLS 4.12.5初始值的变量

这是如何使用的不同。您可以使用它来启用所谓的lazy initialization字段,其中一个字段的初始值为null,直到实际使用为止,其中它被“真实”值替代(计算可能会昂贵)。
还有其他用途。我们来看看java.lang.System的一个真实的例子

 public static Console console()
 返回:系统控制台(如果有)否则null

这是一个非常常见的使用模式:null用于表示对象的不存在。
这是另一个使用示例,这次是从java.io.BufferedReader

 public String readLine() throws IOException
 返回:包含行的内容(不包括任何行终止字符)的String,如果已达到流的末尾,则为null

所以这里,readLine()将返回每一行的instanceof String,直到它最终返回一个null来表示结束。这样可以按如下方式处理每一行:

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

可以设计API,使得终止条件不依赖于readLine()返回null,但是可以看出,这种设计有利于使事情简明扼要。请注意,空行没有问题,因为空行"" != null
让我们再来一个例子,这次从java.util.Map<K,V>

 V get(Object key)
返回指定键映射到的值,如果此映射不包含键的映射,则返回null
如果此映射允许null值,则返回值null不一定表示该映射不包含该键的映射;地图也可能将密钥明确地映射到null。可以使用containsKey操作来区分这两种情况。

在这里,我们开始看到使用null如何使事情变得复杂化。第一个语句说如果没有映射密钥,则返回null。第二个声明说,即使映射了密钥,也可以返回null also
相反,java.util.Hashtable通过不允许null键和值来使事情更简单;其V get(Object key),如果返回null,明确地表示该键未映射。
您可以阅读其余的API,并查找使用null的位置和方式。请记住,他们并不总是best practice的例子。
一般来说,null被用作一个特殊的值来表示:

  • 未初始化状态
  • 终止条件
  • 不存在的对象
  • 一个未知的值

在记忆中如何表现?

在Java中?没有你的关心。最好保持这种方式。

这是现在的主观主义。有些人说null导致许多程序员的错误,这是可以避免的。有些人说,用Java来捕获NullPointerException的语言,使用它很好,因为程序员错误会失败。有些人通过使用Null object pattern等来避免null
这是一个很大的话题,所以最好的讨论是回答另一个问题。
我将以null发明者自己的发言人C.A.R Hoare(快速报名)的结尾作为结论:

 我称之为我十亿美元的错误。 1965年是null参考的发明。当时,我正在设计第一个面向对象语言(ALGOL W)的综合类型系统。我的目标是确保所有使用引用都应该是绝对安全的,并且由编译器自动执行检查。但是我无法抗拒引用null参考的诱惑,只是因为它很容易实现。这导致了无数的错误,漏洞和系统崩溃,这可能在过去四十年中造成了十亿美元的痛苦和破坏。

video of this presentation越深;这是推荐的手表。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: What is null in Java?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

7 + 3 =