1.相同点:二者都是实现类重用的重要方式。
2.不同点:继承会破坏封装性。
例:
class A
{
public void fun(){}
public void breath(){}
}
class B extends A
{
public void funb(){}
}
class C extends A
{
public void func(){}
}
则B,C对象则能够访问A中的public方法和属性,在一定程度上破坏了类的封装性。
使用组合的方法如下:
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.何时用继承,何时用组合?
继承是对已有的类进行改造,父类中主要是包含通用的属性和方法,获得的子类是一个特殊版本的类,将具有明显继承关系的两个类使用继承,比如动物和狗,狗不是由动物组成的,而狗可以继承动物的通用属性和方法,则使用继承比较合适。
如果为人和腿的话,则明显腿是人的组成部分,使用组合比较合适。