是否可以使用默认方法实现在基类中实现抽象方法

如果我有一个抽象方法的类:

abstract class Base { abstract void foo(); } 

和一个使用默认实现声明相同方法的接口:

 interface Inter { default void foo() { System.out.println("foo!"); } } 

我是否需要在实现/扩展两者的类中提供实现?

 class Derived extends Base implements Inter { } 

看起来这应该可行,但我得到一个编译错误, Derived不是抽象的,并且不会覆盖抽象方法foo

我猜这个类中的抽象方法比接口的默认方法“更重要”。

有没有一个很好的方法来使这项工作?

我的根本问题是我有一个三级抽象类层次结构( AB扩展CDE扩展FCF扩展G ),它将具有叶类的多个实现。 在每组实现中,有一些常用的方法在基类中定义,所以我希望写一下

 abstract class C extends G { abstract void foo(); abstract void bar(); abstract void quz(); void baz() { foo(); bar(); } } abstract class A extends C { void quz() { /* impl */ } } abstract class B extends C { void quz() { /* different impl */ } } interface C1 { default void foo() { /* impl for first set of classes */ } } class A1 extends A implements C1 { @Override void bar() { ... } // foo implementation from C1 } class B1 extends B implements C1 { @Override void bar() { ... } } interface C2 { default void foo() { /* impl for second set of classes */ } } class A2 extends A implements C2 { @Override void bar() { ... } // foo implementation from C2 } class B2 extends B implements C2 { @Override void bar() { ... } } 

只需从具体类中调用默认方法:

 @Override public void foo() { Inter.super.foo(); }