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

Bar*_*ach 10 java oop polymorphism

我写了下面这段代码:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

结果是:

I'm in a plane
I'm in the best Airbus!
I'm in a plane
Run Code Online (Sandbox Code Playgroud)

不出所料的两个第一调用给予I'm in a planeI'm in the best Airbus!分别.

Plane planeAirbus = new Airbus();
Run Code Online (Sandbox Code Playgroud)

该方法将此对象视为平面,即使真实对象是空中客车.甚至当我添加abstractclass Plane,没有什么变化和上次调用的结果仍然是I'm in a plane

所以问题是为什么多态在方法参数和调用中不起作用?有什么目的吗?它是如何工作的?

Mar*_*nke 8

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

另请参阅:静态绑定和动态绑定