javaSE-多型-運算子instanceof-向下轉型時動態判斷
阿新 • • 發佈:2022-04-15
一、運算子:instanceof (執行階段動態判斷)
- 1、instanceof可以在執行階段動態判斷引用指向的物件的型別。
- 2、instanceof的語法:(引用 instanceof 型別)
- 3、instanceof運算子的運算結果只能是:true/false
- 4、c是一個引用,c變數儲存了記憶體地址指向了堆中的物件。
- 假設:(c instanceof Cat)結果為:true,表示c引用指向的堆記憶體中的java物件是一隻cat
- (c instanceof Cat)結果為:false,表示c引用指向的堆記憶體中的java物件不是一隻cat
- 5、要養成一個好習慣:任何時候,任何地點,對型別進行向下轉型時,一定要使用
- instanceof 運算子進行判斷。(java規範中要求的。)這樣可以很好的避免:ClassCastException(類轉換異常)
二、多型的基礎語法
2-1、向上轉型和向下轉型的概念。
- 向上轉型:子--->父 (upcasting)------->又被稱為自動型別轉換:Animal a = new Cat();
- 向下轉型:父--->子 (downcasting)------>又被稱為強制型別轉換:Cat c = (Cat)a; 需要新增強制型別轉換符。
- 什麼時候需要向下轉型?
- 需要呼叫或者執行子類物件中特有的方法。必須進行向下轉型,才可以呼叫。
- 向下轉型有風險嗎?
- 容易出現ClassCastException(型別轉換異常)
- 怎麼避免這個風險?
- instanceof運算子,可以在程式執行階段動態的判斷某個引用指向的物件:是否為某一種型別。
- 養成習慣,向下轉型之前一定要使用instanceof運算子進行判斷。
- 不管是向上轉型還是向下轉型,首先他們之間必須有繼承關係,這樣編譯器就不會報錯。
2-2/什麼是多型。
- 多種形態,多種狀態,編譯和執行有兩個不同的狀態。
- 編譯期叫做靜態繫結。
- 執行期叫做動態繫結。
- Animal a = new Cat();
- 編譯的時候編譯器發現a的型別是Animal,所以編譯器會去Animal類中找move()方法
- 找到了,繫結,編譯通過。但是執行的時候和底層堆記憶體當中的實際物件有關
- 真正執行的時候會自動呼叫“堆記憶體中真實物件”的相關方法。
- a.move();
- 多型的典型程式碼:父型別的引用指向子型別的物件。(java中允許這樣寫程式碼)