最终静态方法的行为

2022-08-31 07:58:31

我一直在用静态方法玩弄修饰符,并遇到了一个奇怪的行为。

众所周知,静态方法不能被重写,因为它们与类而不是实例相关联。

因此,如果我有下面的片段,它编译得很好

//Snippet 1 - Compiles fine
public class A {
    static void ts() {
    }
}

class B extends A {
    static void ts() {
    }
}

但是,如果我在类 A 中包含对静态方法的最终修饰符,则编译失败 B 中的 ts() 不能重写 A 中的 ts();重写的方法就是静态最终方法

为什么在静态方法根本无法重写时会发生这种情况?


答案 1

静态方法不能被重写,但它们可以被隐藏。B的方法不覆盖(不受多态性)A,但它会隐藏它。如果您拨打B(不是或...只是),B的那个将被调用而不是A。由于这不受多态性的影响,因此 A 中的调用永远不会重定向到 B 中的调用。ts()ts()ts()A.ts()B.ts()ts()ts()

关键字将禁用该方法的隐藏。因此,它们无法隐藏,并且尝试这样做将导致编译器错误。final

希望这有帮助。


答案 2

不能重写静态方法

事实并非如此。示例代码实际上意味着 B 中的方法 ts 隐藏了 A 中的方法 ts。所以它并不完全是压倒性的。在Javaranch上有一个很好的解释。


推荐