【问题标题】:Are there any legitimate reasons to hide static methods? [duplicate]隐藏静态方法有什么正当理由吗? [复制]
【发布时间】:2011-11-23 08:43:58
【问题描述】:

可能重复:
Why doesn't Java allow overriding of static methods?

是否有任何正当理由希望派生类覆盖隐藏基类的static 方法?

【问题讨论】:

  • 它们不能被覆盖。它们可以被隐藏。
  • @BalusC Semantics...无论如何,我认为没有人真正回答过这个问题。
  • ... errr,这不是问题所在。我的理解:如果可能,覆盖是否有意义
  • @BalusC 如果我能想到一个答案,我会的。

标签: java static method-hiding


【解决方案1】:

静态方法不能被覆盖

为了覆盖一个方法,该方法必须首先被继承。如果方法没有被继承,就没有机会被覆盖。因此,您永远不能覆盖私有方法,因为它们不是继承的。

【讨论】:

    【解决方案2】:

    撇开术语不谈,Java 中的静态方法确实有一种覆盖关系,二进制兼容性第 13.4.12 节暗示了这种关系。如果 T 扩展了 S,S 声明了 m(),T.m() 可以引用 T 或 S 中的方法,取决于是否在 T 中声明了 m();并且可以在 T 中添加或删除 m(),而不会破坏任何调用 T.m() 的代码。 (这意味着JVM的invokestatic指令会执行一种动态方法查找超类链)

    然而,这不过是麻烦。如果 T.m() 的含义默默地改变,那真的很危险,因为它现在指向不同的方法。 (实例方法应该继承契约,所以这不是问题;静态方法中没有这样的理解。)

    所以永远不要使用这个“特性”;该语言不应该启用它。

    良好实践:如果我们调用 T.m(),m() 必须在 T 中声明;并且在不首先删除所有 T.m() 的情况下,绝不应该将其从 T 中删除。

    【讨论】:

    • 完全同意永远不要使用它们。然而,这是可能的。你能想到任何合法的现实世界的例子吗?在我的 Java 职业生涯中,我从未遇到过它们。
    • 我也从来没有遇到过,所以肯定很少有人“覆盖”静态方法。我想我是在调查另一个棘手的问题时第一次知道的 stackoverflow.com/questions/6643648
    • +1 进行解释。但这正是我想知道的原因,如果这看起来不合逻辑(至少对我们大多数人来说)。
    • @Saket 一些想法在一开始似乎很出色;但所有的想法都必须经过时间的考验。在这种情况下,该功能显然没有通过测试;如果我们有时间机器,它应该被删除。
    • @BalusC:一种情况是,一个特定的类原来是一个更一般事物的特例,所以它得到一个新的、更抽象的超类,静态方法被移动到新的超类类,以便新代码可以访问它们而无需参考,现在是一种特定的实现。旧代码仍然会找到该方法,但是,如果您将存根方法保留在旧位置并委托给新方法,则同样可以。
    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 2020-04-10
    • 2020-10-26
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多