Java學習之 多態 Polymorphism


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

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM