概述
接口,是 Java 语言中一种引用类型,是方法的集合,是一种规范
定义接口与定义类方式相似,但是使用interface
关键字。它也会被编译成.class 文件,但一定要明确它并不是类,而是另外一种引用数据类型。
引用数据类型:数组,类,接口。
接口的使用,它不能创建对象,但是可以被实现(implements
,类似于被继承)。一个实现接口的类(可以看做是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了。
定义格式
public interface 接口名称{
}
内容
在 java 9+版本中,接口内容可以有:
- 成员变量(其实是常量),格式:
[public] [static] [final] 数据类型 常量名称 = 数据值;
注意:
- 常量必须进行赋值,而且一旦赋值不能改变
- 常量名称完全大写,用下划线进行分隔
- 抽象方法(最重要)
[public] [abstract] 返回值类型 方法名称(参数列表);
注意:
- 没有方法体,该方法供子类实现使用
- 实现类必须覆盖重写接口中所有的抽象方法,除非实现类是抽象类
- 默认方法(从 java 8 开始)
[public] default 返回值类型 方法名称(参数列表) {方法体}
注意:
- 默认方法也可以被覆盖重写
- 静态方法(从 java 8 开始)
[public] static 返回值类型 方法名称(参数列表) {方法体}
注意:
- 应该通过接口名称进行调用,不能通过实现类对象进调用接口静态方法
- 私有方法(java 9 开始)
- 普通私有方法(解决多个默认方法之间重复代码问题)
private 返回值类型 方法名称(参数列表) {方法体}
- 静态私有方法(解决多个静态方法之间重复代码问题)
private static 返回值类型 方法名称(参数列表) {方法体}
注意:
- private 的方法只有接口自己才能调用,不能被实现类或者别人使用
- 接口中没有构造方法,不能创建对象
- 接口中没有静态代码块
实现
类与接口的关系为实现关系,即类实现接口。该类可以称为接口的实现类,也可以称为接口的子类。实现的动作类似继承,格式相仿,只是关键字不同,实现使用implements
关键字
非抽象子类实现接口:
- 必须重写接口中的所有抽象方法
- 继承了接口的默认方法,既可以直接调用,也可以重写
格式
class 类名 implements 接口名{
//重写接口中的抽象方法
//[重写接口中的默认方法]
}
接口的多实现
一个类只能继承一个父类。而对于接口而言,一个类是可以实现多个接口的,这叫做接口的多实现。并且,一个类能继承一个父类,同时实现多个接口。
格式
class 类名 [extends 父类名] implements 接口名1, 接口名2, 接口名3...{
//重写接口中抽象方法【必须】
//重写接口中默认方法【不重名时可选】
}
抽象方法
接口中,有多个抽象方法时,必须重写所有抽象方法。如果抽象方法有重名的,只需要重写一次
默认方法
接口中有多个默认方法时,实现类都可继承调用。如果默认方法有重名的,必须重写一次
静态方法
接口中存在重名的静态方法并不会冲突,原因是都只能通过各自的接口名来访问静态方法
优先级
当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
接口的多继承
一个接口能继承另一个或者多个接口,这和类之间的继承比较相似。接口的继承使用extends
关键字,子接口继承父接口的方法。如果父接口中的默认方法有重名的,那么子接口需要重写一次。
子接口重写默认方法时,default 关键字可以保留。
子类重写默认方法时,default 关键字不可以保留。