use*_*612 5 java polymorphism inheritance overriding
让我们看一下这段代码:
public class ParentClass {
public void foo(Object o) {
System.out.println("Parent");
}
}
public class SubClass extends ParentClass {
public void foo(String s) {
System.out.println("Child");
}
public static void main(String args[]) {
ParentClass p = new SubClass();
p.foo("hello");
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法?
SubClass#foo()不会覆盖,ParentClass#foo()因为它没有相同的形式参数。一个接受Object,另一个接受String。因此,运行时的多态性不会被应用,也不会导致子类方法执行。来自Java 语言规范:
\n\n在类 C 中声明或继承的实例方法会覆盖在类 A 中声明的另一个方法,当且仅当满足以下所有条件时:
\nmCmA\n
\n- \n
A是C的超类。
\n- \n
C 不继承.
\nmA- \n
的签名是 签名的子签名 (\xc2\xa78.4.2) 。
\nmCmA...
\n
还有这一段定义了方法签名:
\n\n\n两个方法或构造函数 M 和 N 具有相同的签名、相同的类型参数(如果有)(\xc2\xa78.4.4),并且在将 N 的形式参数类型调整为参数M的类型,与形参类型相同。
\n方法的签名是方法签名的子签名
\nm1m2:\n
\n- \n
\n
m2具有相同的签名m1具有与, 或- \n
的签名与
\nm1的签名的擦除(\xc2\xa74.6)相同m2。