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

时间:2019-01-25 12:17:38

标签: java inheritance overloading

我想知道为什么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()。

3 个答案:

答案 0 :(得分:4)

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

它确实知道它是A的实例,并且有一个名为im的方法,该方法采用类型为A的单个参数;因为B也是A的实例,所以它就是调用的方法。

答案 1 :(得分:3)

这是因为参数类型。

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

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

答案 2 :(得分:1)

im(A)和im(B)方法不是等效的。如果尝试使用@Override注释im(B),则会出现编译器错误。只有具有相同签名的方法才是等效的。方法的签名由名称和参数类型组成。即使B继承了A,示例中的参数类型也不同。

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