为什么我可以重写静态接口方法?

Ado*_*ali 6 java methods static interface

我找不到任何好的来源来解释原因:

abstract class AA {
    public static void log() {}
}

class BB extends AA {
    public void log() {} //error
}
Run Code Online (Sandbox Code Playgroud)
interface CC {
    public static void log() {}
}

class DD implements CC {
    public void log() {} //Ok
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*per 9

如果子类定义的静态方法与其父类中的另一个静态方法具有相同的签名,则子类中的方法将隐藏超类中的方法。这与通过以下两种方式重写实例方法不同:

  • 当您重写实例方法并调用它时,您将调用子类中的方法。
  • 当您对静态方法执行相同操作时,调用的版本取决于您从哪个类调用它。

对于接口来说,接口中的静态方法是不被继承的。因此,从技术上讲,这不是覆盖。在您的示例中,您可以log()从 class调用DD,也可以log()从 interface调用CC(在这种情况下,您需要使用接口的名称来调用它:)CC.log()。它们是单独的方法。

是关于重写方法的良好资源,涵盖类中的静态方法和实例方法以及接口中的静态方法。