学习内容:
一、接口中的优先级问题
在我们使用接口的时候要注意一些问题,例如:
- 接口是没有静态代码块或者构造方法的。
- 一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。
格式:
public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {
//覆盖重写所有抽象方法
}
- 如果实现类所实现的多个接口当中存在重复的抽象方法,那么只需要覆盖重写一次即可。
- 如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类。
- 如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写。
- 一个类如果直接父类当中的方法,和接口中的默认方法产生了冲突,优先用父类当中的方法。
二、接口中的多继承
在学完类的继承之后,我们知道:类与类之间是单继承的,直接父类只能有一个;类与接口之间是多实现的,一个类可以实现多个接口。那么接口与接口之间的继承关系是如何的呢?
接口与接口之间是多继承的
也就是说:一个接口能继承另一个或者多个接口。
注意:如果多个父接口当中的抽象方法如果重复,那么没关系。但如果多个父接口当中的默认方法出现重复,那么就有关系。此时子接口必须进行默认方法的覆盖重写,【而且带着default关键字】
简单举例说明:
首先定义两个接口来作为父接口:
接口A:
public interface MyInterfaceA {
public abstract void methodA(); // 抽象方法A
public abstract void methodCommon(); // 重名抽象方法
// 重名默认方法,需要在子接口中进行覆盖重写
public default void methodDefault() {
System.out.println("AAA");
}
}
接口B:
public interface MyInterfaceB {
public abstract void methodB(); // 抽象方法B
public abstract void methodCommon(); // 重名抽象方法
// 重名默认方法,需要在子接口中进行覆盖重写
public default void methodDefault() {
System.out.println("BBB");
}
}
定义的子接口如下:
/*
这个子接口当中有4个方法:
methodA 来源于接口A
methodB 来源于接口B
methodCommon 同时来源于接口A和B
method 来源于自己
*/
public interface MyInterface extends MyInterfaceA,MyInterfaceB {
@Override
default void methodDefault() {
}
}