類的繼承
Java的繼承具有單繼承的特點(diǎn)聪黎,每個(gè)子類只有一個(gè)直接父類
繼承的特點(diǎn)
繼承通過extends關(guān)鍵字來實(shí)現(xiàn),實(shí)現(xiàn)繼承的類被稱為子類线梗,被繼承的類稱為父類
父類和子類的關(guān)系是一般和特殊的關(guān)系,如水果和蘋果的關(guān)系
父類的包含范圍總比子類的包含范圍大,即父類是大類答毫,子類是小類
[修飾符] class SubClass extends SuperClass
{
? ? ? ? ?//類的定義部分
}
Java子類不能獲得父類的構(gòu)造器
定義一個(gè)父類:
子類繼承父類:
Java類可以有無數(shù)多個(gè)間接父類:
class Fruit extends Plant
class Apple extends Fruit
如果定義一個(gè)Java類時(shí),并未顯示指定這個(gè)類的直接父類季春,則這個(gè)類默認(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用于限定該對(duì)象調(diào)用它從父類繼承得到的實(shí)例方法或變量
super不能出現(xiàn)在static修飾的的方法中
如果在構(gòu)造器中使用super鹤盒,則super用于限定該構(gòu)造器初始化的是該對(duì)象從父類繼承得到的實(shí)例變量蚕脏,而不是該類自己定義的實(shí)例變量
特殊情況:
調(diào)用父類構(gòu)造器
在一個(gè)構(gòu)造器中調(diào)用另一個(gè)重載的構(gòu)造器用this,在子類構(gòu)造器中調(diào)用父類構(gòu)造器使用super
構(gòu)造器之間的調(diào)用關(guān)系:
運(yùn)行結(jié)果:
創(chuàng)建任何對(duì)象總是從該類所在繼承樹最頂端類的構(gòu)造器開始執(zhí)行侦锯,然后依次向下執(zhí)行驼鞭,最后才執(zhí)行本類的構(gòu)造器,如果父類通過this調(diào)用了同類中重載的構(gòu)造器尺碰,就會(huì)依次執(zhí)行父類的多個(gè)構(gòu)造器
多態(tài)
編譯時(shí)類型和運(yùn)行時(shí)類型不一致挣棕,即為多態(tài)
多態(tài)性
運(yùn)行結(jié)果
編譯時(shí)類型為BaseClass(),運(yùn)行時(shí)類型為SubClass()
相同類型的變量亲桥,調(diào)用同一個(gè)方法時(shí)呈現(xiàn)出多種不同的行為特征洛心,即多態(tài)
對(duì)象的實(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)系的兩個(gè)類型之間進(jìn)行
如果試圖把一個(gè)父類實(shí)例轉(zhuǎn)換成子類類型词身,則這個(gè)對(duì)象必須實(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)算符
用于判斷前面的對(duì)象是否是后面的類法严,如果是损敷,則返回true,否則返回false
instanceof運(yùn)算符前面的操作數(shù)的編譯時(shí)類型要么與后面的類型相同深啤,要么與后面的類具有父子繼承關(guān)系拗馒,否則引起編譯錯(cuò)誤
繼承與組合
繼承是實(shí)現(xiàn)類復(fù)用的重要手段,但繼承也會(huì)破壞封裝
組合也是實(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類韩肝,需要一個(gè)teaching方法
利用組合實(shí)現(xiàn)復(fù)用
組合是把舊類對(duì)象作為新類的成員變量組合起來触菜,用以實(shí)現(xiàn)新類的功能,用戶看到的是新類的方法哀峻,而不能看到被組合對(duì)象的方法涡相,通常在新類里使用private修飾被組合的舊類對(duì)象
繼承:
替換為組合:
運(yùn)行結(jié)果為:
繼承表達(dá)is a的關(guān)系,組合表達(dá)has a的關(guān)系
初始化塊
對(duì)Java對(duì)象進(jìn)行初始化操作
使用初始化塊
[修飾符] {
? ? ? ?//初始化塊的可執(zhí)行代碼
}
初始化塊的修飾符只能是static剩蟀,使用static修飾的初始化塊稱為靜態(tài)初始化塊