在看一些OOP资料时,我想到了这个让我有些困惑的问题:

考虑具有以下接口(interface),抽象类和具体类:

package one;

public interface A {

    void doStuff();
}

package one;


public abstract class B implements A {

    public abstract void doStuff();


}

class C extends B{


    public void doStuff() {

    }
 }

除非提供了doStuff()方法的实现,否则类C 将不会编译。
这里的问题:

1-是否是类中的doStuff()方法C 是接口(interface) A 的方法的实现,还是用于 B类中的抽象方法?更具体地说:JVM将如何
将该函数视为接口(interface)或抽象类的已调用函数?

2-抽象类 B 中的抽象方法doStuff()是否被视为接口(interface) A doStuff()方法的“实现”?因此这使得类 C 强制实现抽象类的doStuff()版本而不是接口(interface)的版本?

最佳答案

在接口(interface)中,所有方法都是publicabstract

知道这一点,接口(interface)A的doStuff实际上是public abstract void doStuff()。哪个应该看起来很熟悉,因为Abstract Class B具有相同的方法签名。

为了回答问题1,类B的doStuff()与接口(interface)A的doStuff()相同。由于Java中的所有方法都是virtual,因此无论您的C是声明为A,B还是C,调用doStuff()都是相同的。

至于问题2,不。 B的doStuff()是冗余代码,实际上不执行任何操作。无论B是否声明doStuff(),C都在实现A的doStuff()

关于Java抽象类实现一个接口(interface),两者具有相同的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15202185/

10-13 06:34