扩展类和实现接口之间的交互

时间:2017-07-14 20:03:15

标签: java interface java-8 default

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)

1 个答案:

答案 0 :(得分:3)

  

如果层次结构中的任何类具有相同签名的方法,则默认方法变得无关紧要。默认方法不能覆盖java.lang.Object中的方法。原因很简单,因为Object是所有java类的基类。因此,即使我们将Object类方法定义为接口中的默认方法,它也将是无用的,因为将始终使用Object类方法。这就是为什么要避免混淆,我们不能使用覆盖Object类方法的默认方法。

结论:默认方法无法覆盖实例方法。