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 中,子類別宣告時只能指定一個父類別,這個叫單一繼承。有別於其他語言的多重繼承。
以下層類別的角度來看,不必撰寫就可以擁有上層類別的所有成員,是一種福利。但其實也是一種限制。因為下層類別並不能針對個別成員選擇是否繼承,必須繼承所有成員。
以上層類別的角度來看,寫在上層類別的成員,就是希望所有下層類別都一定要有的成員。
下層類別可以宣告與上層類別名稱一樣的成員,用以遮蔽與覆載上層類別的成員,但不能不繼承。
- extends
- Member accessing
- 類別中存取
- 物件存取
- Field shadowing
- Method overriding
- int : method type
- getValue(int x, int y) : method signature
- {} : method body
- super
- super() / super(value)
- 下層類別的建構方法,一定要呼叫上層類別的建構方法。
- 下層類別的建構方法中的第一行敍述,如果不是this() / this(value),也不是super() / super(value),編輯器會自動在第一行加入:super()。
- 下層類別的建構方法中的第一行敍述不是this() / this(value)就是super() / super(value)。
- super.memberName
- 記憶體配置
子類別在類別名稱後用關鍵字:extends 指定要繼承的上層類別。
例:class SubClass extends SuperClass{}
在下層類別中宣告與上層類別一樣名稱的欄位。
在下層類別中宣告與上層類別一樣方法簽章的方法。
int getValue(int x, int y){}
指定呼叫上層類別的建構方法。
存取上層類別中本類別有遮蔽的欄位;呼叫上層類別中本類別有覆載的方法。
物件建立時,先配置上層類別宣告的欄位,再置配下層類別宣告的欄位。