《Java编程的逻辑》笔记 18 - 为什么说继承是把双刃剑
2019-06-02 本文已影响4人
天一方蓝
为什么说继承是把双刃剑.png
继承的强大
(1)子类可以复用父类代码,不写任何代码即可具备父类的属性和功能,而只需要增加特有的属性和行为
(2)子类可以重写父类行为,还可以通过多态实现统一处理。
(3)给父类增加属性和行为,就可以自动给所有子类增加属性和行为
继承破坏封装
(1)封装就是隐藏实现细节
(2)继承可能破坏封装是因为子类和父类之间可能存在着实现细节的依赖
(3)子类和父类之间是细节依赖,子类扩展父类,仅仅知道父类能做什么是不够的,还需要知道父类是怎么做的,而父类的实现细节也不能随意修改,否则可能影响子类
(4)父类不能随意增加公开方法,因为给父类增加就是给所有子类增加,而子类可能必须要重写该方法才能确保方法的正确性
对于子类而言,通过继承实现,是没有安全保障的,父类修改内部实现细节,它的功能就可能会被破坏,而对于基类而言,让子类继承和重写方法,就可能丧失随意修改内部实现的自由
如何应对继承的双面性?
(1)避免使用继承
1.使用final关键字
2.优先使用组合而非继承
3.使用接口
(2)正确使用继承
1.基类是别人写的,我们写子类
重写方法不要改变预期的行为。
阅读文档说明,理解可重写方法的实现机制,尤其是方法之间的调用关系。
在基类修改的情况下,阅读其修改说明,相应修改子类。
2.我们写基类,别人可能写子类
使用继承反映真正的"is-a"关系,只将真正公共的部分放到基类。
对不希望被重写的公开方法添加final修饰符。
写文档,说明可重写方法的实现机制,为子类提供指导,告诉子类应该如何重写。
在基类修改可能影响子类时,写修改说明。
3.基类、子类都是我们写的
我们既写基类、也写子类,关于基类,注意事项和第二种场景类似,关于子类,注意事项和第一种场景类似,不过程序都由我们控制,要求可以适当放松一些。