1. 程式人生 > >Java核心(介面、繼承和多型-多型)

Java核心(介面、繼承和多型-多型)

一、多型

    利用多型可以使程式具有良好的擴充套件性,並可以對所有類物件進行通用的處理。

    eg :定義一個平行四邊形的類 Parallelogram ,在類中頂一個 draw() 方法。

public class Parallelogram{
    //例項化儲存平行四邊形物件的陣列物件
    public void draw(Parallelogram p){        //定義 draw() 方法,引數為本類物件
        //繪圖語句
    }
}

    如果需要頂一個繪製正方形的方法,通過定義一個正方形類來處理正方形物件,會出現程式碼冗餘的缺點;通過定義一個正方形和平行四邊形的綜合類,分別處理正方形和平行四邊形物件,也沒有太大意義。

    如果定義一個四邊形類,讓它處理所有繼承該類的物件,根據“向上轉型”原則可以使每個繼承四邊形類的物件作為 draw() 方法的引數,然後在 draw() 方法中做一些限定就可以根據不同圖形類物件繪製相應的圖形,從而以更為通用的四邊形類來取代具有的正方形類和平行四邊形類。這樣處理能夠很好地解決程式碼冗餘問題,同時也易於維護,因為可以加入任何繼承父類的子類物件,而杜磊方法也無須修改。

    eg :建立 Quadrangle 類,在分別建立兩個內部類 Square 和 Parallelogramgle ,它們都繼承了 Quadrangle 類。編寫 draw() 方法,該方法接收 Quadrangle 類的物件作為引數,即使用這兩個內部類的父類作為方法引數。在主方法中分別以兩個內部類的例項物件作為引數執行 draw() 方法。

public class Quadrangle{
    //例項化儲存四邊形物件的陣列物件
    private Quadrangle[] qtest = new Quadrangle[6];
    private int nextIndex = 0 ;
    public void draw(Quadrangle q){        //定義 draw() 方法,引數為四邊形物件
        if(nextIndex < qtest.length){
        qtest[nextIndex] = q;
        System.out.println(nextIndex);
        nextIndex++;
    }
    }
    public static void main(String[] args){
        //例項化兩個四邊形物件,用於呼叫 draw() 方法
        Quadrangle q = new Quadrangle();
        q.draw(new Square());        //以正方形物件為引數呼叫 draw() 方法
        q.draw(new Parallelogramgle());        //以平行四邊形物件為引數呼叫 draw() 方法
    }
}
class Square extends Quadrangle{        //定義一個正方形類,繼承四邊形類
    public Square(){
        System.out.println("正方形");
    }
}
class Parallelogramgle extends Quadrangle{        //定義一個平行四邊形類,繼承四邊形類
    public Parallelogramgle(){
        System.out.println("平行四邊形");
    }
}

    執行結果為 :

正方形
0
平行四邊形
1
    以不同類物件為引數呼叫 draw() 方法可以處理不同的圖形問題。使用多型節省了開發和維護時間,因為程式設計師無須再所有的子類中定義執行相同功能的方法,避免了大量重複程式碼的開發,同時只要例項化一個繼承父類的子類物件即可呼叫相應的方法,這裡只要維護父類中的這個方法即可。