静态方法和多态

时间:2015-01-23 20:41:31

标签: java polymorphism method-overriding

我有一个简单的问题,我无法找到一个好的答案。为什么以下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);
    }
}

3 个答案:

答案 0 :(得分:8)

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

此处调用的static方法aMethod

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

指的是aMethod中声明的Something

答案 1 :(得分:1)

静态方法的继承与非静态方法的工作方式不同。特别是超类静态方法不会被子类覆盖。静态方法调用的结果取决于它调用的对象类。变量x是在Something对象创建期间创建的,因此调用该类(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。 Java documentation在隐藏静态方法部分中描述了这种行为。

答案 2 :(得分:0)

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