物件導向三大基本特徵——封裝、繼承、多型
封裝
首先封裝的意思就是將客觀事物封裝成抽象的類,封裝可以看做是乙個保護屏障,將實現細節全都隱藏起來,防止該類的**和資料被外部類定義的**隨機訪問。要訪問該類的**和資料,必須通過嚴格的介面控制。他的優點在於1.良好的封裝能夠減少耦合。2.類的內部結構可以自有修改。3.可以對成員變數進行更精確的控制。4.隱藏資訊,實現細節。
繼承
物件導向程式設計 (oop) 語言的乙個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
通過繼承建立的新類稱為「子類」或「派生類」。
被繼承的類稱為「基類」、「父類」或「超類」。
繼承的過程,就是從一般到特殊的過程。
要實現繼承,可以通過「繼承」(inheritance)和「組合」(composition)來實現。
在某些 oop 語言中,乙個子類可以繼承多個基類。但是一般情況下,乙個子類只能有乙個基類,要實現多重繼承,可以通過多級繼承來實現。
繼承概念的實現方式有三類:實現繼承、介面繼承和可視繼承。
ø 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力;
ø 介面繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力;
ø 可視繼承是指子窗體(類)使用基窗體(類)的外觀和實現**的能力。
在考慮使用繼承時,有一點需要注意,那就是兩個類之間的關係應該是「屬於」關係。例如,employee 是乙個人,manager 也是乙個人,因此這兩個類都可以繼承 person 類。但是 leg 類卻不能繼承 person 類,因為腿並不是乙個人。
抽象類僅定義將由子類建立的一般屬性和方法,建立抽象類時,請使用關鍵字 inte***ce 而不是 class。
oo開發正規化大致為:劃分物件→抽象類→將類組織成為層次化結構(繼承和合成) →用類與例項進行設計和實現幾個階段。
多型
多型性(polymorphisn)是允許你將父物件設定成為和乙個或更多的他的子物件相等的技術,賦值之後,父物件就可以根據當前賦值給它的子物件的特性以不同的方式運作。簡單的說,就是一句話:允許將子類型別的指標賦值給父類型別的指標。
實現多型,有二種方式,覆蓋,過載。
覆蓋,是指子類重新定義父類的虛函式的做法。
過載,是指允許存在多個同名函式,而這些函式的參數列不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。
其實,過載的概念並不屬於「物件導向程式設計」,過載的實現是:編譯器根據函式不同的參數列,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式(至少對於編譯器來說是這樣的)。如,有兩個同名函式:function func(p:integer):integer;和function func(p:string):integer;。那麼編譯器做過修飾後的函式名稱可能是這樣的:int_func、str_func。對於這兩個函式的呼叫,在編譯器間就已經確定了,是靜態的(記住:是靜態)。也就是說,它們的位址在編譯期就繫結了(早繫結),因此,過載和多型無關!真正和多型相關的是「覆蓋」。當子類重新定義了父類的虛函式後,父類指標根據賦給它的不同的子類指標,動態(記住:是動態!)的呼叫屬於子類的該函式,這樣的函式呼叫在編譯期間是無法確定的(呼叫的子類的虛函式的位址無法給出)。因此,這樣的函式位址是在執行期繫結的(晚邦定)。結論就是:過載只是一種語言特性,與多型無關,與物件導向也無關!引用一句bruce eckel的話:「不要犯傻,如果它不是晚邦定,它就不是多型。」
那麼,多型的作用是什麼呢?我們知道,封裝可以隱藏實現細節,使得**模組化;繼承可以擴充套件已存在的**模組(類);它們的目的都是為了——**重用。而多型則是為了實現另乙個目的——介面重用!多型的作用,就是為了類在繼承和派生的時候,保證使用「家譜」中任一類的例項的某一屬性時的正確呼叫。
類和物件的區別
它們的關係是,物件是類的例項,類是物件的模板
物件導向的四要素:
封裝(wrap)、繼承(inheritance)、過載(override)還是多型(polymorphism),亦或是其他? 封裝是優點,繼承是基礎,過載是特點,而多型則是特徵。
過載,繼承,重寫和多型,泛型的區別:
(1)過載是在乙個類裡一系列引數不同名字相同的方法。
(2)繼承是子類獲得父類的成員,使用父類的方法。
(3)重寫是繼承後重新實現父類的方法。
(4)多型是具有表現多種形態的能力的特徵,是為了避免在父類裡大量過載引起**臃腫且難於維護。繼承是子類使用父類的方法,而多型則是父類使用子類的方法
(5) 泛型就是指我們不為特定的型別進行專門編碼,而採用對不同型別進行通用編碼的方式,無論是資料結果還是演算法,多型實際上就是泛型。
關於物件導向程式設計的最終核心就是ocp開放關閉原則,只有遵循ocp原則(對於擴充套件是開放的,對於更改是封閉的)才可續論可維護,可擴充套件,可服用,靈活性好。、下面的例子包含了這四種實現:
class
********
extends
shape
}class
rectangle
extends
shape
}public
class
shape
public
int getsides()
public
int getsides(******** tri)
public
int getsides(rectangle rec)
}public
static
void main(string args)
}注意********類的方法是重寫,而rectangle類的方法是過載。
比較就可以發現多型對過載的優點:如果用過載,則在父類裡要對應每乙個子類都過載乙個取得邊數的方法;如果用多型,則父類只提供取得邊數的介面,至於取得哪個形狀的邊數,怎樣取得,在子類裡各自實現(重寫)。
多型的體現就是父類引用指向子類物件。
list() list = new arraylist();
map() map = new hashmap();
另乙個參考資料
Java 繼承 過載 重寫 多型
父類 class engineer public engineer int no,string name,string entertime public void showinfo get和set方法省略 class softengineer extends engineer public soft...
java 封裝 繼承 過載 重寫
目的 為了維護程式安全穩定性,保護底層資料 行為 一切為了維護程式的安全穩定性,保護底層資料的行為,都稱之為封裝。具體體現 私有屬性,公有方法 私有構造,靜態方法返回類物件 內部類 並列內部類包含內部類 public 該類和非該類均可訪問 private 只有該類可訪問 protect 該類及其子類...
繼承 過載 重寫
一 過載和重寫 過載 方法名相同,引數不同 引數型別或者引數個數 可以存在不同的返回值 重寫 1 方法名相同 2 引數相同 引數型別和引數個數 3 返回值型別為基本資料型別時 返回值型別需和父類相同。返回值為引用型別時 返回值型別相同或者返回值型別是父類返回值型別的子類 4 訪問修飾符相同或者比父類...