Java组合和继承的区别
组合与继承都是为了复用代码,利用现有类型生成新类型。
组合是在新的类中产生现有类的对象,由于新的类是由现有类的对象所组成的,因而叫作组合。组合是一种"has-a"的关系,像是一种部分与整体的关系,类似于将很多整体的部分拿出来组合出来一个新的整体。如下所示:
public class FlyingTiger {
private Tiger tiger = new Tiger();
private Bird bird = new Bird();
...
}
public class Tiger {
...
public void jump(){...}
public void eat(){...}
...
}
public class Bird {
...
public void fly(){...}
public void lay_eggs(){...}
...
}
继承是按照现有类的类型来创建新类,无需改变现有类的形式,采用现有类的形式并在其中添加新代码。继承是一种“is-a”的关系,像是一种拷贝模板的关系,类似于将原有的模板原样拷贝过来然后在上面进行修改。如下所示:
public class Tiger {
...
public void jump(){...}
public void eat(){...}
...
}
public class Bird {
...
public void fly(){...}
public void lay_eggs(){...}
...
}
public class FlyingTiger extends Tiger {
...
public void fly(){...}
public void lay_eggs(){...}
...
}
很多情况下,其实使用组合是更优于继承的。因为Java只支持单继承,继承也算是一种资源,能少用还是要尽量少用,并且继承太多后会导致新类非常的笨重。而使用组合的话则更加方便一些,相当于要做一个新东西出来,只去取一些我们需要的零件来拼凑远比去将整体复制出来再修改容易很多。当然,对于某些比如在一直更新添加新东西的类型来说,继承是最佳选择。还可以将组合和继承结合来用,效果可能会更好,如下面所示。对于选择组合还是继承,还是要根据具体情况来具体对待。
public class Tiger {
...
public void jump(){...}
public void eat(){...}
...
}
public class Bird {
...
public void fly(){...}
public void lay_eggs(){...}
...
}
public class FlyingTiger extends Tiger {
...
private Bird bird = new Bird();
...
}