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