【问题标题】:How to override static methods in a subclass?如何覆盖子类中的静态方法?
【发布时间】:2017-07-11 12:39:36
【问题描述】:
  1. 计划在哪个版本的 Java 中实现覆盖静态方法的可能性?

  2. 是哪一年?

  3. 如何在 Java 8 中实现类似的功能?

  4. Oracle JVM 有什么技巧吗?

  5. 是否有其他一些虚拟机或编译器能够覆盖静态方法?

我发现 java 中的“静态”一词存在混淆。我真正在寻找的是类的方法,(如果您将它们命名为“静态方法”、“类方法”或其他任何名称,这无关紧要。)

【问题讨论】:

  • 静态方法不能被覆盖,因为它不与任何类的实例相关联。期间。
  • 您不能覆盖静态方法。您将无法覆盖静态方法。
  • @Yahya 理论上是不正确的,因为“类方法”可以被覆盖。在实践中,这也不是真的,因为有很多语言,是什么使它成为可能。问题在于,oracle 何时会在 java 中启用它......
  • @khelwood 对不起,我真的不明白,你想帮助什么?你是一个知道未来计划的预言机雇主吗?
  • 使用 JCP 讨论未来的功能。 不是甲骨文的某些人秘密做出此类决定。这是一个开放的社区进程。

标签: java class inheritance static overriding


【解决方案1】:

这就是为什么许多人认为 static 是良好 OOP 的异常的全部原因:它 杀死 多态性(除了引入 tight 耦合课间)。

因此,简单的答案是:overriding 和 static 不能一起使用。不适用于 8 或 9 之前的 Java 版本;并且最有可能:将来也不会 - 我不知道有任何计划/项目/JCP来改变这一点。

从这个意义上说,唯一的答案是:简单地避免使用它。

如果有的话,你可以把它放在“自包含”的小型辅助方法上(这意味着它们会做一些简单的功能性事情,在你的单元测试环境中运行良好)。一旦 static 进入您轻松单元测试代码的方式,您就走错了路。

当您在遗留代码中发现 static 时,您必须处理 - 然后考虑为底层功能定义一个接口,以便您可以将代码与实际的静态方法分离。

【讨论】:

  • 感谢您提供有用的文字。但主要是我正在寻找我原来问题的答案。所以,好的,对软件进行良好的设计很重要。但万一存在“类方法”,没有理由强迫程序员只使用一种方法来“类方法继承”(因为不允许继承它们)。
  • 好吧。这就是Java中的事情。在我看来,就近 20 年前做出的设计决定争论不休。
  • 泛型到了。这种类型的继承何时会出现?
  • 泛型解决了一个大问题。甚至这也是以“超级软”的方式完成的,以不破坏向后兼容性(从 JVM 的角度来看)。许多年后,我们仍然没有“真正的”泛型(适用于原始类型,或者是“可重构的”)。除此之外:genercis 不是从天上掉下来的。前期有几个项目要弄清楚如何去做。并进行了无数次的讨论。如前所述:我不知道有任何 JCP 会要求这样做。说真的:我用 Java 工作了 20 年,我认识一些曾经在 javac 工作过的人......
  • 换句话说:我对 Java 语言世界有一些的洞察力。猜猜看:我想你是我遇到的第一个人,他要求增强 Java 以允许多态静态调用。请让它沉入其中。在这里争论是没有意义的。如果你想要这个特性,你可以继续并提出一个 JCP 条目;并说服人们这是必需的。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2014-12-18
相关资源
最近更新 更多