1. 程式人生 > >面向物件的幾大特性;多型(過載和覆蓋)

面向物件的幾大特性;多型(過載和覆蓋)

1)面向物件有哪些特徵呢?
一般來說,面向物件有三大特性,封裝、繼承和多型。其實按理說還應該有一個:抽象。
①封裝:封裝是指將客觀事物抽象成類,每個類對自身的資料和方法實行保護。類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏。
②繼承:繼承是一個聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程叫做類繼承。新類繼承了原始
類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且派生類可以修改或增加新的方法使之更合適特殊的
需要。
繼承特性:(1)java不支援多重繼承,通過介面實現多重繼承的目的。
 (2)子類只繼承父類的非私有(public 與 protected)成員變數與方法。
 (3)當子類中定義的成員變數和父類中定義的成員變數同名和方法有相同方法簽名(同名、同參數列表)時,子類覆蓋父類變數和方法,沒有繼承。
③多型:多型是指允許不同類的物件對同一訊息作出響應。多型包括引數化多型和包含多型。多型語言具有靈活、抽象、行為共享、程式碼共享等優勢,很好地解決了應用程式函式的同名
問題。 
引數多型(parametric),採用引數化模板,通過給出不同的引數列表,使得一個結構有多種型別。包含多型(InclusionPolymorphism):同樣的操作可用於一個型別及其子型別。
(注意是子型別,不是子類。)包含多型一般需要進行執行時的型別檢查。
2)多型的實現
注意:只有類中方法才有多型的概念,類中成員變數沒有多型的概念。
多型主要有2種表現形式: ①方法的過載(overLoad)。過載是指同一個類中有多個同名的方法,但是這些方法有著不同的引數,因此編譯時就可以確定到底呼叫哪個方法,它是一種編譯時多型。過載可以看做一個類中的方法多型性。個人感覺它是引數多型。
②方法的覆蓋(overRide)。子類可以覆蓋父類的方法,因此同樣的方法會在父類和子類中有著不同的表現形式。在java語言中,基類的引用變數不僅可以指向基類的例項物件,亦可以指
向其子類的例項物件。同樣,介面的引用變數也可以指向其實現類的例項物件。而程式呼叫的方法在執行期才動態繫結(繫結是指將一個方法呼叫和一個方法主體連線到一起),就是引用
變數所指向的具體例項物件的方法,也就是記憶體正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。通過這種動態繫結的方法實現多型。由於只有在執行時才能確定呼叫
哪個方法,因此通過方法覆蓋實現的多型也可以稱為執行時多型。個人感覺它是包含多型。
過載和覆蓋的區別:
過載:(1)一個類中定義多個同名方法。不同的引數列表(引數個數、引數型別、引數順序);
 (2)不能通過方法的訪問許可權、返回值型別和丟擲異常型別進行過載;
覆蓋:(1)派生類方法覆蓋基類方法。派生類的方法必須要基類的方法有相同方法名和引數;
 (2) 派生類的方法返回值型別必須和基類方法的返回值型別相同;
 (3) 派生類方法的丟擲異常型別必須和基類方法的丟擲異常型別一致;
 (4) 基類的被覆蓋的方法不能為private,否則子類方法只是定義了一個方法,並沒有實現覆蓋。