類的繼承
Java的繼承具有單繼承的特點(diǎn),每個子類只有一個直接父類
繼承的特點(diǎn)
繼承通過extends關(guān)鍵字來實(shí)現(xiàn),實(shí)現(xiàn)繼承的類被稱為子類,被繼承的類稱為父類
父類和子類的關(guān)系是一般和特殊的關(guān)系,如水果和蘋果的關(guān)系
父類的包含范圍總比子類的包含范圍大,即父類是大類,子類是小類
[修飾符] class SubClass extends SuperClass
{
? ? ? ? ?//類的定義部分
}
Java子類不能獲得父類的構(gòu)造器
定義一個父類:

子類繼承父類:

Java類可以有無數(shù)多個間接父類:
class Fruit extends Plant
class Apple extends Fruit
如果定義一個Java類時(shí),并未顯示指定這個類的直接父類,則這個類默認(rèn)擴(kuò)展java.lang.Object類
java.lang.object類是所有類的父類
重寫父類的方法


覆蓋方法和被覆蓋方法需要都是類方法,或都是實(shí)例方法
可以使用super(被覆蓋的是實(shí)例方法)或者父類類名(被覆蓋的是類方法)來調(diào)用父類中被調(diào)用的方法
super限定
需要在子類方法中調(diào)用父類被覆蓋的實(shí)例方法,可以使用super限定來調(diào)用父類被覆蓋的實(shí)例方法
super用于限定該對象調(diào)用它從父類繼承得到的實(shí)例方法或變量
super不能出現(xiàn)在static修飾的的方法中
如果在構(gòu)造器中使用super,則super用于限定該構(gòu)造器初始化的是該對象從父類繼承得到的實(shí)例變量,而不是該類自己定義的實(shí)例變量

特殊情況:

調(diào)用父類構(gòu)造器
在一個構(gòu)造器中調(diào)用另一個重載的構(gòu)造器用this,在子類構(gòu)造器中調(diào)用父類構(gòu)造器使用super

構(gòu)造器之間的調(diào)用關(guān)系:

運(yùn)行結(jié)果:

創(chuàng)建任何對象總是從該類所在繼承樹最頂端類的構(gòu)造器開始執(zhí)行,然后依次向下執(zhí)行,最后才執(zhí)行本類的構(gòu)造器,如果父類通過this調(diào)用了同類中重載的構(gòu)造器,就會依次執(zhí)行父類的多個構(gòu)造器
多態(tài)
編譯時(shí)類型和運(yùn)行時(shí)類型不一致,即為多態(tài)
多態(tài)性

運(yùn)行結(jié)果

編譯時(shí)類型為BaseClass(),運(yùn)行時(shí)類型為SubClass()
相同類型的變量,調(diào)用同一個方法時(shí)呈現(xiàn)出多種不同的行為特征,即多態(tài)
對象的實(shí)例變量不具備多態(tài)性
引用變量只能調(diào)用聲明該變量是所用類里包含的方法
引用變量的強(qiáng)制類型轉(zhuǎn)換
引用變量需要調(diào)用它運(yùn)行時(shí)的方法,則必須把它強(qiáng)制類型轉(zhuǎn)換成運(yùn)行時(shí)類型
類型轉(zhuǎn)換運(yùn)算符:(type)variable?
轉(zhuǎn)換注意點(diǎn):
基本類型之間的轉(zhuǎn)換只能在數(shù)值類型之間進(jìn)行,數(shù)值類型和布爾類型之間不能進(jìn)行類型轉(zhuǎn)換
引用類型之間的轉(zhuǎn)換只能在具有繼承關(guān)系的兩個類型之間進(jìn)行
如果試圖把一個父類實(shí)例轉(zhuǎn)換成子類類型,則這個對象必須實(shí)際上是子類實(shí)例才行(編譯時(shí)類型為父類,運(yùn)行時(shí)類型為子類)

運(yùn)行結(jié)果:

考慮到強(qiáng)制類型轉(zhuǎn)換時(shí)可能出現(xiàn)異常,通過instanceof 運(yùn)算符來判定是否可以成功轉(zhuǎn)換
if (object instanceof? String)
{
String str = (String)objPri;
}
instanceof 運(yùn)算符
用于判斷前面的對象是否是后面的類,如果是,則返回true,否則返回false
instanceof運(yùn)算符前面的操作數(shù)的編譯時(shí)類型要么與后面的類型相同,要么與后面的類具有父子繼承關(guān)系,否則引起編譯錯誤

繼承與組合
繼承是實(shí)現(xiàn)類復(fù)用的重要手段,但繼承也會破壞封裝
組合也是實(shí)現(xiàn)類復(fù)用的重要方式,采用組合方式來來實(shí)現(xiàn)類復(fù)用則能提供更好的封裝性
使用繼承的注意點(diǎn)
盡量隱藏父類的內(nèi)部數(shù)據(jù),盡量把父類的所有成員變量都設(shè)置成private訪問類型
不要讓子類可以隨意訪問、修改父類的方法
盡量不要在父類構(gòu)造器中調(diào)用將要被子類重寫的方法
父類派生子類:
子類需要增加額外屬性,如person派生出student類,需要增加grade屬性
子類需要增加自己獨(dú)有的行為方式,person類派生出teacher類,需要一個teaching方法
利用組合實(shí)現(xiàn)復(fù)用
組合是把舊類對象作為新類的成員變量組合起來,用以實(shí)現(xiàn)新類的功能,用戶看到的是新類的方法,而不能看到被組合對象的方法,通常在新類里使用private修飾被組合的舊類對象
繼承:

替換為組合:

運(yùn)行結(jié)果為:

繼承表達(dá)is a的關(guān)系,組合表達(dá)has a的關(guān)系
初始化塊
對Java對象進(jìn)行初始化操作
使用初始化塊
[修飾符] {
? ? ? ?//初始化塊的可執(zhí)行代碼
}
初始化塊的修飾符只能是static,使用static修飾的初始化塊稱為靜態(tài)初始化塊