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

时间:2013-11-29 09:14:33

标签: java

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

5 个答案:

答案 0 :(得分:51)

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

static方法无法覆盖,因为它们永远不会以多态方式调用:当您调用SomeClass.foo()时,始终将成为foo SomeClass的方法,无论是否有其他ExtendedSomeClass具有更加更加流畅的foo方法。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

wiki对决赛有一个非常重要的误解。请仔细阅读!

  

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

     

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

答案 3 :(得分:0)

涵盖静态方法here

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

答案 4 :(得分:0)

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

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

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