我有一个简单的问题,我无法找到一个好的答案.为什么以下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);
}
}
解决方法:
静态方法的继承与非静态方法的工作方式不同.特别是超类静态方法不会被子类覆盖.静态方法调用的结果取决于它调用的对象类.变量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描述了隐藏静态方法部分中的此行为.