【发布时间】:2020-05-03 18:50:25
【问题描述】:
我们期望使用该代码输出“ACBD”,但我们得到“ACBB”。为什么?
class A{
public void f(Object o){
System.out.println("A");
}
}
class B{
public void f(String s){
System.out.println("B");
}
}
class C extends A{
public void f(String s){
System.out.println("C");
}
}
class D extends B{
public void f(Object o){
System.out.println("D");
}
}
public class JavaApplication40 {
public static void main(String[] args) {
A a=new C(); a.f("mee");
C c=new C(); c.f("mee");
B b=new D(); b.f("mee");
D d=new D(); d.f("mee");
}
}
我认为a必须调用A类的f,c必须调用C类的f,b必须从B类调用f,d必须从D类调用f。但是看起来它改变了函数的参数。为什么?
【问题讨论】:
-
不同之处在于,超类 A 在函数 f 中使用 Object 作为参数,而 B 使用 String 作为参数类型。为了您对 ACBD 的期望,您需要将 B 和 D 的参数类型分别交换为 Object 和 String。
标签: java function object inheritance