5

当静态方法在子类中被覆盖时,我对它的行为感到困惑。

下面是代码:

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

4 回答 4

7

静态方法解析始终基于Reference类型。
编码

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

编译后转成这个

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

根据这一点,它是对SuperClass方法的调用而不是子类方法。所以你得到了SuperClass方法的输出。

于 2013-09-14T17:19:15.040 回答
4

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

您的问题实际上是重复的: 为什么 Java 不允许覆盖静态方法?

于 2013-09-14T17:28:51.797 回答
3

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

于 2013-09-14T17:21:28.573 回答
0

静态方法被重新定义而不是被覆盖......

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

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

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

于 2016-07-22T05:58:26.320 回答