NULL是任何东西的实例吗?
不,没有哪种类型null是instanceof.RelationalExpression:
RelationalExpression instanceof ReferenceType
在运行时,instanceof运算符是true如果关系表达不是null引用可以转换为参考类型不提ClassCastException..否则结果是false.
这意味着对于任何类型的E和R,对任何E o,在哪里o == null, o instanceof R总是false.‘NULL’属于什么集合?还有一个特别的零类型,表达式的类型。null它没有名字。因为零类型没有名称,因此不可能声明零类型或要转换为零类型。这个null的表达式的唯一可能值。零类型。这个null引用始终可以转换为任何引用类型。实际上,程序员可以忽略零输入并假装null只是一个特殊的文字,可以是任何引用类型。什么是空?
正如上面JLS引用的那样,在实践中,您可以简单地假装它“只是一个特殊的文字,可以是任何引用类型”。
在爪哇,null == null(在其他语言中并不总是这样)。还请注意,根据合同,它还具有以下特殊属性(来自java.lang.Object):public boolean equals(Object obj)
对于任何非-null参考值x, x.equals(null)应return false.
它也是默认值(对于拥有它们的变量)所有引用类型:每个类变量、实例变量或数组组件都使用
默认值当它被创建时:对于所有引用类型,默认值为
null.
它的使用方式各不相同。您可以使用它启用所谓的延迟初始化字段,其中字段的初始值为null直到它被实际使用,在那里它被“实”值所取代(计算起来可能很昂贵)。public static Console console()
回报如果有系统控制台,则为null.
这是一个非常常见的使用模式:null用于表示对象的不存在。public String readLine() throws IOException
回报*aString包含行的内容,不包括任何行终止字符,或null如果已经到达流的末尾。
所以在这里,readLine()会回来instanceof String对于每一行,直到最后返回null意味着结束。这允许您按以下方式处理每一行:String line;while ((line = reader.readLine()) != null) {
process(line);}
可以设计API,使终止条件不依赖于readLine()回归null,但可以看出,这种设计的好处是使事情简明扼要。请注意,空行没有问题,因为空行"" != null.V get(Object key)
返回指定键映射到的值,或null如果此映射没有包含键的映射。
如果这张地图允许null值,则返回值为null不一定表示映射不包含键的映射;也可能是映射显式地将键映射到null..这个containsKey手术可以用来区分这两种情况。
在这里,我们开始看到如何使用null会使事情复杂化。第一条语句说,如果密钥没有映射,null会被归还。第二条声明说,即使映射了密钥,null能,会,可以也被归还。
相反,java.util.Hashtable通过不允许使事情变得简单null键和值V get(Object key),如果返回null,这无疑意味着密钥没有映射。
您可以阅读其余的api,并找到何处和如何。null被利用了。一定要记住,他们并不总是最佳做法例子。
一般来说,null被用作一个特殊的值来表示:未初始化状态
终止条件
不存在对象
未知值它在记忆中是如何表示的?
在爪哇?与你无关。最好保持这种状态。
是null一件好事?
这现在是主观的。有人说null导致许多本来可以避免的程序员错误。有人说用一种能捕捉到的语言NullPointerException和Java一样,使用它也很好,因为在程序员的错误上你会很快失败。有些人避免null用空对象模式等
这本身就是一个巨大的话题,所以最好把它作为另一个问题的答案来讨论。
我将以引用发明者的话来结束这件事。null他自己,C.A.R Hoare(指迅速成名的):我称它为我的数十亿美元的错误。这是人类发明的null1965年参考文献。当时,我正在用面向对象的语言(AlgolW)设计第一个用于引用的综合类型系统。我的目标是确保所有引用的使用都是绝对安全的,由编译器自动执行检查。但我无法抵挡诱惑null引用,仅仅是因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年中,它们可能造成了数十亿美元的痛苦和破坏。
这个本演讲录像更深一点,这是一个推荐的手表。