我正在阅读 Patrick Naughton 的“Java 手册”。
书上说:当你将一个变量的类型声明为一个类时,它有一个默认值,null
它是 type 的引用,Object
因此与所有其他类都是类型兼容的。null
对象没有价值;它与整数 0 不同,就像布尔值一样false
。
我无法理解/混淆突出显示的部分,它是否说这null
是一个类型的变量Object
?
页码:107 段:5
它是一个参考值,而不是一个参考变量。任何作为引用类型的变量都可以具有值null。(在 Java 中,所有变量要么是引用类型,要么是原始类型(int
、char
、float
等)。(好吧,当您开始谈论泛型时,也有类型变量。)
这是Java 语言规范的相关部分:
Java 编程语言中有两种类型:原始类型(第 4.2 节)和引用类型(第 4.3 节)。相应地,有两种数据值可以存储在变量中、作为参数传递、由方法返回并对其进行操作:原始值(第 4.2 节)和参考值(第 4.3 节)。
还有一种特殊的 null 类型,即表达式 null 的类型(第 3.10.7 节、第 15.8.1 节),它没有名称。
因为 null 类型没有名字,所以不可能声明一个 null 类型的变量或强制转换为 null 类型。
空引用是空类型表达式的唯一可能值。
空引用始终可以进行扩展引用转换为任何引用类型。
在实践中,程序员可以忽略 null 类型,只是假装 null 只是一个可以是任何引用类型的特殊文字。
编辑解决您的评论:我认为“Java 手册”中的语言有点离题。该值null
不是 type 的引用Object
;它是空类型的引用。规范中的关键点是“空引用总是可以经历扩大的引用转换为任何引用类型”。从某种意义上说,这恰恰相反Object
。参考是最广泛的Object
参考类型;类型是null
(也有点松散地说)最窄的。特别是,将类型的引用分配给Object
任何其他引用类型的变量是一种缩小转换,需要显式强制转换(并且可以引发 a ClassCastException
)。分配null
对任何引用类型的变量的引用从不需要强制转换,也不能引发异常。
请注意,没有命名引用类型可以具有 null 类型的行为。确实没有“最窄类型”,因为 Java 中的(命名)类型系统没有这样的东西。不可能定义一个既可分配给String
变量又可分配给变量的引用类型Double
。只有 null 类型具有该属性。引用类型转换的常规规则不允许这样做,这就是为什么它在 Java 语言规范中有单独的规则。
来自JLS:
null 类型有一个值,即 null 引用,由 null 文字 null 表示,它由 ASCII 字符组成。