设计模式之浅析面向对象编程语言的四大特性

浅析面向对象编程语言的四大特性:

面向对象编程简称OOP,是时下应该最广最普及的一种编程方式或者编程风格。对应的是面对对象编程语言。Java是目前最普及应用最广的面向对象编程语言之一。说的面向编程语言也就不得不说其四大特性:封装、继承、多态和抽象。下面在重新简单认识一遍:

封装:也叫作数据保护和信息隐藏。类仅暴露必要的访问函数,授权外部类来进行数据访问。在Java语言中通过private、public等权限访问关键字来实现控制。封装主要解决类不被暴露更多属性给调用,让调用者通过授权的函数方法来实现数据访问,并且调用者无需了解业务细节,降低调用者用错的概率。

继承:继承是用来表示两个类之间is-a的关系。在Java中通过extend关键字来实现,并且只支持单继承。继承最大的好处是代码复用。如果多个类具有相同的行为属性,就可把这些属性抽取到一个父类中,子类去继承父类,同时就拥有了这些行为和属性。

多态:父类声明子类实现,子类可以替换父类。通过重写父类的方法,在实际的运行过程中,调用子类实现的方法。在实际的编码过程中,多态提高了代码的可扩展性和代码的复用性。例如Java中的容器类,就是运用多态最明显的例子之一。

抽象:抽象并不面向对象编程语言的独有特性,但却也是很重要的一个特性。抽象的含义可以理解为隐藏方法的具体实现。比如接口类和抽象类就是最好的体现,当然还包括类中的函数方法等,因为函数方法隐藏了其中的具体实现细节,仅以api的形式暴露给调用者使用。基于接口编码降低了耦合性,代码之间的联系不依赖具体实现,从而提高了代码的可扩展性和可维护性,这就是抽象设计思想的具体体现之一。

引申问题:

Java为什么不支持多继承?

Java多继承会出现菱形问题,比如B和C同时继承A,并且重写了A的方法,D同时继承B和C并且继承了B和C的方法。当D调用方法时无法确定是调用B或C的方法,产生了菱形问题,也就是二义性问题。而Java的接口支持多实现,接口没有具体的方法实现,需要实体去具体实现方法,所有不存在二义性的问题。

继承的问题

继承是入侵式的,子类继承父类就必须拥有父类的行为和属性。当继承关系简单时,层次简单时,继承的优势最明显;但是如果层次较多时,继承却成了隐藏的bug,所以慎用继承。

接口和抽象类到底该如何使用?

相同点:

  • 1.都不能被实例化,它们都在继承树的顶端。
  • 2.接口和抽象类都可以有抽象方法,实现接口和继承抽象类的子类都必须实现这些抽象方法。

不同点:

(1)设计上:

  • 抽象类是一种模板模式设计,抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但这个产品依然不能当成终产品,必须有更进一步的完善,这种完善可能有几种不同方式。
  • 接口作为系统与外界交互的窗口,接口体现的是一种规范。对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式来提供);对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法)。当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。 从某种程度上来看,接口类似于整个系统的“总纲”,它制定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变。一旦接口被改变,对整个系统甚至其他系统的影响将是辐射式的,导致系统中大部分类都需要改写。

(2)用法:

除此之外,接口和抽象类在用法上也存在如下差别:

  • 1.接口里只能包含抽象方法(JDK1.8以后可以包括静态方法和默认方法及方法体),不包含已经提供实现的方法;抽象类则完全可以包含普通方法。
  • 2.接口里不能定义静态方法;抽象类里可以定义静态方法。(JDK1.8以后支持)
  • 3.接口里只能定义静态常量,不能定义普通变量;抽象类里则既可以定义普通变量,也可以定义常量。
  • 4.接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
  • 5.接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
  • 6.一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

使用场景:

如果为了表示的是is-a的关系,并且为了解决代码复用的问题就使用抽象类,如果是仅仅表示has-a的关系,只是为了解决抽象而非代码复用的问题就使用接口。设计上,抽象类是先有子类,在向上抽取;接口是每个类都必须存在接口,自上而下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值