关于java:为什么我们不能覆盖静态和最终方法?

Why is it that we cannot override static and final methods?

本问题已经有最佳答案,请猛点这里访问。

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


final方法不能被重写,因为这正是final设计的目的:它是一个表示"不要重写这个"的符号。

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


使用final避免覆盖。静态方法与类的任何实例都没有关联,因此该概念不适用。


不重写静态方法的原因是,静态方法被JVM视为全局方法,因此根本没有绑定到对象实例。同样,最终方法不能被重写,因为当您将一个方法称为最终方法时,这意味着您要对JVM说这个方法不能被重写。

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

A final method cannot be overridden or hidden by subclasses.[2] This
is used to prevent unexpected behavior from a subclass altering a
method that may be crucial to the function or consistency of the
class.[3]

A common misconception is that declaring a class or method as final
improves efficiency by allowing the compiler to directly insert the
method wherever it is called (see inline expansion). But because the
method is loaded at runtime, compilers are unable to do this. Only the
runtime environment and JIT compiler know exactly which classes have
been loaded, and so only they are able to make decisions about when to
inline, whether or not the method is final.[4]


无法重写final,因为这是关键字的用途,是不能更改或重写的内容。

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

如果你还没有读过Java的两个特性的继承和多态,那么你也应该尝试在问题中编写代码,这样用户就可以用一个例子来回答。


这里介绍静态方法。

无法重写final方法,因为"final"关键字的目的是防止重写。