- 繼承 實(shí)現(xiàn) (A is-a B) 也叫作泛化
- 組合 聚合 關(guān)聯(lián) (A)
- 依賴
繼承
子類(lèi) => 父類(lèi)
子類(lèi)繼承父類(lèi), 通過(guò)一個(gè)關(guān)鍵字
extends
子類(lèi)可以調(diào)用父類(lèi)允許子類(lèi)調(diào)用的方法/屬性
子類(lèi)可以添加一些獨(dú)有的方法或者屬性, 減少代碼的冗余
子類(lèi)繼承來(lái)的方法不一定能滿足子類(lèi)的要求
=> 重寫(xiě)(override)
, 重寫(xiě)意味著改變內(nèi)部?jī)?nèi)容, 保留結(jié)構(gòu). 不同于重載(overload), 重載的例子比如說(shuō)System.out.print()
方法每一個(gè)類(lèi)都有繼承類(lèi), 如果沒(méi)有
extends
顯式的繼承某個(gè)類(lèi), 默認(rèn)繼承object
. 它是任何一個(gè)引用類(lèi)型的父類(lèi).object
沒(méi)有父類(lèi). 比如
toString()
:public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
getClass()
: 獲取對(duì)象對(duì)應(yīng)類(lèi)的類(lèi)映射
hashCode()
:public native int hashCode()
, 將對(duì)象在內(nèi)存中的地址經(jīng)過(guò)某個(gè)算法計(jì)算成一個(gè)整數(shù)
equals()
: 比較兩個(gè)基本值是否相等, 比較兩個(gè)引用值的地址是否相等,. 可以進(jìn)行重寫(xiě)
wait()
: 讓線程進(jìn)入等待狀態(tài)
notify()
: 喚醒線程
notyfyAll()
: 喚醒所有線程
finalize()
: 權(quán)限修飾符是 portected, 對(duì)象被GC回收的時(shí)候, 默認(rèn)調(diào)用的方法
clone()
: 克隆對(duì)象用的.
final, fanally, finalize
區(qū)別?
final 是一個(gè)權(quán)限修飾符
finally 是 try-catch 的最后關(guān)鍵字
finalize 是垃圾回收機(jī)制回收對(duì)象的默認(rèn)會(huì)調(diào)用的方法
- 每個(gè)類(lèi)只能繼承一個(gè)類(lèi), extends后面只能跟一個(gè)類(lèi)的名字, 目的是讓類(lèi)變得更加安全. 如果繼承了兩個(gè)類(lèi), 兩個(gè)類(lèi)里面都有一個(gè)方法叫做
test
, 那么子類(lèi)調(diào)用test
方法的時(shí)候, 到底是調(diào)用的誰(shuí)的呢? - 可以使用傳遞的方式進(jìn)行多繼承,
人 繼承 動(dòng)物, 父親 繼承 人, 兒子 繼承 父親
- 繼承在內(nèi)存中的存儲(chǔ)形式
Person p = new Person()
等號(hào)左邊存在于棧內(nèi)存, 等號(hào)右邊存在于堆內(nèi)存
new Person
的時(shí)候, 不但調(diào)用了Person
的構(gòu)造方法, 還調(diào)用了Animal
的構(gòu)造方法.
所以,p.toString()
是先去Person
類(lèi)里面找, 然后去Animal
里面找, 最后在Object
里面找到. - this 和 super
this 指代當(dāng)前執(zhí)行方法時(shí)的對(duì)象, 不一定是當(dāng)前類(lèi)的
super 當(dāng)前執(zhí)行方法時(shí)的對(duì)象的父類(lèi)
public class Animal {
public String name;
public void eat(){
System.out.println("動(dòng)物吃飯");
}
public void sleep(){
this.eat();
System.out.println("動(dòng)物睡覺(jué)");
}
}
子類(lèi)在調(diào)用sleep
方法的時(shí)候, 會(huì)執(zhí)行this.eat()
, 但是這個(gè) eat()
是子類(lèi)的方法, 而非是父類(lèi)的.