我找不到任何好的资料来解释原因:
abstract class AA {
public static void log() {}
}
class BB extends AA {
public void log() {} //error
}
interface CC {
public static void log() {}
}
class DD implements CC {
public void log() {} //Ok
}
最佳答案
如果子类定义的静态方法与其父类中的另一个静态方法具有相同的签名,则子类中的方法隐藏父类(super class)中的方法。这与以两种方式覆盖实例方法不同:
- 当您覆盖实例方法并调用它时,您会调用子类中的方法。
- 当您对静态方法执行相同操作时,调用的版本取决于您从哪个类调用它。
对于接口(interface)来说,接口(interface)中的静态方法是不被继承的。因此,它在技术上不是覆盖。在您的示例中,您可以调用 log()
从类 DD
,或者您可以调用 log()
来自界面 CC
(在这种情况下,您需要使用接口(interface)名称调用它:CC.log()
)。它们是不同的方法。
This是覆盖方法的好资源,涵盖类中的静态方法和实例方法,以及接口(interface)中的静态方法。
关于java - 为什么我可以覆盖静态接口(interface)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63868869/