在Java中接口是多继承的,如果某一个类需要实现它需要实现它的所有方法,然而在Java8中,出现一个default 类型方法
,那么default方法名相同的可以如果被多继承是以哪个为准
准备工作:
A类
public interface A {
default void print(){
System.out.println("This is A Method");
}
}
B类
public interface B {
default void print() {
System.out.println("B Method");
}
}
C类 C继承自A
public interface C extends A {
@Override
default void print() {
System.out.println("C Method");
}
}
这样会出现两种情况
- 实现类 实现了A,也实现了A的子接口C
- 实现类 实现了A,也实现了B(它们都有相同方法名的default 方法)
class实现类1:
public static class MyDefaultMethod1 implements A,C{
}
开始运行:
public static void main(String[] args) {
MyDefaultMethod1 m1 = new MyDefaultMethod1();
m1.print();
}
运行结果:
C Method
结果表明:实现类运行的default方法是以C类覆盖A类的print方法的结果为准。
class实现类2:
public static class MyDefaultMethod2 implements A,B{
}
报错!
Error:(8, 19) java: 类MyDefaultMethod2从类型 A 和 B 中继承了print() 的不相关默认值
这里也出现C++中经常多继承出现的问题,找到的结果是多个,需要唯一指定该方法,所以,我们必须重写print方法
public static class MyDefaultMethod2 implements A,B{
@Override
public void print() {
//而且还可以分别调用
A.super.print();
B.super.print();
}
}
开始运行:
public static void main(String[] args) {
MyDefaultMethod2 m2 = new MyDefaultMethod2();
m2.print();
}
运行结果:
This is A Method
B Method
此外,这么写是错误❌的,因为已经被 A 已经被 它的子接口BExtendA 覆盖。
Error:(7, 14) java: 默认超级调用中的类型限定符com.xxx.A错误
冗余接口 com.xxx.A 已由 com.xxx.C 扩展
public static class MyDefaultMethod1 implements A,C{
@Override
public void print(){
A.super.print();
}
}