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

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

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

static方法不能被覆盖,因为它们永远不会以多态方式调用:当你调用SomeClass.foo()时,无论是否有另一个具有更多groovier foo方法的ExtendedSomeClass ,它都将是SomeClass foo方法。 。

final用于避免重写。 并且静态方法与类的任何实例都没有关联,因此该概念不适用。

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

维基对决赛有一个非常重要的误解。 读那个!

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

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

这里介绍了静态方法。

无法覆盖最终方法,因为“final”关键字的目的是防止覆盖。

最终不能被覆盖,因为这是关键字的目的,无法更改或覆盖。

inheritance和多态的目的是让同一个类的对象以不同的方式实现方法(不是名称而是方法中的代码)。 并且对象无法访问静态方法,因为它们是类的一部分而不是实例。 因此,无意覆盖静态方法。 并且您可以在子类中使用相同名称的静态方法,但这不是重写方法。

如果您尚未阅读有关Java的特性的inheritance和多态性,您应该尝试在问题中编写代码,以便SO用户可以回答一个示例。