1. 程式人生 > 其它 >javaSE-多型-運算子instanceof-向下轉型時動態判斷

javaSE-多型-運算子instanceof-向下轉型時動態判斷

一、運算子: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中允許這樣寫程式碼)