【发布时间】:2017-02-18 05:58:32
【问题描述】:
class PolymorphisomTest {
class Base {
public void doTest(double d) {
System.out.println("From Base");
}
}
class DerivedBase extends Base {
public void doTest(int d) {
System.out.println("From Derived Base");
}
}
public void use(Base base) {
base.doTest(3);
}
public void run() {
use(new Base());
use(new DerivedBase ());
}
public static void main(String []cmd) {
new PolymorphisomTest ().run();
}
}
这里是来自父类的 doTest(double d) 和来自子类的 doTest(int d) 但是当我调用 base.doTest(3) 它总是调用父类方法,即使我的对象引用不同。背后的原因是什么?
【问题讨论】:
-
如果你使用
@Override注解,你会得到一个编译器错误,告诉你你没有覆盖任何东西。 -
但是当基对象引用是子类时,它也会调用父类方法。为什么它无法调用子类方法,因为我的对象引用了子类
-
看我的回答。通过将参数类型更改为
int,您将创建一个新方法,而不是覆盖父类。 -
Base 只有一个方法
doTest(double)调用的方法的签名是在编译时确定的,而不是运行时。 -
具有不同签名的方法不会相互覆盖。
标签: java