前言
本文主要借助软件工程的思想作为出发点结合一些实例深究一下接口的作用及定义
一、什么是接口
在解释成员变量之前,本文需要再让读者熟悉一下接口是什么,以及接口的作用。
1.1、什么是接口?
接口可以理解为一个比抽象类还要抽象的“类”,它的属性变量类型只能为常量,方法只能为抽象类型。且属性和方法均需要为public,以供外部直接调用。
这也就表明了:接口对其拥有的每一个方法就仅仅只是方法而已,不能有任何实现体。即所有方法不能有的表述,完全需要凭借别人喜好修饰(高级“天沟”有没有,哈哈哈)、任劳任怨。
但从另一个角度来说,接口是不是也可以被理解为一个完全没有被勾勒的白纸,这个白纸可能有一些无法被改变的属性(例如:材质、基础色调等),同理类比之下“抽象类”就像一个已经初具成型的图画(类似小学课本中的杜甫很忙中的主角杜甫),可以被人随意勾勒,但是相比于“白纸”(接口)之外,“图片”(抽象类)已经具有了专属的一些形状(自身已经实现的方法,比如五官、衣着等)。当然你也可以对杜甫图片的某些部位的颜色进行涂改(此相当于抽象方法实现)。或者对杜甫“五官”做“外科整形手术”(类似于方法重写)。但总归来说,抽象类和接口各有各的特点,只是接口比抽象类来说,从纸张这个角度来将,它更像一个白纸一样。
二、接口作用?
2.1、设计模式角度
从软件工程的角度出发,设计模式有六大原则:单一职责原则、里氏替换原则、依赖倒置原则、接口隔离原则、迪米特法则、开闭原则。中依赖倒置原则和接口有着密不可分的关系。
依赖倒置原则:类A依赖于类B,但是若采用直接依赖关系的话,会提升设计的耦合度,因此为了降低类A与类B直接的耦合度,此时抽象出一个接口C,这个接口C包含类A和类B里面的公共方法及常量公A、B调用,此时A、B直接依赖于与接口C。
由此看出从软件工程的设计模式方向看,接口是帮
助解耦用的。
2.2、Java的三大特性角度
从Java的三大特性:封装、继承和多态来说的话。接口严格的体现了这三个特性。
1、封装
首先是封装,有人可能直接说了,接口的属性就是public的怎么会体现封装的思想呢,封装不就是把属性隐藏起来,仅供信任的成员调用(当然大多信任的都只是自己),从而保证数据的安全性吗。
在我看来,上段观点的后半段是封装的目的,而前半段只是手段而已。隐藏属性只是提供了一种保证安全性的方法,而若存在另外一种保证安全性的方法也不能讲它错误吧。接口就提供了另外一种保证数据安全性的方法-----将属性均变成公共常量。此时既保证了属性能被调用,也严格确保了属性的安全性。所以我说其提供了一个特别的“封装”。
2、继承
其次是继承:继承的本质是为了提升代码的重用性。相比于抽象类来说,接口提供了多继承的实现方式,相比抽象类来说多样性大大提升。但这一点应该就能确保接口严格体现了这一特性。并且继承来说,越高级的东西(另一种说法是约束性越小、范围越大)拥有的受众越高,其被继承的记录也应该越来越大。类似“人”要比“男人”约束力度要更小,范围也因此更高、重用性也更高。
3、多态
最后是多态:=-=好吧,虽然我是个“接口吹”,这个接口确实体现不出来,毕竟接口的定位就是不留余地的广大类群体提供基础无机的0添加配置,我们不提供“多态”,只为所有想实现“多态”的受众们提供平台(这话我好想在哪听过)。
三、接口属性为什么必须是常量?
接口的成员变量为public+static+final
public:该变量可以直接被外部调用。
static :该变量为类所共有,并不仅为某个实例拥有。
final :该变量一经赋值无法被修改。
此时其特点即呼之欲出:可以被调用、被子类拥有的唯一不可修改的常量。