Think in Java之复用

159 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

正如Java中所有事物一样,问题解决都是围绕着类展开的。

关键在于使用类而不破坏现有程序代码

复用实现有两种方式:

  • 在新的类中持有现有类的对象,由于新的类是由现有类的对象组成的,这种方式被称为组合
  • 按照现有类的方式创建新类。在现有的类上增添新功能,这种方式为继承,这种方式编译器会完成大部分工作。

组合

只需将对象引用置于新类中即可。

有一点需要注意:编译器并不是会为所有的引用都创建默认对象,引用会初始化的几个位置:

  • 在定义对象的地方。会在构造函数之前被调用初始化
  • 类的构造器中也会保证会被初始化
  • 当在使用对象的时候在进行初始化,也被叫做惰性初始化,在不必立马用到或者不必要生成对象的时候用这种方式
  • 当使用实例的时候

继承

导出类从外部来看就像是一个与基类具有相同接口的新类,额外增加一些属性和方法。但继承并不只是复制基类的接口。当创建了一个导出类的实例时,该实例包含了一个基;类的子对象。这个子对象与你直接创建基类是一样的。

基类的初始化

在构造器中调用基类构造器执行初始化,Java会自动在导出类的构造器中插入对基类构造器的调用。编译器会默认生成一个构造器,在这个构造器中会默认调用基类的构造器

代理

继承和组合的中庸之道

将一个成员对象置于所要构造的类中,在新构造的类中暴露该成员对象的所有方法。

使用代理可以拥有更多的控制力,可以选择只提供该成员对象中的某些方法。

如何选择

继承:新类是现有类的一种类型,"is a",是一个

组合:“has a”有一个

一个最清晰的判断就是是否需要对新类进行向上转型为基类。

如果需要向上转型就使用继承,如果不需要就考虑使用另外两种方式