2015-02-11 56 views
1

作为每JLS 4.1是否真的很特别?

还有一个特殊的空值类型,表达空 (§3.10.7,§15.8.1),其没有名称的类型。

因为null类型没有名称,所以不可能声明空类型的 变量或转换为空类型。

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

空引用总是可以经历扩展引用转换 到任何引用类型。

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

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

null instanceof Object  //returns false 

OR

null instanceof String  //returns false 
+2

如果instanceof的第一个操作数总是为null,则'instanceof'返回'false'。 – Maroun 2015-02-11 08:10:49

+0

在您的示例中,null可以是任何类型。我不完全确定,但是如果将它们更改为'(Object)null instanceof Object'和'(String)null instanceof String'或'Object o = null; instanceof Object'和'String s = null; s instanceof String'它应该返回true。 – 2015-02-11 08:11:29

+0

它已经被回答了:http://stackoverflow.com/questions/19336608/what-does-null-mean/19336626#19336626 – alfasin 2015-02-11 08:11:42

回答

2

考虑null作为正好相反Object。任何值都可以分配给一个对象,同样任何引用类型都可以设置为nullinstanceof总是如果RHS是Object,则同样instanceof总是假如果null是LHS。从逻辑上讲,如果一种语言的结构是,所有东西都是(Object),它也应该有一个结构来定义什么都没有(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没有并且不能有任何实例。它仅仅是一个占位符,表示参考指向有效但垃圾值

1

object instanceof Type检查对象的运行时类型由参考object简称。例如,

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

instanceof查找实际的对象称为由参考和测试其运行时类型。 null没有引用堆上的实际对象,所以当然null instanceof Type必须返回false。