不同的物件,接受到相同的訊息,產生的響應不同就是多型。
多型的前提:
必須是類與類之間有關係。要麼繼承,要麼實現。
通常還有乙個前提:存在覆蓋。
多型的好處:
1.可替換性(substitutability)。多型對已存在**具有可替換性。例如,多型對圓circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。
2.可擴充性(extensibility)。多型對**具有可擴充性。增加新的子類不影響已存在類的多型性、繼承性,以及其他特性的執行和操作。實際上新加子類更容易獲得多型功能。例如,在實現了圓錐、半圓錐以及半球體的多型基礎上,很容易增添球體類的多型性。
3.介面性(inte***ce-ability)。多型是超類通過方法簽名,向子類提供了乙個共同介面,由子類來完善或者覆蓋它而實現的。如圖8.3所示。圖中超類shape規定了兩個實現多型的介面方法,computearea()以及computevolume()。子類,如circle和sphere為了實現多型,完善或者覆蓋這兩個介面方法。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。
5.簡化性(simplicity)。多型簡化對應用軟體的**編寫和修改過程,尤其在處理大量物件的運算和操作時,這個特點尤為突出和重要
多型的體現:重寫,過載等。
重寫和過載的區別:
方法的重寫(override)
在子類繼承父類時,子類的方法和父類的方法相同(訪問修飾符,返回值型別,方法名,引數列表),方法體不同,一般是父類的該方法滿足不了子類的需求所以才發生重寫。這種子類的方法將父類的方法覆蓋叫做重寫。
方法的過載(overload)
在同乙個類中,有著相同的方法名但是引數的資料型別或者引數的個數不同這兩個方法就是過載。過載的目的:節省類中的命名資源和提高**的可讀性
比如說動物都有「叫」的方法,但是狗是「汪汪」,而貓是「喵喵」,當它們接收到被打的訊息時,所做的響應是不同的。
案例:打動物
定義乙個動物類,實現「叫」的方法
public class animal
}
定義乙個狗類,繼承自動物類,重寫「叫」的方法
public class dog extends animal
}
定義乙個貓類
public class cat extends animal
}
測試程式
public class test
private static void hit(cat c)
private static void hit(dog d)
}
在測試程式中定義了兩個「打」的方法,這種做法是比較笨拙的,有幾種動物就需要定義幾個方法,這個可能沒完沒了。有沒有乙個一勞永逸的方法?
不要傳遞dog或者cat等物件,而是傳遞乙個animal類物件就可以解決上面的問題。測試程式修改為
public class test
private static void hit(animal a)
}
這裡涉及兩個知識點:
(1)賦值相容性規則
hit方法形參是animal型別,而實參是dog或者cat,所以型別不一致,為什麼還可以呢?
所謂賦值相容性規則,指的是凡是需要用到父類引用的地方,都可以使用它的子類引用去代替。比如某人請求派車接他,結果對方派了個三輪車去接了,雖然他可能不滿意,但是也沒有辦法,因為對方是按照他的要求做的。
(2)多型
形參一定是父類的引用,而實參可以是它的任何乙個子類的引用。
Java學習 物件導向的三大特徵之一
在多型中,成員函式有以下特點 1.在編譯時期 參閱引用型變數所屬的類中是否有 呼叫的方法。如果有,編譯通過,沒有,編譯失敗。2.在執行時期 參閱物件所屬的類中是否有呼叫的方法。簡單總結就是 成員函式在多型呼叫時,編譯看左邊,執行看右邊。在多型中,成員變數的特點 無論編譯和執行,都參考左邊 引用型變數...
物件導向三大特徵之一 繼承
概述 多個類中存在相同的屬性和行為時,我們可以將這些內容抽取到單獨的乙個類中,那麼多個類就無需在定義這些屬性和行為,只要去繼承這個單獨的類即可。其中,多個類稱為子類或者派生類,單獨的那乙個類稱為父類,超類,基類 繼承描述的是事物之間的所屬關係,這種關係是 is a關係。在繼承關係中,子類就是乙個父類...
物件導向三大特徵之一繼承
繼承 類似於現實世界中的子承父業,實現字段 屬性 方法 構造方法例外 的繼承,但私有的是無法訪問的,將類和類之間進行關聯,增加系統的耦合性,被繼承的類 父類或基類,繼承的類 子類或派生類。重用性 子類繼承父類的非私有的成員 例子 class people public string name pub...