我一直在尝试使用静态方法的修饰符,并遇到了一个奇怪的行为。
众所周知,静态方法不能被重写,因为它们与类而不是实例相关联。
所以如果我有下面的代码片段,它编译得很好
//Snippet 1 - Compiles fine
public class A {
static void ts() {
}
}
class B extends A {
static void ts() {
}
}
但是如果我在类 A 中的静态方法中包含 Final 修饰符,则编译失败 B 中的 ts() 不能覆盖 A 中的 ts();重写的方法是静态最终的。
当静态方法根本无法被重写时,为什么会发生这种情况?
最佳答案
静态方法不能被重写,但可以隐藏。 B 的 ts() 方法不会覆盖(不受多态性影响)A 的 ts() 方法,但会隐藏它。如果您在 B 中调用 ts()
(不是 A.ts()
或 B.ts()
... 只是 ts ()
),B 中的函数将被调用,而 A 中的函数不会被调用。由于这不受多态性的影响,因此 A 中的调用 ts()
永远不会被重定向到 B 中的函数.
关键字final
将禁止该方法被隐藏。因此它们无法隐藏,尝试这样做将导致编译器错误。
关于java - 最终静态方法的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59979853/