Java中面向對象三大特性之——多態


多態的概述: 

多態是繼封裝、繼承之后,面向對象的第三大特性。

生活中,比如跑的動作,小貓、小狗和大象,跑起來是不一樣的。再比如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,通過不同的事物,可以體現出來的不同的形態。多態,描述的就是這樣的狀態。

 

多態的條件

1.繼承

 

2.方法的重寫 (為了讓多態有意義)

3.父類的引用指向子類的對象

 

多態的體現

 

父類類型 變量名 = new 子類對象;
變量名.方法名();

 

當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫后方法。

舉例代碼

定義父類:

public abstract class Animal {  
    public abstract void eat();  
}  

定義子類:

class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃魚");  
    }  
}  

class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨頭");  
    }  
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態形式,創建對象
        Animal a1 = new Cat();  
        // 調用的是 Cat 的 eat
        a1.eat();          

        // 多態形式,創建對象
        Animal a2 = new Dog(); 
        // 調用的是 Dog 的 eat
        a2.eat();               
    }  
}

多態的好處

實際開發的過程中,父類類型作為方法形式參數,傳遞子類對象給方法,進行方法的調用,更能體現出多態的擴展性與便利。

舉例代碼

定義父類:

 

public abstract class Animal {  
    public abstract void eat();  
}  

 

定義子類:

class Cat extends Animal {  
    public void eat() {  
        System.out.println("吃魚");  
    }  
}  

class Dog extends Animal {  
    public void eat() {  
        System.out.println("吃骨頭");  
    }  
}

定義測試類:

public class Test {
    public static void main(String[] args) {
        // 多態形式,創建對象
        Cat c = new Cat();  
        Dog d = new Dog(); 

        // 調用showCatEat 
        showCatEat(c);
        // 調用showDogEat 
        showDogEat(d); 

        /*
        以上兩個方法, 均可以被showAnimalEat(Animal a)方法所替代
        而執行效果一致
        */
        showAnimalEat(c);
        showAnimalEat(d); 
    }

    public static void showCatEat (Cat c){
        c.eat(); 
    }

    public static void showDogEat (Dog d){
        d.eat();
    }

    public static void showAnimalEat (Animal a){
        a.eat();
    }
}

 

多態成員的訪問特點:

訪問成員變量: 編譯看左邊,運行看左邊

訪問成員方法:

非靜態成員方法: 編譯看左邊,運行看右邊

靜態成員方法:  編譯看左邊,運行看左邊

記憶: 只有非靜態成員方法才會編譯看左邊,運行看右邊,其他的都是編譯看左邊,運行看左邊

 

多態的好處

使用父類類型作為方法的參數,可以接收該類所有的子類對象

tips: 如果方法的參數是Object類型,那么就可以接收任意類的對象

 

多態的弊端

無法調用子類特有的方法

(關於如何解決多態的弊端,可以看下一章引用類型的轉換

 

 

 


免責聲明!

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



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