在看一些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)中,所有方法都是public
和abstract
。
知道这一点,接口(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/