一个类继承父类的同时实现接口,当父类中的实例方法与接口中的默认方法冲突时,会调用父类中的实例方法还是会调用接口中的默认方法?
- 父类中的方法是public的
// 接口代码
public interface Inter {
default void show() {
System.out.println("接口中的默认方法!");
};
}
// 父类方法
public class Parent {
public void show() {
System.out.println("父类中的方法!");
}
}
// 测试类
public class Test extends Parent implements Inter {
public static void main(String[] args) {
Test test = new Test();
test.show();
}
}
运行结果:
调用的父类中的方法,可以理解为父类中的方法实现了接口中的默认方法。
- 父类的方法是protected或default
// 接口代码
public interface Inter {
default void show() {
System.out.println("接口中的默认方法!");
};
}
// 父类方法
public class Parent {
protected void show() {
System.out.println("父类中的方法!");
}
}
// 测试类
public class Test extends Parent implements Inter {
public static void main(String[] args) {
Test test = new Test();
test.show();
}
}
运行结果:
编译器报错,强制实现接口的方法。可以理解为父类中的方法修饰符范围小于接口中方法的修饰符范围,不构成重写,这样,就会导致类中有两个名字相同的方法,编译器报错,强制实现接口中的方法来规避这种错误。
- 父类中方法是private的
// 接口代码
public interface Inter {
default void show() {
System.out.println("接口中的默认方法!");
};
}
// 父类方法
public class Parent {
private void show() {
System.out.println("父类中的方法!");
}
}
// 测试类
public class Test extends Parent implements Inter {
public static void main(String[] args) {
Test test = new Test();
test.show();
}
}
运行结果:编译器报错,非法访问私有方法。可以理解为私有方法不能被继承,编译器会认为调用的是接口中的默认方法,所以编译通过;运行时,遵循类优于接口的原则,会去调用父类中名字相同的私有方法,导致出现运行期异常。