Javaoop4

多態

Java面向對象三大特性之多態
生活中: 同一種事物,由於條件不同,產生的結果也不同
編程中多態:同一個引用類型,使用不同的實例而執行不同操作
多態的前提:
1.繼承或實現(後面講接口)關係
2.父類的引用,或接口的應用(後面講接口)指向子類對象
3.方法的重寫
允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行爲(發送消息就是函數調用)

在使用成員方法時:
父類引用指向子類
1.如果父類有此方法,子類沒有,調用父類的
2.如果父類有,子類重寫,調用子類的
3.如果父類沒有,子類有,報錯,需要強轉

例:

`
package jicheng;

public class Animal {

public String type;
public String voice;
public  void shout(){
    System.out.println("動物太多,我不知道該怎麼叫");
};
public  void say(){
    System.out.println("我是動物");
};

}

package jicheng;

public class Wolf extends Animal {

@Override
public void shout() {
    System.out.println("哇嗚");

}
public static void main(String[] args) {

    Wolf w=new Wolf();
    w.shout();
}

public void sing(){

    System.out.println("狼愛上羊啊,愛的瘋狂");
}

}

package Test;

import jicheng.Animal;
import jicheng.Wolf;

public class testDuotai {

public static void main(String[] args) {
    //1.如果父類有,子類沒有      調用繼承父類
    Animal an1=new Wolf();
    an1.say();
    //2.如果父類有,子類重寫,調用子類的
    Animal an2=new Wolf();
    an2.shout();
    //3.如果父類沒有,子類有      報錯,需要強轉
    /**
     * Animal an3=new Wolf();
     * an3.sing();
     */
    Animal an3=new Wolf();
    //添加強轉,避免報錯 方法1.
    if(an3 instanceof Wolf){
        Wolf w=(Wolf)an3;
        w.sing();
    }
    //方法2.
    if(Wolf.class==an3.getClass()){
        Wolf w=(Wolf)an3;
        w.sing();
    }
}

}`

上面這個例子,是我在上一節例子上修改了幾個類得到的,簡單實現了父類引用指向子類,調用成員方法的3種情況
需要注意的是:強轉的風險,一般情況下,強轉可能出現問題,我們需要提前類型判斷是否可以強轉。
這裏可以用兩種方法:
1.判斷類名。class和對象。getclass是否相等
2.InstanceOf

成員變量
1.父類有,子類沒有 調用父類的
2.父類有,子類有 調用父類的
3.父類沒有,子類有 報錯

關於成員變量,讀者可以自行測試,類似上面的代碼簡單實現。

以上就是多態,可能在這有人不明白,爲什麼要使用多態?多態有什麼好處?

爲什麼要用多態呢?
原因:我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是爲了——代碼重用。而多態除了代碼的複用性外,還可以解決項目中緊偶合的問題,提高程序的可擴展性.。耦合度講的是模塊模塊之間,代碼代碼之間的關聯度,通過對系統的分析把他分解成一個一個子模塊,子模塊提供穩定的接口,達到降低系統耦合度的的目的,模塊模塊之間儘量使用模塊接口訪問,而不是隨意引用其他模塊的成員變量。

多態有什麼好處?
有兩個好處:
1. 應用程序不必爲每一個派生類編寫功能調用,只需要對抽象基類進行處理即可。大大提高程序的可複用性。//繼承
2. 派生類的功能可以被基類的方法或引用變量所調用,這叫向後兼容,可以提高可擴充性和可維護性。 //多態的真正作用,

多態在什麼地方用?
可以用在方法的參數中和方法的返回類型中。

這節就這些吧,至此面向對象三大特性已經結束,如果仍然感到很困惑,不明白爲什麼要出現這東西。。。等等問題,可以網上再找資料,或者不妨暫時放下,只要現在能代碼實現,等下節抽象類和接口講完再回過頭來看看這些,或許會有更深層次的體會。

最後吐槽一下markdown語法,不知道爲啥,代碼標籤有時候生效,大部分情況無效,很頭痛。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章