java - 最终静态方法的行为

标签 java methods static final

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

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

所以如果我有下面的代码片段,它编译得很好

//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/

相关文章:

java - C 中的 fwrite() 和 Java 中的 readInt() 字节顺序不同

python - 如何在 Python 中访问全局变量?

tomcat - 在 Jersey 中调用 tomcat 启动的方法

java - 获取/设置非静态字符串为静态字符串以通过Java传递

使用 Swing 和 RXTX 进行 Java RS232 通信

java - 请求中的 GAE 错误代码 104 破坏了所有并发请求

wpf - 绑定(bind)源 vs x :Static

java - 静态内部类实例化 - ClassNotFoundException

java - 将数据从扫描仪写入阵列

iphone - 变量前面的 '&'符号有什么作用?