1

我正在阅读 Patrick Naughton 的“Java 手册”。

书上说:当你将一个变量的类型声明为一个类时,它有一个默认值,null 它是 type 的引用,Object因此与所有其他类都是类型兼容的。null对象没有价值;它与整数 0 不同,就像布尔值一样false

我无法理解/混淆突出显示的部分,它是否说这null是一个类型的变量Object

页码:107 段:5

4

2 回答 2

7

它是一个参考,而不是一个参考变量。任何作为引用类型的变量都可以具有值null。(在 Java 中,所有变量要么是引用类型,要么是原始类型(intcharfloat等)。(好吧,当您开始谈论泛型时,也有类型变量。)

这是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 语言规范中有单独的规则。

于 2012-11-17T23:45:22.253 回答
1

来自JLS

null 类型有一个值,即 null 引用,由 null 文字 null 表示,它由 ASCII 字符组成。

于 2012-11-17T23:47:34.183 回答