我想知道为什么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()。
答案 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,其缺点是类型不安全。对于类型安全的解决方案,您必须使用泛型。