Java 静态方法和最终方法的重写

Java 静态方法和最终方法的重写,java,inheritance,overriding,Java,Inheritance,Overriding,我知道在Java中,static方法不能被子类覆盖 两个问题: 1.为什么?谁能解释一下里面的原因吗 2.子类是否可以覆盖超类中的final方法?静态方法不会在特定实例上调用,因此不能以多态方式调用它们。它们是在类型本身上调用的-绑定的任何内容都不依赖于仅在执行时可用的任何信息。多态调用的要点是,最终执行的方法实现取决于调用目标的执行时间类型;因此,静态方法调用没有目标 不,子类不能重写final方法-使方法成为final的全部目的是防止它被重写。为什么不自己尝试第2个方法呢?Java中的静态方

我知道在Java中,
static
方法不能被子类覆盖

两个问题:

1.为什么?谁能解释一下里面的原因吗


2.子类是否可以覆盖超类中的
final
方法?

静态方法不会在特定实例上调用,因此不能以多态方式调用它们。它们是在类型本身上调用的-绑定的任何内容都不依赖于仅在执行时可用的任何信息。多态调用的要点是,最终执行的方法实现取决于调用目标的执行时间类型;因此,静态方法调用没有目标


不,子类不能重写final方法-使方法成为final的全部目的是防止它被重写。

为什么不自己尝试第2个方法呢?Java中的静态方法无法在运行时动态解析,因此,它们不能有多态行为,重写静态方法也是毫无疑问的。@Leem.fin:您可以潜在地将类视为目标,但它肯定不会在执行时发生变化。当然,您可以在子类中的同一签名中声明另一个静态方法,但这不会覆盖-它会隐藏或隐藏它。这是非常不同的,理解为什么.@Leem.fin不应该通过实例调用静态函数非常重要。因此,调用静态类的唯一方法是像
Foo.bar()
这样的方法,在这里您可以显式地指定应该使用的类,因此动态分派没有任何意义。但是,没有什么能阻止您在子类中隐藏静态方法(除了良好的品味——隐藏静态方法的问题比所有其他情况都少,但我仍然会尽量避免)