Java 進階教學 : 物件導向進階觀念(二) - 繼承(extends)

Java Road


好的頻道需要你的支持,謝謝你使用Youtube影片的超級感謝功能給我們鼓勵。




好的頻道需要你的支持,謝謝你使用Youtube影片的超級感謝功能給我們鼓勵。

繼承

  繼承是物件導向中的重要特性之一。指的是在宣告新類別時, 可以指定上層類別(父類別),則新類別會擁有上層類別中的所有成員。主要優點是避免程式碼的重複開發方便維護管理

  假設我們要開發一個大型遊戲軟體。遊戲中有 100 種角色,也就是有 100 種物件,也就是我們要寫 100 個類別。而這 100 種角色,都要有名稱、生命值、防禦力與攻擊力 4 個欄位,還要有攻擊與防禦 2 個方法。

  如果沒有使用繼承機制,代表上述的 4 個欄位與 2 個方法必須在 100 個類別中一一撰寫;若使用繼承機制,則上述的 4 個欄位與 2 個方法便只需要撰寫在上層類別中,而要開發的那 100 個類別只要繼承此上層類別即可擁有宣告在上層類別中的 4 個欄位及 2 個方法。

  這樣的機制,不但在開發時可以避免程式碼的重複撰寫;而且在後續維護時,更是大大的減少了修改的時間。例如:要修改攻擊或防禦的運算式時,只要修改上層類別中的方法就可以了。

  在 Java 中,繼承與被繼承類別,我們用上層類別(Super class)下層類別(Sub class)稱呼。也就是其他語言的父類別(Parent class)與子類別(Child class)。

  在 Java 中,子類別宣告時只能指定一個父類別,這個叫單一繼承。有別於其他語言的多重繼承。

  以下層類別的角度來看,不必撰寫就可以擁有上層類別的所有成員,是一種福利。但其實也是一種限制。因為下層類別並不能針對個別成員選擇是否繼承,必須繼承所有成員。

  以上層類別的角度來看,寫在上層類別的成員,就是希望所有下層類別都一定要有的成員。

  下層類別可以宣告與上層類別名稱一樣的成員,用以遮蔽與覆載上層類別的成員,但不能不繼承。

  1. extends
  2. 子類別在類別名稱後用關鍵字:extends 指定要繼承的上層類別。
    例:class SubClass extends SuperClass{}

  3. Member accessing
    • 類別中存取
    • 物件存取

  4. Field shadowing
  5. 在下層類別中宣告與上層類別一樣名稱的欄位。

  6. Method overriding
  7. 在下層類別中宣告與上層類別一樣方法簽章的方法。

    int getValue(int x, int y){}
    • int : method type
    • getValue(int x, int y) : method signature
    • {} : method body

  8. super
    • super() / super(value)
    • 指定呼叫上層類別的建構方法。
      • 下層類別的建構方法,一定要呼叫上層類別的建構方法。
      • 下層類別的建構方法中的第一行敍述,如果不是this() / this(value),也不是super() / super(value),編輯器會自動在第一行加入:super()。
      • 下層類別的建構方法中的第一行敍述不是this() / this(value)就是super() / super(value)。
    • super.memberName
    • 存取上層類別中本類別有遮蔽的欄位;呼叫上層類別中本類別有覆載的方法

  9. 記憶體配置
  10. 物件建立時,先配置上層類別宣告的欄位,再置配下層類別宣告的欄位。

作者 : 許裕永

許老師的回答: