什么是null:Java?

时间:2012-11-17 23:44:19

标签: java null

我正在阅读Patrick Naughton的“The Java Handbook”。

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

我无法理解/混淆突出显示的部分,是否说nullObject类型的变量?

第页:107 para:5

2 个答案:

答案 0 :(得分:8)

它是引用,而不是引用变量。作为引用类型的任何变量都可以具有值 null 。 (在Java中,所有变量都是引用类型或基本类型(intcharfloat等)。(当你开始讨论时,还有类型变量)泛型。)

以下是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字符组成。