前言
接口与抽象类十分相似,也是很容易将两者混淆。
理解
接口,如其名好比一个封装的黑盒打开的一个口作为连接内部的通道。接口可以被认为是使用类的“客户”代码与提供服务的类之间的协议和契约。
利用接口也是解决了多重继承的问题。
定义
声明
1 | [public] interface 接口名 [extends 其他接口]{ |
public
修饰词在不填写的时候,默认是同包的类可以访问此接口。extends
可继承多个父类,父类间用,
隔开,而且子接口会完全继承父接口所有的常量和方法。
接口体
接口体内的成员修饰词不能使用reansient
,volatile
,synchronized
,private
和protected
。
接口常量
具有public
,final
和static
(三者同时拥有)。之所以只说常量,是因为和抽象类不同的是,接口不能实现构造方法,接口内的变量必须进行初始化成为常量。而且成员变量也是静态的可以通过接口名.变量
,因此接口常量不可以被修改。
1 | 类型 变量名 = value; //是个常量 |
如果在类中定义了与接口同名的变量时,使用时也只能作为此类的成员变量使用,其与接口的常量无关,接口常量只能使用接口名.变量
来访问。
接口方法
接口方法只能声明不能实现。
1 | 返回类型 方法名(参数); |
实现与使用
要使用接口必须先实现接口内所有的方法。
使用关键词implements
实现接口。
例如:
1 | //接口 |
当然一个类可以实现多个接口。
例如:
1 | interface Nutrient{ |
多重继承
一般一个类只能继承一个父类,但有时我们需要继承多个类来使得类更加完善,前面也说了,接口是为了实现多重继承而产生的。
例如, Brid需要继承Animal类和Fly类,可以做到:
1 | interface Animal{ |
通过继承扩展接口
有些时候,接口会随着人们的使用需要增加更多方法和常量。那么需要扩展的接口只需要继承扩展接口即可。
例如:
1 | interface A1{} |
但是有时可能会希望只有B接口的成员,为了避免此争议,就需要自行定义自己需要的接口利用此扩展方法扩展需要的接口即可。
接口与抽象类的比较
- 抽象类修饰词
abstract
,接口interface
- 接口内的方法都没有方法体,只有方法的声明
- 接口的成员变量必须初始化,且此成员是常量
- 类可以实现多个接口,但只能继承一个抽象类
- 接口与类没有体系的界限,任何类都可以实现接口,但抽象类有类的体系,处于最顶端。