標籤:drawing 注意 程式開發 答案 str 編程 物件導向 複雜 start
複用代碼是Java眾多令人信服的功能之一。
一般而言,實現代碼重用java提供了兩種方式:組合以及繼承。
- 組合:新的類由現有類的對象所組成。(複用現有代碼的功能,而非它的形式)
- 繼承:按照現有類的類型組建新類。(在不改變現有類的基礎上,複用現有類的形式並在其中添加新代碼)。
組合
class Engine{ public void start(){} public void stop(){} } class Door{ public void open(){} public void close(){} } class Window{ public void rollup(){} public void rolldown(){} } public class Car { private Engine engine=new Engine(); private Door door=new Door(); private Window window=new Window(); public static void main(String[] args) { Car car=new Car(); car.engine.start(); car.door.close(); car.window.rolldown(); } }
可以看到 組合方式是顯式性地在新類中放置子物件,而繼承則是隱式地做。
繼承
繼承是所有OOP(物件導向的程式設計語言)語言,包括Java語言不可缺少的組成部分。
class Art{ Art(){ System.out.print("Art constructor"); } } class Drawing extends Art{ Drawing(){ System.out.print("Drawing constructor"); } } public class Cartoon extends Drawing{ public Cartoon(){ System.out.print("Cartoon constructor"); } public static void main(String[] args) { Cartoon c=new Cartoon(); } }
輸出:
Art constructorDrawing constructorCartoon constructor
上面的例子中,父類在子類初始化之前就完成了初始化,因為在子類初始化時預設調用了父類的無參構造器。請注意一下幾點:
- 構造器不能被繼承, 一個類能得到構造器,只有兩個辦法:編寫構造器,或者使用預設無參構造器。
- 如果想要調用父類有參數的構造器,則必須在子類的構造器中顯式地通過super關鍵字調用父類的構造器,並配以適當的參數列表(必須放在第一行)。
- 如果想要調用父類無參數的構造器,則在子類的構造器中用super調用父類構造器不是必須的,如果沒有使用super關鍵字,系統會自動調用父類的無參構造器。
再來看個例子:
class Art{ Art(int i){ System.out.println("Art Constructor i"); }}class Drawing extends Art{ Drawing(int i){ //super(i)顯式調用基類(父類)的構造器方法 super(i); System.out.println("Drawing Constructor i"); }}public class Cartoon extends Drawing { public Cartoon(int i){ //super(i)顯式調用基類(父類)的構造器方法 super(i); System.out.println("Cartoon Constructor i"); } public static void main(String[] args) { Cartoon cartoon = new Cartoon(1); }}
輸出:
Art constructor 1Drawing constructor 1Cartoon constructor 1
總結
繼承和組合都能從現有類型產生新類型。組合一般是將現有類型作為新類型底層實現的一部分來加以複用,而繼承複用的是介面。
在使用繼承時,由於匯出類具有基類介面,因此它可以向上轉型至基類,這對多態來講至關重要。
儘管物件導向編程對繼承極力強調,但在開始一個設計時,一般應優先考慮使用組合(或者可能是代理),只在確實必要時才使用繼承。因為組合更具靈活性。此外,通過對成員類型使用繼承技術的添加技巧,可以在運行時改變那些成員對象的類型和行為。因此,可以在運行時改變組合而成的對象的行為。
在設計一個系統時,目標應該是找到或建立某些類,其中每個類都有具體的用途,而且既不會太大(包含太多的功能而難以複用),也不會太小(不添加其它功能就無法使用)。如果你的設計變得過於複雜,通過將現有類拆分為更小的部分或添加更多的對象,通常會有所協助。
當你開始設計一個系統時,應該認識到程式開發是一種增量過程,猶如人類的學習一樣,這一點很重要。程式開發依賴於實驗,你可以盡己所能去分析,但當你開始執行一個項目時,你仍然無法知道所有的答案。如果將項目視作是一種有機的、進化著的生命體而去培養,而不是打算像蓋摩天大廣告一樣快速見效,就會獲得更多的成功和更迅速的回饋。繼承和組合正是在物件導向程式設計中使得你可以執行這種實驗的最基本的兩個工具。
參考:
《Java編程思想》
Java繼承
Java編程思想學習筆記——複用類
Java學習筆記—複用類