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。