最终静态方法的行为

新手上路,请多包涵

我一直在玩弄带有静态方法的修饰符,并遇到了一个奇怪的行为。

正如我们所知,静态方法不能被覆盖,因为它们与类而不是实例相关联。

所以如果我有下面的代码片段,它编译得很好

//Snippet 1 - Compiles fine
public class A {
    static void ts() {
    }
}

class B extends A {
    static void ts() {
    }
}

但是,如果我在类 A 中将 final 修饰符包含在静态方法中,则编译失败 ts() in B 无法覆盖 ts() in A;重写的方法是 static final

当根本无法覆盖静态方法时,为什么会发生这种情况?

原文由 Harish 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 330
2 个回答

静态方法不能被重写,但可以隐藏。 B 的 ts() 方法没有覆盖(不受多态性影响)A 的 ts() 但它会隐藏它。 If you call ts() in B (NOT A.ts() or B.ts() … just ts() ), the one of B will be called and不是 A。因为这不受多态性影响,所以 A 中的调用 ts() 永远不会被重定向到 B 中的调用。

关键字 final 将禁止方法被隐藏。因此它们不能被隐藏,并且尝试这样做将导致编译器错误。

希望这可以帮助。

原文由 NawaMan 发布,翻译遵循 CC BY-SA 3.0 许可协议

静态方法不能被覆盖

这不完全正确。示例代码实际上意味着 B 中的方法 ts 隐藏了 A 中的方法 ts。因此它并没有完全覆盖。在 Javaranch 上有一个很好的解释。

原文由 Vincent Ramdhanie 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题