轉載出處,很不錯的文章收藏學習http://blog.csdn.net/zhuanshenfanhua123/article/details/14119759
1.相同點:二者都是實現類重用的重要方式。
2.不同點:繼承會破壞封裝性。
例:
- class A
- {
- public void fun(){}
- public void breath(){}
- }
- class B extends A
- {
- public void funb(){}
- }
- class C extends A
- {
- public void func(){}
- }
使用組合的方法如下:
- class A
- {
- public void fun(){}
- public void breath(){}
- }
- class B
- {
- private A a;//將原來的父類嵌入原來的子類中,作爲子類的一部分
- public void funb(){}
- public B(A a)
- {this.a=a;}
- public void breath(){a.breath();}//實現複用}
- }
- class C {
- private A a;
- public C(A a)
- {this.a=a;}
- public void breath(){a.breath();}
- }
3.何時用繼承,何時用組合?
繼承是對已有的類進行改造,父類中主要是包含通用的屬性和方法,獲得的子類是一個特殊版本的類,將具有明顯繼承關係的兩個類使用繼承,比如動物和狗,狗不是由動物組成的,而狗可以繼承動物的通用屬性和方法,則使用繼承比較合適。
如果爲人和腿的話,則明顯腿是人的組成部分,使用組合比較合適。