小编典典

多态和静态方法

java

我在这里有关于此代码的问题

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

我知道多态性不适用于静态方法,仅适用于实例方法。而且,对于静态方法而言,覆盖无效。

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

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

这样对吗?

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

是错字吗?因为我现在有点困惑。

请清除此,谢谢。


阅读 211

收藏
2020-11-16

共1个答案

小编典典

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

那完全是倒退。

c声明Car,因此静态方法调用由通过c将调用定义的方法Car
编译器c.m1()直接编译为Car.m1(),而不知道c实际包含Mini

这就是为什么您永远不要通过这样的实例调用静态方法的原因。

2020-11-16