多態的概述:
多態是繼封裝、繼承之后,面向對象的第三大特性。
生活中,比如跑的動作,小貓、小狗和大象,跑起來是不一樣的。再比如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,通過不同的事物,可以體現出來的不同的形態。多態,描述的就是這樣的狀態。
多態的條件
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類型,那么就可以接收任意類的對象
多態的弊端
無法調用子類特有的方法
(關於如何解決多態的弊端,可以看下一章引用類型的轉換)
