<pre name="code" class="java">class Animal {
public void eat() {}
}
class Dog extends Animal {
public void eat() {
System.out.println("Dog eat");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat eat");
}
public void play() {
System.out.println("貓捉迷藏");
}
}
class DuoTaiDemo7 {
public static void main(String[] args) {
Animal a = new Dog(); //向上轉型
a.eat();
a = new Cat(); //向上轉型
a.eat();
//報錯
//a.play();
//創建子類對象
//Cat c = new Cat();
//c.play();
Cat c = (Cat)a; //<span style="color:#ff0000;"><strong>向下轉型---->爲了調用子有父沒有(cat有animal沒有)的方法。此題爲了c.play()</strong></span>
c.eat();
c.play();
//ClassCastException:類型不匹配
a = new Dog();
Dog d = (Dog)a;
a.eat();
}
}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">多態:對象在不同時刻表現出來的多種狀態。</span> 舉例:
水(水蒸氣,冰,水)
動物和狗。
動物是動物,
動物是狗。
狗是狗。
狗是動物。
Java代碼的體現:
多態的前提:
多態的前提:
A:要有繼承或者實現關係。
B:要有方法的重寫。
沒有方法重寫,繼承抽象類,或者實現接口,沒有意義。
C:要有父類(父接口)引用指向子類對象。
/*
多態:
編譯和運行的狀態不一致。 ******* !!!!注意:這些自我總結是針對多態的,平時的簡單繼承,還是先找子類再找父類!!!!*****
Fu f = new Fu(); //
Zi z = new Zi(); __________________________________//_____________________________________________________________________
| |
多態的成員特點: | |
成員變量:--------------------|--------->只找父類;若是方法中的成員變量,先找此方法所在的(子//父)類中是否有,|
編譯看左邊,運行看左邊。 | _ (有則用,無則看父有沒有//有則用,無則報錯,不能逆向去找子類了)|
成員方法(要求是重寫): | | 先找子類,再找父類。(方法中嵌套方法,也是先找子類再找父類) |
編譯看左邊,運行看右邊。--|----------| 既然成員方法重寫了,肯定依照重寫的來(重寫肯定指的是子類的方法),所以看右邊。|
| |_ 不重寫,就不符合多態了,依照原方法來,即在左邊了。|
靜態成員方法: | |
編譯看左邊,運行看左邊。--|--------->只找父類。。靜態是與類相關,而不是對象。|
| |
爲什麼呢? |_________________________________________________________________________________________________________|
因爲方法有重寫,而變量沒有。
*/
/*
多態的好處:
A:維護性(是有繼承保證)
B:擴展性(當你不知道將來使用哪個子類的時候,那麼,就把這裏傳遞父類的引用。這個時候,你將來不管傳遞哪個子類,我都可以接收)
弊端:
不能使用子類的特有功能。
多態的弊端:
不能使用子類的特有功能。
我就要使用,怎麼辦呢?
A:創建子類對象。可以解決,但是不合理。
B:多態中的轉型問題
a:向上轉型
從小到大。Dog,Cat - Animal
b:向下轉型
從大到小。Animal -- Dog,Cat
必須加強制類型轉換。
*/