《四》接口
一、接口基础知识
接口是抽象类的延伸,可以将它看作是纯粹的抽象类,对外进行约束,接口中的大多方法都没有方法体,jdk1.8以后,default关键字修饰的方法可在接口中实现。
- 属性全都是全局静态常量
- 方法都是全局抽象方法
- 无构造方法
接口使用interface关键字进行定义,其语法如下:
[访问修饰符] interface 接口名 [extends 父接口名列表]{ [public] [static] [final] 常量 = 值; [public] 返回值类型 方法名(参数项); [default] 返回值类型 方法名(参数项){//方法体} }
- 访问修饰符一般为public,也可不写,为默认时,该接口的访问权限仅局限于所属的包
- 接口名命名规范和类命名规范一样
-
extends 父接口名列表:可不写,用于指定要定义的接口继承于哪个父接口。
- 在接口中定义的任何变量都自动是static和final的,因此,在接口中定义变量时,必须进行初始化,而且,实现接口的子类不能对接口中的变量重新赋值,但常量在接口中没有意义,很少使用
- 一般方法在接口中没有方法体,而被default修饰的方法在jdk1.8后可在接口中实现。
- 由于接口中的方法大都是抽象的,因此,当子类实现接口时,必须实现接口中的所有不被default的方法
二、多重继承
在Java中类不允许多重继承,但使用接口就可以间接实现多重继承,一个类可以同时实现多个接口,这样就可以将所有需要实现的接口放置在implements关键字后并使用逗号“,”隔开,语法:
class 类名 implements 接口1, 接口2, …, 接口n{ //类成员 }
注意:每继承一个接口时都需要实现接口中所有的方法,这样一个类可能会有很多很多的代码,注释就很重要了,不然下次看就一脸懵逼 ?_?
使用多重继承时,可能出现变量或方法名冲突的情况,解决该问题时,如果变量冲突,则需要明确指定变量的接口,即通过“接口名.变量”实现;而如果出现方法冲突时,则只要实现一个方法即可。
接口也可以继承接口,和类继承类的使用方法一样,语法:
interface 子接口名 extends 父接口名{}
注意:接口继承接口,则子类在实现子接口时,需要同时实现父接口和子接口中定义的所有方法
三、区分抽象类和接口
虽然说java中的接口是抽象类型,抽象方法的集合,两者也有很多不同的地方。抽象类是对根源的抽象,而接口是对动作的抽象;抽象类的功能远超过接口,但一个类只能继承一个抽象类,而接口可多重继承,所以各有各的好处。
- 接口不能被实例化,没有构造方法,但抽象类可以有构造方法。
- 抽象类中可以有静态代码块等,接口中不可以。
- 子类只能继承一个抽象类,但可以实现任意多个接口。
- 一个类要实现一个接口必须实现接口中的所有方法,而抽象类不必。
- 抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final的。