java - 多态性和静态方法

标签 java static polymorphism

我对此代码有疑问

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/

相关文章:

java - 规范化数据库有哪些优点?

c++ - C++中没有数据成员的类

c++ - 将本地 OpenCV Mat 变量声明为静态变量以防止重新分配

java - 退出java程序时出现问题,代码为 'Q'

java - 如何让 servlet 过滤器在 Tomcat 中的应用程序启动时停止加载?

java - 运行修改后的 Java 代码时出现问题

parsing - 为什么静态解析器生成器比动态解析器​​生成器更普遍?

java - 在 java 中,我们可以将父类(super class)对象传递给子类引用吗?

Java:重载 java.lang.Number 的(通用)方法

c++ - C++中的多态性