什么是null:Java?

Sus*_* Kr 1 java null

我正在阅读Patrick Naughton的"The Java Handbook".

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

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

页数:107段:5

Ted*_*opp 8

它是参考,而不是参考变量.作为引用类型的任何变量都可以具有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引用总是可以进行任何引用类型的扩展引用转换.

实际上,程序员可以忽略null类型,只是假装null只是一个可以是任何引用类型的特殊文字.

编辑解决你的评论:我认为"The Java Handbook"中的语言有点偏僻.该值null不是类型的引用Object; 它是null类型的引用.规范的关键点是"空引用总是可以进行扩展的引用转换为任何引用类型".从某种意义上说,这恰恰相反Object.一个Object参考是最宽的类型的参考; 该null类型是(也说一点点松散)最窄.特别是,将类型引用赋值给Object任何其他引用类型的变量是一个缩小转换,需要显式转换(并且可以引发a ClassCastException).分配null 对任何引用类型的变量的引用永远不需要强制转换,也不能引发异常.

请注意,没有命名引用类型可以具有null类型的行为.确实没有"最窄的类型",因为Java中的(命名)类型系统没有这样的东西.无法定义可分配给String变量和Double变量的引用类型.只有null类型具有该属性.引用类型转换的常规规则不允许这样做,这就是为什么它在Java语言规范中有一个单独的规则.