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

为什么我们不能覆盖静态和最终方法?[重复]

沙小白
2023-03-14

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

共有3个答案

吴松
2023-03-14

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

维基对期末考试有一个非常重要的误解。一定要读!

最后一个方法不能被子类重写或隐藏。[2] 这用于防止子类更改方法时出现意外行为,该方法可能对类的功能或一致性至关重要。[3]

一个常见的误解是,将类或方法声明为最终方法可以通过允许编译器在调用方法的任何地方直接插入方法来提高效率(参见内联扩展)。但是因为方法是在运行时加载的,编译器无法做到这一点。只有运行时环境和即时编译器确切地知道加载了哪些类,因此只有它们能够决定何时内联,无论方法是否是最终的。[[4]

庄实
2023-03-14

用于避免重写。静态方法与类的任何实例都不相关,因此这个概念不适用。

邹野
2023-03-14

final方法不能被重写,因为这就是final的设计目的:它是一个符号,上面写着“不要重写此”。

static方法不能被重写,因为它们从未以多态方式被调用:当您调用SomeClass时。foo()它将始终是SomeClassfoo方法,无论是否有另一个ExtendedSomeClass具有更常规的foo方法。

 类似资料:
  • 不允许在接口中使用静态/最终方法的原因到底是什么?

  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创

  • 问题内容: 我很困惑为什么不允许以下内容: 我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的? 我希望所有类都可以实现该方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法… **_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。 问题答案: 在Java中调用静态方法要

  • 问题内容: 为什么上面的代码片段是错误的? 问题答案: 我将尝试结合其他答案中的想法来提出一个答案。 首先,让我们看一下代码中正在发生的事情。 看一下代码 本类有一个包私有方法: 在该子类的类的类,并且所述方法是被覆盖的,但具有访问修饰符。 问题 Java语言不允许子类降低子类中方法,字段或类的可见性,因此,降低该方法可见性的类是不合法的。 为什么降低可见度是一个问题? 考虑我们要使用该类的情况:

  • 我从一个有静态方法的类(B)扩展了一个类(a),然后在另一个类(C)中,我创建了一个类(a)的实例,并且我能够访问类B的静态方法。为什么会这样? A类: B类: C类:

  • 问题内容: 为什么我们不能在非静态内部类中使用静态方法? 如果我将内部类设为静态,则它可以工作。为什么? 问题答案: 因为内部类的实例与外部类的实例隐式关联,所以它本身不能定义任何静态方法。由于静态嵌套类无法直接引用其封闭类中定义的实例变量或方法,因此只能通过对象引用使用它们,因此在静态嵌套类中声明静态方法是安全的。