多态性与静态方法

Evo*_*igh 10 java polymorphism static

我对此代码有疑问

public Car {
    public static void m1(){
        System.out.println("a");
    }
    public void m2(){
        System.out.println("b");
    }
}

class Mini extends Car {
    public static void m1() {
        System.out.println("c");
    }
    public void m2(){
        System.out.println("d");
    }
    public static void main(String args[]) {
        Car c = new Mini();
        c.m1();
        c.m2();       
   }
}
Run Code Online (Sandbox Code Playgroud)

我知道多态不适用于静态方法,只适用于实例方法.并且覆盖不适用于静态方法.

因此我认为这个程序应该打印出来:c,d

因为c调用m1方法,但它是静态的,所以它不能覆盖并且它在类Mini而不是Car中调用方法.

它是否正确?

但是,我的教科书说答案应该是:a,d

这是一个错字吗?因为我现在有点困惑.

请清楚这一点,谢谢.

SLa*_*aks 27

因为c调用m1方法,但它是静态的,所以它不能覆盖并且它在类Mini而不是Car中调用方法.

那完全倒退了.

c宣布Car通过由,因此静态方法调用c将调用定义的方法Car.
编译器c.m1()直接编译Car.m1(),而不知道c实际持有Mini.

这就是为什么你永远不应该通过这样的实例调用静态方法.

  • +1 For*这就是为什么你永远不应该通过这样的实例调用静态方法.* (4认同)