Java 为什么在子类已经重写父类的静态方法时调用它?

Java 为什么在子类已经重写父类的静态方法时调用它?,java,overriding,Java,Overriding,我对静态方法在子类中被重写时的行为感到困惑 代码如下: public class SuperClass { public static void staticMethod() { System.out.println("SuperClass: inside staticMethod"); } } public class SubClass extends SuperClass { //overriding the static method publ

我对静态方法在子类中被重写时的行为感到困惑

代码如下:

public class SuperClass {

    public static void staticMethod() {
        System.out.println("SuperClass: inside staticMethod");
    }
}

public class SubClass extends SuperClass {

//overriding the static method
    public static void staticMethod() {
        System.out.println("SubClass: inside staticMethod");
    }
}


public class CheckClass {

    public static void main(String[] args) {

        SuperClass superClassWithSuperCons = new SuperClass();
        SuperClass superClassWithSubCons = new SubClass();
        SubClass subClassWithSubCons = new SubClass();

        superClassWithSuperCons.staticMethod();
        superClassWithSubCons.staticMethod();
        subClassWithSubCons.staticMethod();

    }
}


Below is the output which we are getting :

    1) SuperClass: inside staticMethod
    2) SuperClass: inside staticMethod
    3) SubClass: inside staticMethod
为什么在第二种情况下调用超类的静态方法


若方法不是静态的,那个么根据多态性,当在运行时传递子类对象时,调用子类的方法

静态方法分辨率始终基于
参考
类型。
代码

superClassWithSuperCons.staticMethod();
superClassWithSubCons.staticMethod();
subClassWithSubCons.staticMethod();
编译后将转换为此

SuperClass.staticMethod();
SuperClass.staticMethod();
SubClass.staticMethod();

因此,它是对
超类
方法的调用,而不是子类方法。因此,您将获得
超类
方法的输出。

有趣的问题。我不熟悉底层机制,但似乎对于静态方法,解析方法调用时考虑的是声明的类型(在中间的示例中,
超类
),而不是实际的类型
子类
。它实际上是有意义的,因为在调用静态函数时,您没有查看对象的实际实例。

声明的方法不能被重写,但可以重新声明。这就是答案。 静态方法不与类的任何实例关联,因此该概念不适用。尝试使用相同的not static,您将看到不同之处

你的问题实际上是重复的:
静态方法被重新定义而不是重写

如果尝试重写静态方法,则它将被视为子类的非重写方法

静态方法将根据引用的类型而不是创建的对象来调用

有关更多信息,请访问页面。

这可能是一个很好的重复,而且子类只会在超类中“隐藏”静态方法@我已经详细说明了答案。请仔细研究一下。谢谢