这是我编写的代码:
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
而不是使用父类方法。
最佳答案
在 Java 中,一个方法会覆盖父类中的另一个方法,因为它具有相同的名称,但参数的数量和/或类型不同。
在您的情况下,类 A
有一个方法 b(Number x)
和类 B
扩展 A
有一个方法 b(Integer x)
==> B.b()
在执行 时不会覆盖
, A.b()
==> ((A) b).b(b)A.b(3)
被执行。
相反,B.a()
在执行((A) b)时会覆盖
A.a()
==> .a(), B.a()
被执行。
方法的返回值在重写时并不重要,只有名称和参数。
关于Java 方法重写 - 使用参数时调用父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44361712/