这是我写的代码:
https://pastebin.com/raw/0iBrGJR4
最相关的部分:
A a = new A();
B b = new B();
System.out.println(((A) b).a());
System.out.println(((A) b).b(3));
static class A {
Object a() {
System.out.println("A.a()");
}
Object b(Number x) {
System.out.println("A.b()");
}
}
static class B extends A {
String a() {
System.out.println("B.a()");
return "hello";
}
String b(Integer x) {
System.out.println("B.b()");
return "hola" + x;
}
}
当我运行时,第一个打印显示
B.a()
hello
这是我的预期,因为即使我们转向A,呼叫也会进入对象的实际类型,即B。
但第二次打印,((A)b).b(3)调用,打印
A.b()
3
(即它调用A中的方法)。强制转换3到Integer也没有做任何事情。有人可以向我解释这种行为吗?我不明白原因是什么。我希望((A)b).b(3)打印B.() \n hola3
而不是使用父类方法。
答案 0 :(得分:2)
在Java中,一个方法覆盖父类中另一个方法的原因是它是否具有相同的名称,但参数的数量和/或类型不同。
在您的案例中,课程A
的方法b(Number x)
和课程B
扩展A
方法b(Integer x)
==> B.b()
不会覆盖A.b()
==>执行((A) b).b(b)
时,会执行A.b(3)
。
相反,B.a()
会覆盖 A.a()
==>执行((A) b).a()
时,会执行B.a()
。
方法的返回值在覆盖时无关紧要,只有名称和参数。