Java继承:为什么不调用子类的方法?

Java Inheritance: Why is it not calling the method of the subclass?

我想知道为什么 Java 使用 mA() 方法而不是 im(b) 方法调用子类方法。 我真的看不出它这样做的任何原因。 Java 如何决定调用哪个方法?

public class C {
    public static void main(String[] args) {
        A a = new B();
        B b = new B();

        a.mA();  // prints BmA
        a.im(b);  // prints Aim  --  Why not Bim?
        b.im(a);  // prints Aim  -- Why not Bim?
    }
}


public class A {
    public void mA() {System.out.println("AmA");};
    public void im(A a) {System.out.println("Aim");};
}


public class B extends A {
    public void mA() {System.out.println("BmA");};
    public void im(B b) {System.out.println("Bim");};
}

我希望 im(b) 的行为类似于 mA()。

编译器不知道它是 B 的实例,所以它不知道 B.im(B) 是要在那里调用的候选对象。

它确实知道它是 A 的一个实例,并且有一个名为 im 的方法,它接受一个 A 类型的参数;由于 B 也是 A 的一个实例,这就是它调用的方法。

因为参数类型。

im(B b) 不覆盖 im(A a)

参见:https://www.programcreek.com/2009/02/overriding-and-overloading-in-java-with-examples/

方法 im(A) 和 im(B) 不是重写等效的。如果您尝试使用 @Override 注释 im(B) ,您将收到编译器错误。只有具有相同签名的方法才是覆盖等效的。方法的签名由名称和参数类型组成。你的例子中的参数类型是不同的,即使 B 继承了 A.

如果要实现这一点,将参数类型改为Object即可,缺点是类型不安全。对于类型安全的解决方案,您必须使用泛型。