Java學習之多態
多態的概念
多態==晚綁定。
不要把函數重載理解為多態。
因為多態是一種運行期的行為,不是編譯期的行為。
多態:父類型的引用可以指向子類型的對象。
比如 Parent p = new Child();
當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;
如果有,再去調用子類的該同名方法。
(注意此處,靜態static方法屬於特殊情況,靜態方法只能繼承,不能重寫Override,如果子類中定義了同名同形式的靜態方法,它對父類方法只起到隱藏的作用。調用的時候用誰的引用,則調用誰的版本。)
(參考學習鏈接:http://docs.oracle.com/javase/tutorial/java/IandI/override.html)
如果想要調用子類中有而父類中沒有的方法,需要進行強制類型轉換,如上面的例子中,將p轉換為子類Child類型的引用。
因為當用父類的引用指向子類的對象,用父類引用調用方法時,找不到父類中不存在的方法。這時候需要進行向下的類型轉換,將父類引用轉換為子類引用。
結合實例說明
下面舉個例子(有問題的代碼已注釋):
主要講講兩種類型轉換和兩種編譯時候的錯誤。

public class PolyTest { public static void main(String[] args) { //向上類型轉換 Cat cat = new Cat(); Animal animal = cat; animal.sing(); //向下類型轉換 Animal a = new Cat(); Cat c = (Cat)a; c.sing(); c.eat(); //編譯錯誤 //用父類引用調用父類不存在的方法 //Animal a1 = new Cat(); //a1.eat(); //編譯錯誤 //向下類型轉換時只能轉向指向的對象類型 //Animal a2 = new Cat(); //Cat c2 = (Dog)a2; } } class Animal { public void sing() { System.out.println("Animal is singing!"); } } class Dog extends Animal { public void sing() { System.out.println("Dog is singing!"); } } class Cat extends Animal { public void sing() { System.out.println("Cat is singing!"); } public void eat() { System.out.println("Cat is eating!"); } }
例子的執行結果:
這段代碼:
Cat類中定義了eat()方法,但是Animal類中沒有這個方法,a1引用是Animal類的,所以找不到,編譯時出錯:
兩種類型的類型轉換
(1)向上類型轉換(Upcast):將子類型轉換為父類型。
對於向上的類型轉換,不需要顯示指定,即不需要加上前面的小括號和父類類型名。
(2)向下類型轉換(Downcast):將父類型轉換為子類型。
對於向下的類型轉換,必須要顯式指定,即必須要使用強制類型轉換。
並且父類型的引用必須指向子類的對象,即指向誰才能轉換成誰。
不然也會編譯出錯:
因為父類引用指向的是Cat類的對象,而要強制轉換成Dog類,這是不可能的。
多態學習的第二部分,抽象類和接口:http://www.cnblogs.com/mengdd/archive/2012/12/25/2832656.html