Java 静态方法与覆盖

Java static methods vs overriding

正在尝试处理一本关于方法覆盖的书中的示例。 该代码有两个 classes Veggies 和 Pumpkin.The 我唯一的困惑是,如果 pumpkin 的对象被分配给 myveggie 对象,为什么它调用 veggies class 的方法,因为对象来自派生class。 我确定这与静态方法有关,但我可以得到更清晰的想法。

 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();

        }
    }

作为这个问题:

  • Why doesn't Java allow overriding of static methods?

说明,在Java.

中不能覆盖静态方法

您的示例中的代码是通过实例调用静态方法的。这是不好的做法。

实际发生的是变量的静态类型(不是引用!)在编译时解析为 class。在这种情况下,class 是 Veggies。然后编译器插入对那个class的静态方法的调用;即 Veggies.staticMethod().

这令人困惑...因为看起来您应该 分派到与引用关联的静态方法。但这不是 Java 的工作方式。

这就是为什么这是不好的做法,也是为什么很多 IDE 会警告您的原因。