【问题标题】:Why is it that we cannot override static and final methods? [duplicate]为什么我们不能覆盖静态和最终方法? [复制]
【发布时间】:2013-12-15 10:19:06
【问题描述】:

我试图理解为什么我们不能覆盖静态和最终方法。我不明白它背后的目的。

【问题讨论】:

标签: java


【解决方案1】:

final 方法不能被覆盖,因为这就是 final 的设计目的:它是一个标语“不要覆盖它”。

static 方法不能被覆盖,因为它们永远不会以多态方式调用:当您调用 SomeClass.foo() 时,它将始终SomeClassfoo 方法,不管是否有另一个ExtendedSomeClass 有一个更时髦的foo 方法。

【讨论】:

  • 最棒的答案。
【解决方案2】:

final 用于避免覆盖。并且静态方法不与类的任何实例相关联,因此该概念不适用。

【讨论】:

    【解决方案3】:

    不覆盖静态方法的原因是静态方法被 JVM 视为全局方法,因此根本没有绑定到对象实例。同样,final 方法也不能被覆盖,因为当你说一个方法是 final 时,这意味着你对 JVM 说这个方法不能被覆盖。

    wiki 对 final 有一个非常重要的误解。请阅读!

    最终方法不能被子类覆盖或隐藏。[2]这 用于防止来自子类的意外行为改变 可能对功能或一致性至关重要的方法 类。[3]

    一个常见的误解是将类或方法声明为 final 通过允许编译器直接插入 方法被调用的地方(见内联扩展)。但由于 方法在运行时加载,编译器无法做到这一点。只有 运行时环境和 JIT 编译器确切地知道哪些类有 已加载,因此只有他们能够决定何时加载 内联,无论该方法是否是最终的。[4]

    【讨论】:

      【解决方案4】:

      here 涵盖了静态方法。

      final 方法不能被覆盖,因为“final”关键字的目的是防止覆盖。

      【讨论】:

        【解决方案5】:

        Final 不能被覆盖,因为这是关键字的目的,不能更改或覆盖。

        继承和多态的目的是让同一类的对象以不同的方式实现方法(不是名称,而是方法中的代码)。对象不能访问静态方法,因为它们是类的一部分而不是实例。因此,没有必要重写静态方法。你可以在子类中有一个同名的静态方法,但这不会是一个被覆盖的方法。

        如果您还没有阅读过继承和多态这两个 Java 的特性,您应该并且还尝试编写问题中的代码,以便 SO 用户可以通过示例进行回答。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-28
          • 2017-10-06
          • 2012-05-27
          • 2011-03-10
          • 2020-12-31
          • 2011-09-16
          • 2012-07-03
          • 1970-01-01
          相关资源
          最近更新 更多