Java静态方法vs overriding

时间:2018-03-07 14:25:22

标签: java override static-methods

尝试从一本关于方法覆盖的书中学习一个例子。 代码有两个类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();

        }
    }

1 个答案:

答案 0 :(得分:2)

正如这个问题:

解释说,静态方法无法在Java中重写。

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

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

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

这就是为什么这是不好的做法,以及为什么很多IDE都会警告你。