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