2015-02-11 55 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。