類和類之間的關係
- a is-a b 泛化(繼承 實現)
- a has-a b 包含(組合 聚合 關聯)
- a use-a b 依賴 (need-a)
4種權限修飾符:public protected 默認不寫 private (它們的權限由大到小)
繼承關係
- 子類繼承父類用關鍵字 extends
- 子類的對象可以調用父類中的(public protected)屬性和方法,當做自己的來使用
2.1 構造方法嚴格意義上說 不算做子類繼承過來
只是單純的在子類調動構造 方法時默認調用父類的構造方法
2.2程序塊嚴格意義上說 不算做子類繼承過來
程序塊子類不能直接調用 子類執行構造方法之前 默認調用了父類的構造方法 父類構造方法執行之前自動執行父類的程序塊 - 子類可以添加自己獨有的屬性或方法
- 可能子類從父類繼承過來的方法不能滿足子類需要,可以在子類中重寫父類的方法
- 每一個類都有繼承類,如果不寫extends關鍵字,則默認繼承Object類
所以Object類非常重要!可以理解爲它是任何一個引用類型的父類(直接或間接繼承Object) Object類沒有父類 - java中繼承是單個存在的(單繼承,多實現)每一個類只能有一個繼承類(在extends關鍵字後面只能寫一個類) c++是有多繼承的
java語言採用單繼承是爲了讓類變得更加安全,簡單。 但是java可以通過傳遞的方式實現多繼承的效果 - 繼承在內存中的存儲形式
- 關於this和super的使用 this和super都是指代詞 代替的是對象
this(代替的是當前調用方法或屬性時的那個對象 不一定是當前類的對象)
super(代替的是當前執行方法時的對象的父類對象)
它們都能調用一般屬性和一般方法 可以放在類成員的任意位置(屬性 方法 構造 塊)
注意調用一般方法的時候可以來回調用(寫法可以 編譯好用,執行可能會產生問題StackOverflowError)
可以調用構造方法(放在構造方法的第一行)
調用構造方法的時候不能來回調用(編譯就不好用)
this和super在構造方法中調用另一個類的構造方法時不能同時出現在第一行
Object類中的方法:
- *hashCode() 將對象在內存中的地址經過計算得到一個int整數
public native int hashCode();
- *equals() 用來比較兩個對象的內容 Object默認效果是==
public boolean equals(Object obj){
return (this==obj);
}
總結:==可以比較基本類型(比較的是值),也可以比較引用類型(比較的是地址)
equals()方法是Object類中繼承過來的方法,默認比較的是地址,如果想要改變其規則,可以進行方法重寫
- *toString() 打印輸出時將對象變成String字符串
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}
- getClass() 獲取對象對應類的類映射(反射機制)
- wait() 線程進入掛起等待狀態 它存在方法重載
- notify() 線程喚醒
- notifyAll() 喚醒所有
- finalize() 權限修飾符是protected 在對象被GC回收的時候 默認調用執行的方法 相當於析構函數
構造函數:創建對象
析構函數:回收對象
筆試題經常考:final finally finalize的區別 它們名字上看起來類似 實際上沒有任何關聯
protected void finalize(){
}
- clone() 權限修飾符是protected 爲了克隆對象
這9個方法要求:記憶 方法名 方法參數 方法返回值 方法是否存在重載 常用的幾個方法需要知道它的源代碼如何實現
如果方法的特徵符包含native而且又沒有方法體:注意它不是抽象方法,它是做事情的。在java當中看不到底層源碼了。
它調用了c++語言給我們寫的核心的機制。
所以以後見到native:對不起,java語言到頭了,native是調用了c++語言寫的程序。
方法重寫和方法重載的區別:
\ | 方法重寫override | 方法重載overload |
---|---|---|
類 | 產生兩個繼承關係的類 | 一個類中的一組方法 |
子類重寫父類的方法 | ||
權限 | 子類可以大於等於父類 | 沒有要求 |
特徵 | final static abstract | 沒有要求 |
父類方法是final 子類不能重寫 | ||
父類方法是static 子類不存在重寫 | ||
父類方法是abstract 子類必須重寫 (否則子類就是抽象類) | ||
返回值 | 子類可以小於等於父類 | 沒有要求 |
方法名字 | 子類與父類一致 | 一個類中的好多方法名必須一致 |
參數列表 | 子類與父類一致 | 每一個方法的參數必須不一致(個數 類型 順序) |
異常 | 運行時? 編譯時? | 沒有要求 |
如果父類方法拋出運行時異常 | ||
子類可以不予理會 | ||
如果父類方法拋出編譯時異常 | ||
子類拋出異常的個數以及類型都小於等於父類 | ||
方法體 | 子類的方法內容與父類不一致 | 每一個重載的方法 執行過程不一致 |
a has-a b 包含(組合 聚合 關聯)
這三個關係從親密程度來講不太一樣 關係越來越鬆弛
組合---->人和大腦 人和心臟的關係(整體和部分的關係 不可分割 整體要出現都出現 要消亡都消亡 )
聚合---->汽車和車輪子 電腦和主板(整體和部分的關係 創建時有可能是分開的 所以聚合沒有組合關係緊密)
關聯---->人有汽車 人有電腦(整體和部分的關係 可以分割 後來形成在一起的)
從java程序來描述這樣的關係: 通過一個類的對象當做另一個類的屬性來存儲
a use-a b 依賴 (need-a)(最常見)
不是整體和部分的關係 某一件事情產生了關係 臨時組合在一起 這件事情一旦做完關係即解散
屠夫殺豬 一個類(屠夫) 可以做一件事:殺豬 需要條件:一頭豬(只是做殺豬這件事的時候需要豬,做其他事情不需要 強調臨時性)
從java程序來描述這樣的關係: 一個類的方法中使用到了另一個類的對象
設計類的關係遵循的原則:高內聚低耦合
耦合度:泛化>包含>依賴