null 是任何事物的实例吗?
不,没有类型 null 是 instanceof。
RelationalExpression:
RelationalExpression instanceof ReferenceType
在运行时,如果 RelationalExpression 的值不是 null 并且引用可以转换为 ReferenceTypeinstanceof 运算符的结果是 true /em> 没有提出ClassCastException。否则结果为false。
这意味着对于任何类型E 和R,对于任何E o,其中o == null、o instanceof R 始终是false。
'null'属于什么集合?
还有一个特殊的null类型,表达式null的类型,它没有名字。因为 null 类型没有名称,所以无法声明 null 类型的变量或强制转换为 null 类型。 null 引用是 null 类型表达式的唯一可能值。 null 引用始终可以转换为任何引用类型。在实践中,程序员可以忽略 null 类型,只是假装null 只是一个可以是任何引用类型的特殊文字。
什么是空?
正如上面引用的 JLS 所说,在实践中,您可以简单地假装它“只是一个可以是任何引用类型的特殊文字”。
在 Java 中,null == null(在其他语言中并非总是如此)。另请注意,根据合同,它还具有此特殊属性(来自java.lang.Object):
public boolean equals(Object obj)
对于任何非null 的参考值x,x.equals(null) 应该是return false。
它也是所有引用类型的默认值(对于拥有它们的变量):
- 每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化:
它的使用方式各不相同。您可以使用它来启用所谓的延迟初始化字段,其中字段的初始值为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。第二条语句表示即使key被映射,null也可以返回。
相比之下,java.util.Hashtable 不允许使用 null 键和值,从而使事情变得更简单;它的V get(Object key),如果返回null,则明确表示该键未映射。
您可以通读其余的 API 并了解 null 的使用位置和方式。请记住,它们并不总是最佳实践示例。
一般来说,null 用作特殊值来表示:
它在内存中是如何表示的?
在 Java 中?不关你的事。最好保持这种状态。
null 是个好东西吗?
现在这是边缘主观的。有人说null 会导致许多本来可以避免的程序员错误。有人说,在像 Java 这样可以捕获NullPointerException 的语言中,最好使用它,因为您将在程序员错误时快速失败。有些人通过使用Null object pattern等来避免null。
这本身就是一个巨大的话题,因此最好将其作为另一个问题的答案来讨论。
我将引用null 的发明者本人C.A.R Hoare(以快速排序闻名)的话来结束这篇文章:
我称其为我的十亿美元错误。这是 1965 年 null 引用的发明。当时,我正在为面向对象中的引用设计第一个综合类型系统语言 (ALGOL W)。我的目标是确保所有引用的使用都应该是绝对安全的,并由编译器自动执行检查。但我无法抗拒加入null 引用的诱惑,仅仅是因为它很容易实现。这导致了无数错误、漏洞和系统崩溃,在过去 40 年中可能造成了 10 亿美元的痛苦和损失。
video of this presentation 更深;这是推荐的手表。