Dog d = new Dog(); Pet p = d; Object o = p; 經過多次向上轉型後,o instanceof Dog 為何仍返回 true?引用類型明明是 Object。
Dog d = new Dog(); // 1. 堆中創建 Dog 對象,d 存地址,聲明類型 Dog
Pet p = d; // 2. p 複製 d 的地址,聲明類型 Pet(向上轉型)
Object o = p; // 3. o 複製 p 的地址,聲明類型 Object(再次向上轉型)
堆中只有一個 Dog 對象,三個引用指向同一地址。對象頭的 Klass Pointer 始終指向 Dog.class 元數據,不會隨引用轉型改變。
Dog)。Dog)或其父類/實現接口。true。所以 instanceof 檢查的是運行時對象的真實類型,而非引用的聲明類型。
| 引用 | 聲明類型 (編譯時) | 指向對象真實類型 (運行時) |
|---|---|---|
| d | Dog | Dog |
| p | Pet | Dog |
| o | Object | Dog |
instanceof 守護防 ClassCastException。o.toString())靠動態分發,也是基於真實類型。