public class Main {
public static class ClassBase {
public void test() {
System.out.println("1");
}
}
public static interface Interface {
default void test() {
System.out.println("2");
}
}
public static class MyClass extends ClassBase implements Interface {
}
public static void main(String[] args) {
new MyClass().test();
}
}
在此示例中,它将始终打印1。
要打印2,我必须覆盖test
中的MyClass
并返回Interface.super.test()
。
有没有办法让Interface::test
方法覆盖ClassBase::test
方法,而无需手动覆盖MyClass
中的方法?
(在示例中打印2)
答案 0 :(得分:3)
如果层次结构中的任何类具有相同签名的方法,则默认方法变得无关紧要。默认方法不能覆盖java.lang.Object中的方法。原因很简单,因为Object是所有java类的基类。因此,即使我们将Object类方法定义为接口中的默认方法,它也将是无用的,因为将始终使用Object类方法。这就是为什么要避免混淆,我们不能使用覆盖Object类方法的默认方法。
结论:默认方法无法覆盖实例方法。