Java- 繼承和多態(tài)
- 可以從現(xiàn)有的類派生出新類。這稱為類的繼承。新類稱為次類、子類或派生類?,F(xiàn)有的類稱為超類、父類或基類。
- 構(gòu)造方法用來構(gòu)造類的實(shí)例。不同于屬性和方法,子類不繼承父類的構(gòu)造方法。它們只能用關(guān)鍵字
super從子類的構(gòu)造方法中調(diào)用。 - 構(gòu)造方法可以調(diào)用重載的構(gòu)造方法或它的父類的構(gòu)造方法。這種調(diào)用必須是構(gòu)造方法的第一條語句。如果沒有顯式地調(diào)用它們中的任何一個(gè),編譯器就會(huì)把
super()作為構(gòu)造方法的第一條語句,它調(diào)用的是父類的無參構(gòu)造方法。 - 為了覆蓋一個(gè)方法,必須使用與它的父類中的方法相同的簽名來定義子類中的方法。
- 實(shí)例方法只有是可訪問的時(shí)候才能覆蓋。這樣,私有方法是不能覆蓋的,因?yàn)樗遣荒茉陬惐旧碇庠L問的。如果子類中定義的方法在父類中時(shí)私有的,那么這兩個(gè)方法是完全沒有關(guān)系的。
- 靜態(tài)方法與實(shí)例方法一樣可以繼承。但是,靜態(tài)方法不能覆蓋,如果父類中定義的靜態(tài)方法在子類中重新定義,那么父類中定義的方法被隱藏。
- Java 中的每個(gè)類都源于
Java.lang.Object類。如果一個(gè)類在定義時(shí)沒有指定繼承關(guān)系,那么它的父類就是Object。 - 如果一個(gè)方法的參數(shù)類型是父類(
例如:Object),可以向該方法的參數(shù)傳遞任何子類(例如:Circle 類或 String 類)的對象。當(dāng)在方法中使用一個(gè)對象(例如:Circle對象或String 對象)時(shí),動(dòng)態(tài)的決定調(diào)用該對象方法(例如:toString)的某個(gè)特征的實(shí)現(xiàn)。(C++ 中的使用虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)連編)。 - 因?yàn)樽宇惖膶?shí)例總是它的父類的實(shí)例,所以,總是可以將一個(gè)子類的實(shí)例轉(zhuǎn)換成一個(gè)父類的變量。當(dāng)把父類的實(shí)例轉(zhuǎn)換成它的子類變量時(shí),必須使用轉(zhuǎn)換記號(hào)(子類名)進(jìn)行顯式轉(zhuǎn)換,向編譯器表明你的意圖。
- 一個(gè)類定義一個(gè)類型。子類定義的類型稱為子類型,而父類定義的類型稱為父類型。
- 當(dāng)從引用變量調(diào)用實(shí)例方法時(shí),該變量的實(shí)際類型在運(yùn)行時(shí)決定使用該方法的哪個(gè)實(shí)現(xiàn)。當(dāng)訪問數(shù)據(jù)域或靜態(tài)方法時(shí),引用變量的聲明類型在編譯時(shí)決定使用哪個(gè)方法。
- 可以使用表達(dá)式
obj instanceof AClass(對象名 instanceof 類名)測試一個(gè)對象是否是一個(gè)類的實(shí)例。 - 可以使用
protected修飾符來防止方法和數(shù)據(jù)被不同包的非子類訪問。 - 可以使用
final修飾符來表明一個(gè)類是終極的,是不能成為父類的;并且用它來表明一個(gè)方法是終極的,是不能覆蓋的。