尝试从一本关于方法覆盖的书中学习一个例子。 代码有两个类Veggies和Pumpkin。我唯一的困惑是如果南瓜的对象被分配给myveggie对象,为什么它调用veggies类的方法,因为对象来自派生类。 我确信这与静态方法有关,但我可以得到一个更明确的想法。
class Veggies {
public static void staticMethod(){
System.out.println("Veggies static method");
}
public void instancemethod(){
System.out.println("Veggies instance method");
}
}
public class Pumpkin extends Veggies{
public static void staticMethod(){
System.out.println("Pumpkin static method");
}
@Override
public void instancemethod(){
System.out.println("Pumpkin instance method");
}
public static void main(String[] args) {
Pumpkin myPumpkin=new Pumpkin();
Veggies myveggie=myPumpkin;
myveggie.staticMethod();
myveggie.instancemethod();
}
}
答案 0 :(得分:2)
正如这个问题:
解释说,静态方法无法在Java中重写。
您的示例中包含的是通过实例调用静态方法的代码。这是不好的做法。
实际发生的是变量的静态类型(不是引用!)在编译时被解析为类。在这种情况下,该类为Veggies
。然后编译器插入对该类的静态方法的调用;即Veggies.staticMethod()
。
这令人困惑......因为看起来应该调度到与引用关联的静态方法。但这不是Java的工作方式。
这就是为什么这是不好的做法,以及为什么很多IDE都会警告你。