我试图理解为什么我们不能覆盖静态和最终方法。我没有得到它背后的目的。
答案 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用户可以回答一个示例。