接口 interface
2021-05-07 本文已影响0人
想象之中丶意料之外
接口定义:
- 接口就是多个类的公共规范
- 接口是一种引用数据类型,其最终的内容就是类中定义的抽象方法
格式
public interface 接口名称{
// 接口内容
}
注意事项
- 接口当中的抽象法必须是两个固定的关键字:public abstract
- 两个固定的关键字【public abstract】可以选择性省略
- 方法的三要素【方法名、参数列表、返回值】可以根据业务随意定义
public interface DemoInterface {
// 这个是 抽象方法
public abstract void f1();
// 这个也是抽象方法
public String f2();
// 这个也是抽象方法
abstract String f3(int i);
// 这个也是抽象方法
void f4(int i, char[] chars);
}
接口使用
- 接口不能直接使用,必须要有一个“实现类”来“实现”该接口
- 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法
- 创建实现类对象【DemoInterfaceImpl demoInterfaceImpl = new DemoInterfaceImpl()】调用实现类中的实现方法进行使用
- 注意事项:同抽象类一样:如果实现类中没有覆盖重写(实现)接口中的所有抽象方法,那么该实现类自己就必须是一个抽象类
// 格式
public class DemoInterfaceImpl implements DemoInterface {
// 实现接口中的所有抽象方法
@Override
public void f1() {
// xxxx
}
...
@Override
public void f4(int i, char[] chars) {
// xxx
}
}
备注
- 类的关键字class 换成 interface后,编译生成的字节码文件仍然是:从 .java 到 .class 文件
interface类中可以包含的内容有
- java 7【常亮、抽象方法】
- java8【新增:默认方法、静态方法】
- java9【新增:私有方法】
Java 8 中接口【默认方法、静态方法】
1、默认方法
- 格式:public default 返回值类型 方法名称(参数列表) { //方法体 }
- 备注:默认方法可以解决接口升级时,带来的问题【一开始实现类已经全部实现了接口的抽象方法,但是由于接口升级需要,新增了一个方法,但是有不想影响到实现类,此时接口新增的方法,可以不用定义为抽象方法,而是定义为一个默认方,来处理对应的业务逻辑,这样就不会影响到实现类】
- 接口默认方法【public default void f1(){...}】是会被实现类自动继承下来。所以接口的默认方法可以通过实现类来直接调用
- 接口默认方法也可以被实现类覆盖重写(重新实现)
2、静态方法
- 格式:public static 返回值类型 方法名称(参数列表){ // 方法列表 }
- 备注:静态方法使用时,是直接通过【静态类.方法名】使用,不能通过实现类调用静态方法使用。【实现类Impl.方法名】。因为:一个接口可以有多个实现类。这样可能会产生冲突
Java 9 中接口【私有方法】
- 当接口中,【默认方法/静态方法】出现重复代码,需要抽取提炼重复代码时,【要求:该提炼重复代码的公共方法,是不允许实现类使用的】此时就可以通过私有方法来解决
- 格式:
1、privat static 返回值类型 方法名称(参数列表) { // 方法体 }【静态私有方法,解决静态方法的代码提炼】
2、public 返回值类型 方法名称(参数列表) { // 方法体 } 【解决默认方法的代码提炼】
接口常亮
- 格式:public static final 数据类型 常亮名称 = 数据值
- 注:
1、使用final 关键字修饰,表示值不可再变
2、接口中常亮,可以省略 public static final 三个关键字
3、接口中常亮,一定要在定义时进行初始化【因为java中 static final(静态常亮) 一定要在定义时进行初始化】
总结
- 成员变量其实是常量
- 接口中最重要的就是抽象方法【注意:实现类必须要覆盖重写接口中所有的抽象方法,除非实现类也是抽象类】
- Java8开始,接口允许定义默认方法【注意:默认方法也可以被覆盖重写】
- Java8开始,接口允许定义静态方法【注意:静态方法不能通过实现类对象调用,只能通过接口类直接调用】
- Java9开始,接口允许定义私有方法【注意:私有方法只有接口自己才能调用,不能被实现类或别人使用】
接口多实现类问题:
- 接口中,没有静态代码块 或者 构造方法
- 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口【implements xxx, yyy】
- 如果实现类,实现的多个接口时,接口中存在重复的抽象方法,那么只需要覆盖重写一次就可以
- 如果实现类没有覆盖重写所有的接口中的所有抽象方法,那么实现类必须是一个抽象类
- 如果实现类,实现的多个接口时,接口中存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写
- 如果实现类的父类方法与接口当中的默认方法冲突时,默认优先使用父类的方法
接口多继承
- 类与类时单继承的,直接父类只有一个。
- 类与接口之间是多实现的,一个类可以实现多个接口
- 接口与接口之间是多继承的
注意:
1、多个父接口当中的抽象方法如果重复,没关系【因为没有实现体】
2、多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的重写【不可省略default关键字,因为该类本省也是接口】