null真的很特别吗?

时间:2015-02-11 08:09:21

标签: java casting null

根据JLS 4.1

  

还有一个特殊的null类型,表达式的类型为null   (§3.10.7,§15.8.1),没有名字。

     

因为null类型没有名称,所以无法声明a   null类型的变量或转换为null类型。

     

null引用是null表达式的唯一可能值   类型。

     

null引用总是可以进行扩展引用转换   任何参考类型。

     

在实践中,程序员可以忽略null类型并且只是假装    null只是一个特殊的文字,可以是任何参考   类型。

如果null真的可以是任何引用类型那么为什么IS-A测试会失败? 即。

null instanceof Object      //returns false

OR

null instanceof String      //returns false

2 个答案:

答案 0 :(得分:2)

null视为Object完全相反的。可以将任何值分配给Object,同样可以将任何引用类型设置为null。如果RHS为instanceof,则Object始终为真,如果instanceof为LHS,null总是为假。从逻辑上讲,如果一种语言的结构是所有(对象),它还应该有一个结构来定义 nothing (null)。

现在,回到原来的问题。在java中,假设你有

Object o = null,它的等效字节代码指令将是。

0: aconst_null --> Null reference is pushed onto the stack
1: astore_1    --> store a reference into local variable 1 (i.e, Object o)

所以引擎 null不同的方式处理。 System.out.println(null instanceof Object);会给出错误,因为根据语言null的语义是 nothing 并且不能有任何实例。仅仅占位符表示引用指向有效但垃圾值

答案 1 :(得分:1)

object instanceof Type检查引用 object引用的对象的运行时类型。例如,

 Animal animal = new Dog();
 animal instanceof Dog; // returns true

instanceof查找引用引用的实际对象并测试其运行时类型。 null不引用堆上的实际对象,因此当然null instanceof Type必须返回false。