Java學習--多態
阿新 • • 發佈:2018-08-17
動物 靜態方法 args 擴展性 運行 宋體 tex .class cannot
1. 多態
多態:同一個對象(實物),在不同時刻體現出來的不同狀態
多態的前提:
A:要有繼承關系
B:要有方法重寫
C:要有父類引用指向子類對象
父類 f = new 子類()
多態中的成員訪問特點:
A:成員變量
編譯看左邊,運行看左邊
B:構造方法
創建子類的時候,訪問父類的構造方法,對父類的數據進行初始化
C:成員方法
編譯看左邊,運行看右邊
D:靜態方法
編譯看左邊,運行看右邊(靜態和類相關,算不上重寫,所以訪問還是左邊的)
由於成員方法存在方法重寫,所以它運行看右邊
多態的好處:
- 提高了代碼的維護性(繼承保證)
- 提高了代碼的擴展性(由多態保證)
多態的弊端:
- 不能使用子類的特有功能
把父類的引用強制裝換為子類的引用(向下轉型)
1.貓和狗多態練習
class Anamial{ public void eat(){ System.out.println("動物吃"); } } class Dog extends Anamial{ public void eat(){ System.out.println("狗吃骨頭"); } public void lookDoor(){ System.out.println("狗看門"); } } class Cat extendsAnamial{ public void eat(){ System.out.println("貓吃魚"); } public void play(){ System.out.println("狗玩遊戲"); } } class ExtendsDemo{ public static void main(String[] args){ System.out.println("Extends "); //定義動物為狗 Anamial a = new Dog(); a.eat();//a.lookDoor(); 編譯會報錯,動物沒有狗的方法 //將動物還原成狗 Dog d = (Dog)a; d.eat(); d.lookDoor();
//a變成貓 a = new Cat(); a.eat(); //a.play(); 編譯會報錯,動物沒有play方法 //將動物還原為狗 Cat c = (Cat)a; c.eat(); c.play(); //Dog dd = (Dog)a; 編譯不會報錯,運行報錯 java.lang.ClassCastException: Cat cannot be cast to Dog //不能將毛轉換成狗 } }
Java學習--多態