1. 程式人生 > >[Java] 組合與繼承的區別

[Java] 組合與繼承的區別

組合和繼承都允許在新的類中放置子物件,組合是顯式地這樣做,而繼承是隱式地做。

那兩者之間的區別是怎樣的呢?又該如何選擇呢?

很多人對組合理解地還不是很好,所以我們先來理解一下組合:

組合技術通常用於想在新類中使用現有類的功能而非它的介面這種情況。

以car物件舉例:

//Composition with public objects.
package exampleChapter7;

class Engine {
	public void start() {}
	public void rev() {}
	public void stop() {}
}

class Wheel {
	public void inflate(int psi) {}
}

class Window {
	public void rollup() {}
	public void rolldown() {}
}

class Door {
	public Window window = new Window();
	public void open() {}
	public void close() {}
}

public class Car {
	public Engine engine = new Engine();
	public Wheel[] wheel = new Wheel[4];
	public Door
		left = new Door(),
		right = new Door(); // 2-door
	public Car() {
		for(int i = 0; i < 4; i++)
			wheel[i] = new Wheel();
	} 
	public static void main(String[] args) {
		Car car = new Car();
		car.left.window.rollup();
		car.wheel[0].inflate(72);
	}
} ///:~

可以明顯看出,這個例子的類:車,擁有發動機,門,窗等等部件,是一種所有關係。

繼承呢?

在繼承的時候,使用某個現有類,並開發一個它的特殊版本。通常,這意味著你在使用一個通用類,併為了某種特殊需要而將其特殊化。

兩者的區別呢?

還是以car為例,略微想一下就會發現,用一個“交通工具”來構成一部“Car”是毫無意義的,因為Car並不包含“交通工具,它僅僅是一種交通工具(is -a 的關係)

組合一般是將現有型別作為新型別底層實現的一部分來加以複用,而繼承複用的是介面。

所以總結來說,“is-a ”(是一個)的關係是用繼承來表達的,而“has-a"(有一個)的關係則是用組合來表達的。

儘管面向物件程式設計對繼承極力強調,但在開始一個設計時,一般應優先選擇組合(或者可能是代理),只在確實必要時才使用繼承。

到底是該用組合還是繼承,一個最清晰的判斷方法就是問問自己是否需要從新類向基類進行向上轉型。


相關推薦

[Java] 組合繼承區別

組合和繼承都允許在新的類中放置子物件,組合是顯式地這樣做,而繼承是隱式地做。 那兩者之間的區別是怎樣的呢?又該如何選擇呢? 很多人對組合理解地還不是很好,所以我們先來理解一下組合: 組合技術通常用於想在新類中使用現有類的功能而非它的介面這種情況。 以car物件舉例: /

[Java] 組合繼承區別

組合和繼承都允許在新的類中放置子物件,組合是顯式地這樣做,而繼承是隱式地做。 那兩者之間的區別是怎樣的呢?又該如何選擇呢? 很多人對組合理解地還不是很好,所以我們先來理解一下組合: 組合技術通常用於想在新類中使用現有類的功能而非它的介面這種情況。 以car物件舉

Java類的組合繼承 小問題分析(建構函式引數的傳遞方法 、資料隱藏的處理: 對比C++)

一、類的組合:     1、初始化問題(建構函式的引數傳遞方法):       在C++中,通常只要物件中不含有指標類資料的話,物件與物件之間是可以相互賦值且不會出錯的,因此組合出來的類完全可以將傳遞過來的物件引數直接賦值給對應資料成員;       而在java中,物

Java學習筆記(二)--組合繼承

       繼承是面向物件的三大特徵之一,也是實現軟體複用的重要手段,Java的繼承具有單繼承的特點,每個類只有一個直接父類,可以有多個間接父類。繼承是一種"is-a"的關係。繼承    有開發經驗的人都知道繼承該怎麼寫,我就不再重複造輪子了!    優點:程式碼複用子類可

Java組合繼承區別

   本文轉自:http://changbl.iteye.com/blog/2304492   作者:空蘭幽谷 組合和繼承是面向物件中兩種程式碼複用的方式。組合是指在新的類中建立原有類的物件,重複利用已有類的功能。繼承是面向物件的主要特徵之一,它允許設計人員根據其他類的實現來定義一個類的實現。組合和繼承

Python學習之旅—面向對象進階知識:類的命名空間,類的組合繼承

ati error role ont 之前 obj say 報錯 抽象 前言   上篇博客筆者帶領大家初步梳理了Python面向對象的基礎知識,本篇博客將專註於解決三個知識點:類的命名空間,類的組合以及面向對象的三大特性之一繼承,一起跟隨筆者老看看今天的內容吧。 1.

Java繼承

itblog ring bool static成員 phi bre 引用 rtt ram 轉載於:http://www.cnblogs.com/dolphin0520/p/3803432.html 在Java中,類文件是以.java為後綴的代碼文件,在每個類文件中最多只允許

Java equals“==”的區別

算法 log div padding net class 如果 ros get 理解HashSet的時候遇到的問題,在這裏記錄一下: 使用 == 進行比較, 該方式比較的是變量是否同時指向一塊內存地址,如果是就返回true,否則返回false 使用對象本身的equa

C++網易雲課堂開發工程師--組合繼承

一個 turn component 完成 tro 關系 pac pro art 著一個章節主要圍繞:繼承,復合,委托三個方面進行介紹。 復合:表示has-a template<class T, class Sequence = deque<T>>

閱讀隨筆之組合繼承

組合:(has-a)將一個物件的引用置於新的物件中。(這是我自己的解釋,不是專業術語) 繼承:(is-a)繼承不是複製基類的介面,當你建立一個匯出類的物件時,該物件包含了一個基類的子物件。這個子物件與你直接建立物件是一樣的。二者的區別在於,後者來自於外部,而基類的子物件被包裝在匯出類物件內部。

python類物件的組合繼承

1、把類的物件例項化放到一個新的類裡面叫做類的組合,組合就是指幾個橫向關係的類放在一起,縱向關係的類放在一起是繼承,根據實際應用場景確定。簡單的說,組合用於“有一個”的場景中,繼承用於“是一個”的場景中。例如,水池裡有一個烏龜,天上有一個鳥,地上有一個小甲魚,這些適合使用組合。青瓜是瓜,女人是人,鯊魚是魚,這

Java中&&&的區別,|||的區別

這個是轉載別人的 個人感覺不錯, 在java中,很多人都不知道&與&&,|與||的區別。 &,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別, 對於&:無論&左邊是

Java int Integer 區別

學習借鑑(其實搬了別人的好多)和自己的理解,可能會有較多錯誤,如有疑問聯絡我呀。 int  是基本資料型別, Integer 是引用型別,也就是一個物件。 int 儲存的是數值,Integer 儲存的是引用的物件的地址。 int 佔用記憶體少、Integer 物件

java中/%的區別

  1 2 3 4 5 6 7 8 9 10 11 System.out.println(3/5)  = 0; System.out.println(2/5)  = 0; System.out.printl

java介面物件區別

“` 列表內容 深入理解Java的介面和抽象類   對於面向物件程式設計來說,抽象是它的一大特徵之一。在Java中,可以通過兩種形式來體現OOP的抽象:介面和抽象類。這兩者有太多相似的地方,又有太多不同的地方。很多人在初學的時候會以為它們可以隨意互換使用,但是實際則不然。今天我們就一起來學習一下Java

python面向物件程式設計之組合繼承

類與類之間有兩種關係:繼承和組合。多用組合少用繼承較好。 先來看兩個例子: 先定義兩個類,一個老師類,老師類有名字,年齡,出生的年,月和日,所教的課程等特徵以及走路,教書的技能。 class Teacher: def __init__(self,name,age,year,mon,day):

java中&&&的區別

&和&&都是邏輯運算子,都是判斷兩邊同時真則為真,否則為假;但是&&當第一個條件不成之後,後面的條件都不執行了,而&則還是繼續執行,直到整個條件語句執行

Python 進階_OOP 面向物件程式設計_組合繼承

#目錄 前言 我們定義一個類是希望能夠把類當成模組來使用,並把類嵌入到我們的應用程式碼中,與其他的資料型別、邏輯執行流結合使用。一般來說我們可以使用兩種方法在程式碼中利用類,那就是組合和派生。 組合 組合: 就是將不同的類混合並加入到其他

java-組合優於繼承

組合和繼承,都能實現對類的擴充套件。 區別如下表所示 組合 繼承 has-a關係 is-a關係 執行期決定 編譯期決定 不破壞封裝,整體和區域性鬆耦合 破壞封裝,子類依賴父類 支援擴充套件,隨意增加

繼承組合有什麼區別

} class Tire{ } class Car extends Verhicle{ private Tire t=new Tire(); } 既然繼承和組合都可以實現程式碼的重用,那麼在實際使用的時候又該如何選擇呢?一般情況下,遵循以下兩點原則。 (1) 除非兩個類之間是“is-a”的關係