復用:使用類而不破壞現有代碼
1.組合:新類中使用現有類對象 has-a
2.繼承:按照現有類創(chuàng)建新的類 is-a
7.1 組合語法
直接在類內定義一個對象即可。
*toString:每個類都有toString,編譯器如果在需要String的地方遇到一個對象,就會自動執(zhí)行toString
默認值是Object類里的toString,getClass().getName() + "@" + Integer.toHexString(hashCode()); 類名+hash碼?
類內對象初始化:
1.在對象定義出
2.構造器中
3.使用對象前:惰性初始化,可以減少負擔
4.使用實例初始化
7.2繼承語法
*所有類都隱式繼承Object類
*子類自動得到父類的所有域和方法,構造器自動先調用父類的構造器
*子類可以覆蓋父類的方法,使用super表示父類的引用?也可以添加新的方法
7.2.1 初始化父類
*在創(chuàng)建子類對象時,該對象包含了一個父類的子對象,包裝在子類的內部。子類總是在構造器第一句之前“偷偷”調用父類構造器
*如果父類構造器帶參數,則必須用super顯示調用,且必須位于構造器第一句!
7.3代理Delegation??
我的理解:使用繼承,父類的所有方法都向外部暴露
代理:使用組合,且對象為PRivate,提供public方法,方法內部調用組合對象的方法,這樣可以有更多的控制力
7.4結合使用組合和繼承
7.4.1確保正確清理
Java沒有C++析構函數的概念,如果有必要的清理操作,就必須顯式的編寫,并確保類使用者知道他們必須調用這一方法。
通常將清理動作放在finally子句中保證一定被執(zhí)行!
如果必須親自處理清理動作時,必須多加小心
7.4.2名稱屏蔽
Java允許在子類中對父類的方法重載
在覆蓋時,可以添加@Override注解,表明是方法覆蓋,如果出現重載現象,編譯器會報錯,避免重載而非覆蓋!
7.5在組合與繼承之間選擇
組合通常是使用已有對象的功能,通常為private僅提供給類內部使用
有時設為public也具有意義,特別是has-a的關系時
繼承是is-a,是從抽象到具體的關系!
7.6protected關鍵字
7.7向上轉型
要求父類引用 可以接受子類的引用,以為父類能干的事子類都能干!唯一可能發(fā)生的事情就是丟失方法。
7.8final關鍵字
final通常表示“這是無法改變的”,原因是設計或效率
7.8.1final數據
java常量必須是基本類型。如果是final引用,只能是引用不變,不能保證對象不變!
空白final:在聲明時不賦值,在使用前賦值
final參數:在方法中無法改變引用。
7.8.2final方法
原因:禁止子類覆蓋
private:隱含語義是禁止覆蓋,但實質上private方法對子類是不可見的,所以子類如果有一個父類private方法,其實不是覆蓋,而是一個“新”方法!
7.8.3final類
final類不允許有子類!
7.8.4忠告
廢話一堆,就是說要謹慎考慮。。。
7.9初始化及類的加載
加載順序:當運行是,static先加載,基類先加載
新聞熱點
疑難解答