在代码的复用方面,java提供了复合,代理和继承三种方式。复合是显示的复用代码,继承是隐式的复用,而代理是复合和继承的中庸之道。这里最主要讨论下“复合优于继承”这一观点。
复合优于继承:继承的确在代码复用这一块做出了很大的贡献,通过继承我们可以给子类定义一些基本的属性,方法减少重复的代码。在同包下明确的is-a的关系,现有类就是用来继承的或者有很详细的说明文档的类中,继承是一个很不错的选择。但是对于不是很明确的关系等的情况下,继承并不是一个很多好的选择。继承破坏了面向对象思想中的封装特性,这是因为子类继承父类会对父类的封装进行重写而破坏原有的父类的封装。当子类不去覆盖父类的一些方法,并调用父类的方法,有可能调用的是父类的自用的代码,我们并不能保证父类的这些方法不会随着父类的更新而不改变,当父类改变的时候,那么子类可能就可能发生错误。
复合是将现有类作为新的类的一个私有域(一般情况下),这样不会对现有类进行任何的覆盖,保持现有类的封装,并且现有类的改变也不会对新的类造成影响。