《Thinking In Java》读书笔记——组合和继承的区别与选择

Java中要实现复用类,一般有两种实现方式:组合(has-a)和继承(is-a)。

概念:

组合是指,要复用一个类时,直接持有它的对象。

public class Car {
  // public or private, depends on the usage of client
  public engine e = new Engine();

}

class Engine {
  
}

以汽车为例,直接持有引擎对象,来达到复用的目的,此时汽车和引擎的关系是组合(has-a,汽车拥有引擎)。

public class Animal {

}

public class Dog extends Animal {

}

以狗类型为例,狗继承自动物,此时的关系是继承(is-a,狗是动物)。

使用:

复用代码,一般来说第一反应就是继承(extends),实际上这不完全正确,应该取决于你的实际使用场景。当需要向上转型(upcasting),来实现多态的时候才决定选用继承,否则尽量使用组合,继承会带来类型(class)之间关系的强耦合,容易造成类型混乱。

组合的使用上,持有对象一般使用private修饰,这样的目的是为了让Car对外的实现更透明,防止客户端对代码进行修改。除非需要让客户端了解细节,否则不要public。

上一篇:如何搞定Critical Thinking写作?


下一篇:认知模型:系统化思考的思维模型