静态方法和多态性

static methods and polymorphism

我有一个简单的问题,但我找不到合适的答案。为什么下面的Java程序显示20?如果可能的话,我希望得到详细的答复。

class Something{
    public int x;
    public Something(){
        x=aMethod();
    }
    public static int aMethod(){
        return 20;
    }
}
class SomethingElse extends Something{
    public static int aMethod(){
        return 40;
    }
    public static void main(String[] args){
        SomethingElse m;
        m=new SomethingElse();
        System.out.println(m.x);
    }
}

因为多态只适用于实例方法。

这里调用了static方法aMethod

public Something(){
    x=aMethod();
}

指的是在Something中声明的aMethod

因为在classSomething中声明了int x。当你制作 SomethingElse 对象时,你首先制作一个 Something 对象(必须设置 x,它使用 Something 中的 aMethod() 而不是 SomethingElse (因为您正在创建一个 Something))。这是因为 aMethod() 是静态的,多态性不适用于静态方法。然后,当您从 m 打印 x 时,您打印 20,因为您从未更改过 x 的值。

静态方法的继承与非静态方法不同。特别是 superclass 静态方法不会被 subclass 覆盖。静态方法调用的结果取决于调用它的对象 class。变量 x 是在创建 Something 对象期间创建的,因此调用 class (Something) 静态方法来确定其值。

考虑以下代码:

public static void main(String[] args){
  SomethingElse se = new SomethingElse();
  Something     sg = se;
  System.out.println(se.aMethod());
  System.out.println(sg.aMethod());
}

它将正确打印 40、20,因为每个对象 class 调用自己的静态方法。 Java documentation 在隐藏静态方法部分描述了这种行为。