根据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
答案 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。