1. 程式人生 > 其它 >Java-類與物件-多型

Java-類與物件-多型

Java類與物件-多型

多型:類與物件三大特徵之一

 

什麼是多型?

同類型的物件,執行同一個行為,會表現出不同的行為特徵。

 

多型的形式

1、父類型別 物件名稱 = new 子類構造器();

2、介面 物件名稱 = 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();
}

 

以上就是java中類與物件的一個特徵,多型。