前言:上一节我们简单提到了面向对象的四大特性,这一节我们聊一聊每个特性存在的意义和目的,以及他们能够解决那些编程问题。
封装(Encapsulation)
封装也叫信息隐藏或者数据访问保护。类通过暴露有效的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。对于封装的特性,我们需要编程语言本身提供的一套机制来支持即访问权限控制。换句话说如果不对类内部的属性进行访问权限控制,属性可以被随意地修改,而且修改逻辑可能散落在代码的任意角落,势必会影响代码的可读性,可维护性,同时很容易造成数据的不一致。除此之外类仅仅暴露有限的接口,也能提高类的易用性。而且从业务角度考虑,只暴露封装好的接口,对业务不熟悉的人来说也是很友好的,减少了出错的概率。
抽象(Abstraction)
在java中我们通常借助接口和抽象类这两种语法机制来实现抽象这一特性。但是实际上抽象是非常容易实现的,并不依赖接口类和抽象类来实现抽象。其实类中的方法就是一种抽象,通过函数来包裹实现逻辑本身就是一种抽象,调用和使用函数时我们并不需要去来了解其实现逻辑,只需通过函数名、注释或文档等,了解其提供了什么功能,就可以直接使用了。而抽象的意义就是我们只需将有限的精力去关注功能而非实现的思路,正好能帮助我们大脑过滤掉许多非必要信息。
继承(Inheritance)
继承是用来表示类之间is-a的关系。继承本身是需要编程语言支持的。从继承关系上来说继承可以分为两种模式,多继承和单继承。继承最大的好处就是代码复用。继承的概念很好理解,也很容易使用。不过,过度使用继承,继承层次过深或过于复杂就会导致代码的可读性、可维护性就变差,另外子类和父类高度耦合,修改父类的代码会直接影响到子类。所以继承这个特性也是一个非常有争议的一个特性,很多人认为它是一种反模式,尽量少用或者不用。
多态(Polymorphism)
多态是指子类可以替换父类,调用子类的方法实现。多态特性能提高代码的扩展性和可复用性。理论上只要两个类具有相同的方法,就可以实现多态,并不要求两个类之间有任何关系,这就是所谓的duck-typing,是一些动态语言所持有的特殊语法机制,而想Java这样的静态语言,通过集成实现多态特性,必须要求两个类之间有继承关系,通过接口实现,类必须实现接口。同时,多态是很多设计模式、设计原则、编程技巧的代码实现基础,比如策略模式、基于接口而非实现编程、依赖倒置原则、里氏替换原则,利用多态去掉冗长的if-else语句等
|