This question already has answers here:
Polymorphism in Overloaded and Overridden Methods
(4个答案)
3年前关闭。
这里是父类的 doTest(double d)和子类的 doTest(int d),但是当我调用 base.doTest(3)时,即使我的对象引用不同,它也会始终调用父类方法。背后的原因是什么?
更改参数的类型会更改方法签名,并使其成为新方法,而不是覆盖父类的方法。
调用
(4个答案)
3年前关闭。
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)时,即使我的对象引用不同,它也会始终调用父类方法。背后的原因是什么?
最佳答案
doTest(double d)
是与void doTest(int d)
完全不同的方法,因为它们具有不同的参数列表。实际上根本没有任何多态性。 DerivedBase
声明了一种新方法,而不是重载Base.doTest
。好像您已经这样做:
class Base {
public void doTest(double d) {
System.out.println("From Base");
}
}
class DerivedBase extends Base {
public void doSomethingElse(int d) {
System.out.println("From Derived Base");
}
}
更改参数的类型会更改方法签名,并使其成为新方法,而不是覆盖父类的方法。
调用
base.doTest(3)
时,编译器将调用doTest(double)
,因为这是Base
类中与参数匹配的唯一方法。由于该方法没有被任何方法覆盖,因此会调用Base.doTest
。09-15 14:55