在 Java(以及面向对象设计)中,**组合(Composition)和继承(Inheritance)**都可以实现代码复用,但适用场景不同。下面从原则、对比、选择建议三个层面说明。
class Animal {}
class Dog extends Animal {}
class Engine {}
class Car {
private Engine engine;
}
✅ 适合用继承的情况
Dog is an Animal❌ 不适合
✅ 适合用组合的情况
典型场景:
优先使用组合,而不是继承
——《Effective Java》
原因:
| 问题 | 选组合 | 选继承 |
|---|---|---|
| 是 is-a 吗? | 否 | 是 |
| 需要多态吗? | 不一定 | 是 |
| 父类稳定吗? | 不一定 | 是 |
| 想隐藏实现细节? | 是 | 否 |
| 想运行时替换? | 是 | 否 |
class Bird {
void fly() {}
}
class Penguin extends Bird {} // ❌ 企鹅不会飞
interface Flyable {
void fly();
}
class Penguin {
private Flyable flyable;
}
能组合就组合,只有真正“是一个”且关系稳定时才用继承。
如果你愿意,我也可以结合你当前项目或具体代码场景,帮你判断该用哪一种。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。