Methods 抽象方法不指定试图实现超级接口方法的实体接口,因为JDK 8中存在编译时错误

Methods 抽象方法不指定试图实现超级接口方法的实体接口,因为JDK 8中存在编译时错误,methods,interface,java-8,abstract,implementation,Methods,Interface,Java 8,Abstract,Implementation,我目前正在尝试学习JDK 8的features和它的新特性,即我们可以在接口中实现方法。像这样 interface SuperInt { public static void method1() { // completely qualified System.out.println("method1"); } public default void method2() { // completely qualified Syste

我目前正在尝试学习JDK 8的
features和它的新特性,即我们可以在接口中实现方法。像这样

interface SuperInt {
    public static void method1() {  // completely qualified
        System.out.println("method1");
    }

    public default void method2() {   // completely qualified
        System.out.println("method2");
    }

    public void method3();   // completely qualified
}
但当我试图扩展这个接口并试图在子接口中实现它时,给出了一个编译时错误

抽象方法不指定主体

如果可以将实现的方法保留在接口中,那么当我们尝试在其子接口中实现超级接口的Abstract方法时,为什么会给出错误

但是当我试图扩展这个接口并在 子接口出现编译时错误

您没有尝试实现它,而是定义了一个新的抽象方法

public void method3() {  //  compile time error

}
如果要提供实现,请在方法声明前面加上
default
关键字:

public default void method3() {  //  compile time error
      ...
}

不能在
接口中实现抽象方法,并且
子int
仍然是
接口,而不是

interface SubInt extends SuperInt
正在尝试扩展接口,但没有实现它。为了实现它,你应该使用

public class SuperIntImpl implements SuperInt {
    @Override
    public void method3() {

    }
}
另一方面,
method2
是一种
default
方法,这就是它使用实现进行编译的原因


SubInt
SuperInt
SubInt
中使用默认重写实现的示例相关,希望此示例能够澄清以下问题:

public interface SuperInt {
    void method3(); 
    void method4();
}

public interface SubInt extends SuperInt {
    @Override 
    default void method3() { 
        System.out.println("Inside SubInt");
    }
}
虽然
SubInt
的实现现在可以选择覆盖或不覆盖
method3
仍然必须实现
method4

public class SubIntImpl implements SubInt {
    @Override
    public void method4() {

    }
    // can reuse the implementation of the 'method3'
}
对于
SuperInt
的任何实现,都必须同时实现
method3
method4

public class SuperIntImpl implements SuperInt {

    @Override
    public void method3() {
         // must have my own implementation
    }

    @Override
    public void method4() {
        // must have my own implementation
    }
}

“正在尝试扩展接口而不是实现它。”我想OP已经知道了,因为他们说“但是当我尝试扩展此接口并尝试实现它时”@Aomine我猜突出显示的部分回答了这个问题。不确定“你不能在接口中实现抽象方法”是什么意思因此,如果我有
接口SuperInt{public void method3();}接口SubInt扩展SuperInt{public default void method3(){}
,那么在我的理解中,我会说
SubInt
中的“method3”实现了“method3”在
SuperInt
@Aomine
中,默认的
方法不是
抽象的
然后。。在您提供的示例中,
SubInt
明确定义了
method3
(当然被覆盖)的默认实现,以便实现它的类可以使用该默认实现,而从SuperInt派生的类仍然可以选择具有不同的契约。。。。我的意思是,当在一个接口中你没有提供定义方法的分类器时,它会退回到
abstract
,因此你无法实现它。因为将方法设为默认值将导致method3()与超级接口完全不同,对吗。。。也许你也不应该放弃一个基本点,即没有接口的实现就不能使用接口。。因此,请理解为,
SubInt
的类实现将使用其契约,而
SuperInt
的实现将使用其契约。这是可行的,但在
的情况下不需要
default
关键字,对吗?如果说您正在定义一个新的抽象方法,那么您就说明超级接口的
method3
不会出现在子接口?@ArunSudhakaran“但是在类的情况下不需要default关键字,对吗?”默认方法只能在接口中使用。当您的类实现一个给定的接口时,它正在签署一个契约,这意味着它将被迫实现所有非默认方法。至于“你说你正在定义一个新的抽象方法,你是在说超级接口的method3没有出现在子接口中?”我说的是“method3”覆盖了
SuperInt
中的“method3”。我已经编辑了我的评论。假设我有一个抽象类和一个抽象方法,我正在将它扩展到另一个类中。在新类中,我将实现抽象方法,而不是重写它。我猜给抽象方法下定义是
实现
,重新定义超类方法是
oveerriding
@ArunSudhakaran正确的。当您为第一级继承实现一个
接口时,例如说
SuperIntImpl
,您实现了一个抽象方法(
implements
)。然后,如果另一个类
SubIntImpl扩展了SuperIntImpl
并定义了相同的方法,它将覆盖其实例的实现(
@override
)。我猜JDK使用的关键字与它们的用途有一个很好的类比。@ArunSudhakaran也试图在中解释这一点。旁注:接口中定义的方法默认为
public
@nullpointer,只是说我给了编译器一点帮助:)编译器甚至没有考虑它们,因为它们是多余的,考虑到从Java9开始,您还可以在接口中定义
private
方法,您可能只是对契约进行了明确说明。您只是忘记了在
SubInt
中向方法添加
default
public class SuperIntImpl implements SuperInt {

    @Override
    public void method3() {
         // must have my own implementation
    }

    @Override
    public void method4() {
        // must have my own implementation
    }
}