简短结论:Java 里“组合”很多时候可以替代“继承”,而且往往更推荐用组合;但并不能 100% 完全替代继承,要看场景。
下面说清楚。
经典设计原则:
“Favor composition over inheritance”(优先使用组合而不是继承)
耦合太强
破坏封装
单继承限制
层级容易膨胀
组合的本质:
“我拥有一个能力,而不是我就是一种能力”
class Bird {
void fly() {}
}
class Penguin extends Bird {
// 企鹅不会飞,但继承了 fly()
}
interface Flyable {
void fly();
}
class FlyAbility implements Flyable {
public void fly() {}
}
class Penguin {
private Flyable flyAbility; // 可以不赋
}
✅ 组合更灵活、更清晰
✅ 代码复用
class A {
void log() {}
}
class B {
private A a = new A();
}
✅ 行为扩展(策略、装饰器、委托)
class Service {
private Validator validator;
}
✅ 避免 is-a 关系不成立的继承
class Animal {}
class Dog extends Animal {}
狗确实是动物 ✅
abstract class Shape {
abstract double area();
}
Exception extends ThrowableThread extends Runnable(不严谨但类似)这些必须用继承
组合能替代“为了复用而存在的继承”,但不能替代“为了表达类型关系而存在的继承”。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。