接口
2025年3月25日大约 3 分钟
接口
- interface关键字 定义接口
- 接口不能创建对象
传统接口(jdk8之前)
- 只能写常量和抽象方法
- 接口中的方法默认都是public abstract的,常量默认是public static final的
public interface 接口名{ ... }
public interface Animal {
// 常量(默认是public static final的)
String NAME = "动物";
// 抽象方法(默认都是public abstract的)
void eat();
}
接口的作用
- 接口是用来被类实现的,实现接口的类被称为实现类,一个类可以同时实现多个接口
- 实现类实现多个接口,必须重写全部接口的抽象方法,否则也需要定义成抽象类
修饰符 class 实现类类名 implements 接口1,接口2,... {...}
接口的优点
- 接口可以解决Java单继承的局限性,一个类可以同时实现多个接口
- 程序可以面向接口编程,可以灵活方便的切换各种业务实现(利于程序的解耦合)
接口的新增方法(jdk8及之后新增)
默认方法(实例方法)
- default 修饰,默认会加上public
私有方法(jdk9开始支持)
- private 修饰
- 只能被本接口中的默认方法或静态方法调用(间接调用)
类方法(静态方法)
- static 修饰,默认会加上public
- 只能用接口名调用
接口的注意事项
- 接口与接口可以多继承,一个接口可以同时继承多个接口
- 类与类:单继承 一个类只能直接继承一个父类
- 类与接口:多实现 一个类可以实现多个接口
- 接口与接口:多继承 一个接口可以同时继承多个接口
interfaca A{...}; interface B{...}; // 接口与接口:多继承 一个接口可以同时继承多个接口 interface C extends A,B{...};
- 一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承,也不支持多实现
- 方法签名冲突:方法名相同,返回值、参数等不同
interface A{ void eat(); } interface B{ String eat(); }; // 不支持多继承,下面代码会报错 interface C extends A,B{...}; // 不支持多实现,下面代码会报错 class D implements A,B{...}
- 方法签名冲突:方法名相同,返回值、参数等不同
- 一个类继承了父类,同时实现了接口,如果接口和父类有同名方法,实现类会优先用父类的
interface A{ default void eat(){...}; } class B{ void eat(){...}; } class C extends B implements A{ // 不需要重写eat方法,因为C类会优先使用父类B的eat方法 eat(); // 如果非要使用接口的方法,就需要 接口名.super 去指定 A.super.eat(); }
- 一个类实现了多个接口,如果多个接口存在同名的默认方法,可以不冲突,则需要重写该方法
interface A{ default void eat(){...}; } interface B{ default void eat(){...}; } class C implements A,B{ // 重写eat方法,因为A和B接口的eat方法签名相同,所以需要重写 @Override public void eat(){ // 重写也可以调用接口的方法 A.super.eat(); B.super.eat(); } }