Java類與類之間關係總結

類和類之間的關係

  • a is-a b 泛化(繼承 實現)
  • a has-a b 包含(組合 聚合 關聯)
  • a use-a b 依賴 (need-a)

4種權限修飾符:public protected 默認不寫 private (它們的權限由大到小)

繼承關係

  1. 子類繼承父類用關鍵字 extends
  2. 子類的對象可以調用父類中的(public protected)屬性和方法,當做自己的來使用
    2.1 構造方法嚴格意義上說 不算做子類繼承過來
    只是單純的在子類調動構造 方法時默認調用父類的構造方法
    2.2程序塊嚴格意義上說 不算做子類繼承過來
    程序塊子類不能直接調用 子類執行構造方法之前 默認調用了父類的構造方法 父類構造方法執行之前自動執行父類的程序塊
  3. 子類可以添加自己獨有的屬性或方法
  4. 可能子類從父類繼承過來的方法不能滿足子類需要,可以在子類中重寫父類的方法
  5. 每一個類都有繼承類,如果不寫extends關鍵字,則默認繼承Object類
    所以Object類非常重要!可以理解爲它是任何一個引用類型的父類(直接或間接繼承Object) Object類沒有父類
  6. java中繼承是單個存在的(單繼承,多實現)每一個類只能有一個繼承類(在extends關鍵字後面只能寫一個類) c++是有多繼承的
    java語言採用單繼承是爲了讓類變得更加安全,簡單。 但是java可以通過傳遞的方式實現多繼承的效果
  7. 繼承在內存中的存儲形式
    在這裏插入圖片描述
  8. 關於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程序來描述這樣的關係: 一個類的方法中使用到了另一個類的對象
設計類的關係遵循的原則:高內聚低耦合
耦合度:泛化>包含>依賴

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章