我对此代码有疑问
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
是不是打错了?因为我现在有点困惑。
请解决这个问题,谢谢。
最佳答案
Because c calls the m1 method, but it's static, so it can't override and it calls the method in class Mini instead of Car.
这完全是倒退的。
c
声明为 Car
,因此通过 c
进行静态方法调用将调用 Car
定义的方法.
编译器编译c.m1()
直接联系Car.m1()
,而不知道c
实际上持有 Mini
.
这就是为什么你永远不应该通过这样的实例调用静态方法。
关于java - 多态性和静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61940220/