为什么当子类已经覆盖它时,调用父类的静态方法?

时间:2013-09-14 17:17:32

标签: java override

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

以下是代码:

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

为什么在第二种情况下会调用超类的静态方法?

如果方法不是静态的,那么根据多态性,在运行时传递子类对象时会调用子类的方法。

4 个答案:

答案 0 :(得分:7)

静态方法分辨率始终基于Reference类型 代码

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

在编译后转换为此

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

对此进行控制是调用SuperClass方法而不是子类方法。所以你得到SuperClass方法的输出。

答案 1 :(得分:4)

声明静态的方法无法覆盖,但可以重新声明。这就是答案。 静态方法与类的任何实例都没有关联,因此该概念不适用。尝试相同而不是静态,你会看到差异。

您的问题实际上是重复的: Why doesn't Java allow overriding of static methods?

答案 2 :(得分:3)

有趣的问题。我不熟悉底层机制,但似乎对于静态方法,声明的类型(在您的中间示例中为SuperClass),而不是实际类型SubClass被认为是用于解析方法调用。它实际上是有道理的,因为在调用静态函数时你并没有查看对象的实际实例。

答案 3 :(得分:0)

重新定义静态方法而不重写...

如果您尝试覆盖静态方法,那么它将被视为子类的非重写方法。

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

有关更多信息,请访问该页面。 http://javaunturnedtopics.blogspot.in/2016/07/static-methods-are-redefined-not.html