持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情
正如Java中所有事物一样,问题解决都是围绕着类展开的。
关键在于使用类而不破坏现有程序代码
复用实现有两种方式:
- 在新的类中持有现有类的对象,由于新的类是由现有类的对象组成的,这种方式被称为组合
- 按照现有类的方式创建新类。在现有的类上增添新功能,这种方式为继承,这种方式编译器会完成大部分工作。
组合
只需将对象引用置于新类中即可。
有一点需要注意:编译器并不是会为所有的引用都创建默认对象,引用会初始化的几个位置:
- 在定义对象的地方。会在构造函数之前被调用初始化
- 类的构造器中也会保证会被初始化
- 当在使用对象的时候在进行初始化,也被叫做惰性初始化,在不必立马用到或者不必要生成对象的时候用这种方式
- 当使用实例的时候
继承
导出类从外部来看就像是一个与基类具有相同接口的新类,额外增加一些属性和方法。但继承并不只是复制基类的接口。当创建了一个导出类的实例时,该实例包含了一个基;类的子对象。这个子对象与你直接创建基类是一样的。
基类的初始化
在构造器中调用基类构造器执行初始化,Java会自动在导出类的构造器中插入对基类构造器的调用。编译器会默认生成一个构造器,在这个构造器中会默认调用基类的构造器
代理
继承和组合的中庸之道
将一个成员对象置于所要构造的类中,在新构造的类中暴露该成员对象的所有方法。
使用代理可以拥有更多的控制力,可以选择只提供该成员对象中的某些方法。
如何选择
继承:新类是现有类的一种类型,"is a",是一个
组合:“has a”有一个
一个最清晰的判断就是是否需要对新类进行向上转型为基类。
如果需要向上转型就使用继承,如果不需要就考虑使用另外两种方式