Java-類與物件-多型
阿新 • • 發佈:2022-04-21
多型:類與物件三大特徵之一
什麼是多型?
同類型的物件,執行同一個行為,會表現出不同的行為特徵。
多型的形式
1、父類型別 物件名稱 = new 子類構造器();
以下為例:
/*
* 此例中
* Animal為抽象父類 有一個抽象方法shout()
* Dog為繼承Animal的一個子類 重寫了shout()
並有獨有方法 watchDoor()
Cat為繼承Animal的另一個子類 重寫了shout()
並有獨有方法 catWalk()
**/
Animal a = new Dog(); // 這裡a就是一個形式的多型
多型成員的訪問特點
方法呼叫:編譯時看父類是否有該方法,執行時訪問子類中的此方法。
編譯看‘左邊‘,執行看’右邊‘。
變數呼叫:編譯時看父類是否有該變數,執行時也訪問父類中的此變數。
編譯看‘左邊‘,執行也看’左邊‘。
==> 多型側重行為的多型(變數(屬性)沒有多型)。
多型的優勢
1、便於程式碼的擴充套件和維護。
2、定義方法(函式)時,使用父型別作為引數,該方法就可以接收這個父類的一切子類物件,使操作更加便捷。
以下為例:
/*
* 此例中
* Animal為抽象父類 有一個抽象方法shout()
* Dog為繼承Animal的一個子類 重寫了shout()
* Cat為繼承Animal的另一個子類 重寫了shout()
**/
public static void main(String[] args) {
Dog d = new Dog();
Cat c = new Cat();
compete(d);
compete(c);
}
public static void compete(Animal a) { // 傳參時形參可以是父類
a.shout();
}
多型存在的問題
多型不能使用子類的獨有功能。
在多型下想要使用子類的獨有方法怎麼辦呢?
這就引入了多型中的型別轉換,將父型別強制型別轉換成子類後,即可實現該目的。
多型中的型別轉換
1、自動型別轉換 (子類到父類)
2、強制型別轉換 (父類到子類) ==> 解決了多型中存在的問題,強轉後可以呼叫子類的獨有功能
子類名稱 子類物件名 = (子類名稱) 多型物件;
這種操作可能由於編寫者的疏忽並且編譯器編譯不會提示錯誤,若將一個非本子類的多型物件賦給該子類,執行時便會報錯。
為了解決這一問題,通常在強制轉換之前先用instanceof判斷是否正確。
以下為例:
/*
* 此例中
* Animal為抽象父類 有一個抽象方法shout()
* Dog為繼承Animal的一個子類 重寫了shout()
並有獨有方法 watchDoor()
Cat為繼承Animal的另一個子類 重寫了shout()
並有獨有方法 catWalk()
**/
Animal d = new Dog(); // 構建多型物件d
Animal c = new Cat(); // 構建多型物件c
Cat c2 = (Cat) c; // 將c有Animal類強制轉換成Cat類,使其可以呼叫Cat的獨有方法
c.catwalk(); // 錯,多型不能使用子類的獨有功能。
c2.catwalk(); // 對。
if (c instanceof Cat) { // 為避免錯誤最好先判斷其正確性
Cat c2 = (Cat) c;
c2.catwalk();
}