文章目录
- 接口就是多个类的公共规范
- 接口是一种引用数据类型,最重要的部分就是其中的抽象方法
接口
接口的定义
public interface 接口名称 {
}
接口定义中可以包含哪些 组成部分:
- Java7:
- 常量
- 抽象方法
- Java8:
- 常量
- 抽象方法
- 默认方法
- 静态方法
- Java9:
-
- 常量
- 抽象方法
- 默认方法
- 静态方法
- 私有方法
接口中抽象方法的定义
- 首先要创建一个
interface
,interface
的创建与类的创建相似,只不过在kind
中选择interface
类型
- 与类中创建抽象方法的方式也类似,利用
public abstract 返回值类型 方法名称(参数列表);
- 接口当中的抽象方法,修饰符必须是两个固定的关键字
public
和abstract
- 这两个关键字可以省略,但是不能写别的,以下四种方法都是对的
- 接口当中的抽象方法,修饰符必须是两个固定的关键字
接口中抽象方法的使用
-
接口不能直接使用,必须使用一个 “实现类” 来实现该接口
-
使用格式:
public class 实现类名称 implements 接口类名称
-
接口的实现类必须覆盖重写(实现)接口中所有的抽象方法:去掉 abstract 关键字,加上方法体大括号
-
创建实现类的对象,进行使用
【注意事项】: -
如果该实现类中并没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是一个抽象类。
接口中的默认方法定义
- 从 Java 8 开始,接口中允许定义默认方法
- 格式:
public default 返回值类型 方法名称(参数列表){ 方法体 }
- 接口当中的默认方法,可以解决接口升级的问题
【常规使用接口的抽象方法】
- 假设现在创建了一个接口,里面包含了一个抽象方法
- 这个接口通过两个实现类来分别重写了抽象方法
- 创建这两个实现类的对象,并对方法进行调用
接口中默认方法的使用
【遇到接口升级的问题】
- 如果现在要对接口的功能进行增加,如果贸然地在接口定义中添加其他的 “抽象方法”,那么对于已经存在的实现类,需要把这些在接口定义中新增加的抽象方法重新重写到这些已经存在的实现类中,那么这是非常麻烦的工作
- 因此,这里就可以使用接口的默认方法来解决这些问题。
- 对于已经存在的接口,有实现类的情况下,就可以通过添加默认方法来拓展接口的功能,如下:
- 并没有在实现类 A B 中重写新添加的方法,但是还是可以方便地使用
接口中的静态方法的定义
- 静态方法的定义格式:
public static 返回值类型 方法名称(参数列表){方法体}
接口中的静态方法的使用
- 与类中的静态方法类似,静态方法在类中只与类有关,而与对象无关,在接口中,静态方法依然如此,只与接口本身有关,与最后的实现对象无关。
- 直接通过接口名称来调用静态方法,甚至不用创建实现类
接口中的私有方法的定义和使用
- 接口中的私有方法其根本目的是为了解决不同方法之间的代码重复问题:
-
普通私有方法为了解决默认方法之间的代码重复问题
-
静态私有方法为了解决静态方法之间的代码重复问题
-
接口中的常量的定义和使用
-
接口当中也可以定义 “成员变量”,但必须使用
public static final
三个关键字修饰,从效果上看,这其实就是接口的【常量】 -
定义格式:
public static final 数据类型 常量名称 = 数据值
public
代表谁都可以调用它,无论是接口范围内的方法还是接口范围外的static
代表它属于接口本身,而与对象无关,可以直接使用接口的名称调用final
代表它不可变- 接口中的常量,无论你是否写了这三个关键字,都是被这三个关键字修饰。如下的形式也照样被这三个关键字约束,因为这个
num
定义在Interface
里面
- 接口当中的常量必须 进行赋值,不能不赋值
- 接口中常量的名称,使用完全大写的字母,并且存在多个单词时,用下划线分隔
接口知识的总结
接口实现过程中的注意事项
-
接口不能存在静态代码块
-
接口不能存在构造方法:因为存在构造方法就能直接使用
new
来创建了,而接口不能直接用new
来创建。
-
虽然对于一个类来说,其直接父类是唯一的,但是 一个类可以实现多个接口
-
如果一个实现类在实现多个接口的时候,这多个接口中存在的抽象方法存在重名的现象,那么只需要覆盖重写一次即可。
A,B
接口中都存在抽象方法methodAbs
,但是在实现类中,只需要重写覆盖一次即可。
-
如果实现类(实现多接口的实现类)没有覆盖重写所有接口中的所有抽象方法,那么这个实现类就必须是一个抽象类
-
如果实现类所实现的多个接口中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
-
优先级:一个类如果直接父类当中的方法和接口当中的方法产生了冲突,那么优先考虑直接父类中的方法。
接口和类之间的关系
- 类与类之间是单继承的
- 类与接口之间是多实现的。一个类可以实现多个接口
- 接口与接口之间是多继承的,一个接口可以作为几个接口的子接口,同时具备几个父接口的方法。如下所示:
- 多个父接口当中的抽象方法如果重复,没关系,反正抽象方法没有方法体。
- 但是多个父接口中的默认方法如果重复,有关系,子接口进行默认接口的方法重写即可,而且必须要带着
default
关键字。