Hi,你好。下面我们一起来学习接口。
接口或者称为interface, 那么接口呢,说起来复杂,
简单地说呢就是某种特征的约定,那比如说我们平时说
这个电源的,一个电源,插电源的这个接口,实际上是一种约定,我有几根针,有,有几根
那个引脚等等。那么也就是说,它是约定了这种接口,约定了这个特征,
在java里面呢,我们就定义一个接口呢,就实际上就定义一个interface。
这个在一定意义上呢,接口是一个
抽象得不能再抽象的这么一个类,它是就是约定某种特征,它不约定具体的,
也就是说,它不实现具体的,但是它只是说我们要某个特征,比如说在这个图里头,
我们设计一个叫做 Flyable可飞翔的,那么可飞翔的这个特征呢,
那你要约定它,约定这个可飞翔特征呢,我们是用三个方法来约定的。
它有起飞,它有飞翔,它有着陆。所以也就是说, 所谓的一个约定的特征呢,实际上是用几个方法名
当然包括参数了,来约定的。所以呢, 那么所谓的这些接口呢,它自动的都是public或abstract,
这个道理很简单,因为呢,因为你既然是特,约定嘛,那肯定是
公开的,又因为它只是一种约定,所以它不管实现,所以呢,
它是abstract的,这几个方法,我们都用斜体,在这个图里面一般用斜体来表示。
那当然这个接口呢,你要被别的类来实现,这个实现呢就implements。
那么实现呢我们不同的那个类都可以实现这个接口,比如说,
这里还写错了字,词bird鸟, 那么它可以飞翔,那么这个飞机呢也可以,
然后呢是超人他也可以,所以也就是说,这个特征呢可以被不同的
这个类来所实现,就是说你不同的类, 并且呢,我不考虑这个继承关系,我不管你什么继承关系。
那如果我们考虑实际的继承关系,比如说飞机它就是交通工具的子类,
然后这个鸟呢它就是这个Animal的子类,
所以在这个意义上来说呢,我们实现某种约定呢,我们不考虑这个类的
层次关系,所以继承关系无关。那java里面这个接口用得很多了,
甚至有一种说法叫做面向接口编程, 你看提高到多高的高度啊,它叫面向接口编程。
面向接口编程呢,而不是面向实现,比如说
我们经常写一个,一个方法,这个方法呢又需要一个参数,这个Flyable
我需要一个飞翔的,可飞翔的对象, 比如说我们编一个程序是飞翔的一个接力赛,
那我不管你是什么样的,飞机也好,你是个超人也好, 我只要管你可飞翔,我就可以用你。所以这样的话
我们这个呢,可飞翔的可以实际等于一个brid。
所以这样的话我们就,用起来就很方便了。Java里面呢
有大量的这种接口,所以要具体的实现呢
使用这个接口的时候我们可以用具体的某个实现,来,来,那个对象
来给它赋值,来代替它。所以在这个意义上呢,接口
它也是一个引用类型,也是 引用类型。实际上引用类型呢有三大类,一个是类class,
一个是呢我们说的interface,还有一个当然我们学过的,就是数组了。所以在这个- 意义上,
所以接口呢它也是一种 引用类型。那么
这个接口的作用如果我们再详细地来说呢,它可以实现呢 不相关类,比如说我们刚才是超人也好,飞机也好,
或者是鸟也好,它相同行为我们只关注它相同的特征,相同的这个可飞翔的特征,
而不用考虑这些层次关系。从而在一定意义上实现了多重继承。
我们可以让一个类来实现不同的特征,比如说它可飞翔,
比如说它可复制,比如说它可那个,可以写到磁盘,可以序列化等等。
所以这样一个类呢就可以实现多个特征,在一定意义上实现了多重继承。
就是这个好处是明显的,另外一个呢可以
指明多个类都需要实现的方法,所以它是一个抽象的
更抽象的,也就是有点像我们说C++里面纯虚的这么一个类。
所以另外一个呢,通过接口呢它可以 了解对象的交互界面,而不需管里面的实现,也就是说,
我现在需要一个参数,这个参数呢只需管它可飞翔, 这个怎么知道它可飞翔呢?它可以有三个方法,
那我不关心呢它这个对象具体对应的这个类。
所以总地来说呢,接口就是一种 更抽象的、更约定的一种
这种并且呢,可以帮助实现继承的一种
机制。那比如说我们下面就是一个接口,这个接口呢假设有一个
集合,或者翻译成收集。那这个接口里面呢可以,就是你怎么 定义它这个集合呢?可以往里加,可以减,可以delete,
可以查找,然后呢可以确定这个集合里面有
一共多少个元素size。所以,这就定义了集合。那么这个集合我们看,
它是用interface,当然interface前面也可以加public等等来 修饰。那这些方法呢自动都是public的,
abstract的,因为它没有实现。所以在实现的时候呢,我们一定要写个 public什么什么,那个public在实现的时候
这个方法呢一定要是public。
但这里呢,省略了,因为接口里面自动地就是public的。
这是我们刚才的接口的定义,接口的定义就是这样。
然后呢,一般说呢,接口呢也可以用什么什么 able或者什么,这是一种习惯,当然也不一定,比如说我们刚才那个集合,
也不一定写什么什么able。但经常用,比如说可克隆的,我们叫Cloneable等等- ,对吧?
另外呢,是 我们在实现的时候呢,就怎么实现呢?那你就是
某一个这个接口里面的 如果是接口的子接口,我们也可以用extends,
如果我们是类呢,那你在extends完了以后呢, extends类名后面还可以写多个接口,那这样的话,
它implements多个接口。所以这样呢我们就可以实现多重的继承。
当然定义这个方法呢,我们刚才提到了,public或abstract
这两个关键词呢是省略的。那么实现,那用implements,
用implements,这个实现比如说我们这里的,有一个 有一个collection我们就可以定义一个类,
first in first out这个序列它也是一个集合,那我们呢 就是可以用implements这个集合,
然后呢里面就要定义具体的这几个方法,我们就要实现它。
同时要注意,public这个修饰语。接口呢是一个引用类型,我们刚才
已经提到了,所以这个引用类型呢我们假设Collection的一个引用,
它可以等于,或者说赋值为,或者引用到一个我们
具体的一个类,所以,就是可以当它来使用。
你看这里,比如说我们可以说一个集合的引用,就可以等于
new一个这个具体的一个对象,就这是一个引用关系。
在一定意义上呢,我们也可以说,它是它的子类,当然,这里是
从接口的角度来说的。