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)它总是调用父类方法,即使我的对象引用不同。它背后的原因是什么?
答案 0 :(得分:0)
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
被调用。
答案 1 :(得分:0)
DerivedBase类从基类继承了你的doTest。现在,它有两种方法 - doTest(双d) doTest(int d)
您没有覆盖方法,但通过提供不同的参数来重载它。如果需要使用double作为参数覆盖doTest add方法。
它不调用doTest(int d)的原因是当我们从父引用调用时,它在编译期间搜索它们的方法并与它们绑定。并且在运行时,它的相同方法具有来自对象的相同签名。
答案 2 :(得分:0)
要覆盖方法,必须匹配派生类中的方法签名。当您从double
更改为int
时,您会创建一个新方法。来自Defining Methods - The Java Tutorials,
定义:方法声明的两个组件包括方法签名 - 方法的名称和参数类型。
@Override
注释可以保护您免受此特定类错误的影响。你可以做点什么,
class DerivedBase extends Base {
@Override
public void doTest(double d) {
System.out.println("From Derived Base");
}
}