多态在Java的方法参数中不起作用

2022-08-02 00:00:00 oop polymorphism java

我写了以下代码:

class Plane {}
class Airbus extends Plane {}

public class Main {

    void fly(Plane p) {
        System.out.println("I'm in a plane");
    }

    void fly(Airbus a) {
        System.out.println("I'm in the best Airbus!");
    }

    public static void main(String[] args) {

        Main m = new Main();

        Plane plane = new Plane();
        m.fly(plane);

        Airbus airbus = new Airbus();
        m.fly(airbus);

        Plane planeAirbus = new Airbus();
        m.fly(planeAirbus);

    }
}

结果为:

I'm in a plane
I'm in the best Airbus!
I'm in a plane

毫不奇怪,前两个调用分别给出I'm in a planeI'm in the best Airbus!

Plane planeAirbus = new Airbus();

该方法将该对象视为飞机,即使实际对象是一架空中客车。即使我将abstract添加到class Plane,也没有什么变化,最后一次调用的结果仍然是I'm in a plane

因此,问题是为什么多态在方法参数和调用中不起作用?这样做有什么目的吗?它是如何工作的?


解决方案

这里的问题是JAVA不支持方法参数的动态绑定。您看到的是静态绑定,即在编译时选择要调用的方法的重载。

另见:Static Binding and Dynamic Binding

相关文章