当前位置: 首页 > 知识库问答 >
问题:

为什么我可以重写静态接口方法?[副本]

史逸春
2023-03-14

我找不到任何解释原因的好消息:

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
}

共有1个答案

祝宏放
2023-03-14

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

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

至于接口,接口中的静态方法是不继承的。因此,从技术上讲,它不是覆盖。在您的示例中,可以从类dd调用log(),或者从接口cc调用log()(在这种情况下,需要使用接口的名称调用它:cc.log())。它们是分开的方法。

 类似资料:
  • 为什么静态和默认接口方法不能同步? 人们说synchronized是一个实现细节。嗯,strictfp也是一个实现细节,但这并不妨碍在静态和默认接口方法上允许strictfp。 默认方法是继承的,如果实现接口的类不重写默认方法,那么将其同步可能非常方便。 我猜测synchronized(以及strictfp)不是继承的(我在这里说的对吗?),但这并不能解释为什么strictfp被允许用于静态和默认

  • 问题内容: 该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么? 上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public&abstract”。 问题答案: 这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别 和 由于Espo提到的原因,第一个是不可能的:你不知道哪个实现类是正确的定义。 Java

  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

  • 输出为"A的静态方法"。因此静态方法不会被重写,否则输出将是“静态方法B”。JVM如何在运行时决定调用类A而不是B的静态方法。

  • 我想为我的更改编写测试,但遇到了问题--更改是在静态方法内进行的。代码如下所示 我想要的是模拟方法A和B,并且doSomething和所有这些在方法C中使用的静态方法,但目前我找不到任何方法来做到这一点。你现在有吗?

  • 编译器在第3行给出了一个错误 此实例方法无法重写Abc中的静态方法 为什么静态方法不能被实例方法覆盖?