调用超类方法而不是子类方法

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会改为调用父类,我该怎么做才能使其在子类中调用方法?

man*_*uti 3

SubClass#foo()不会覆盖,ParentClass#foo()因为它没有相同的形式参数。一个接受Object,另一个接受String。因此,运行时的多态性不会被应用,也不会导致子类方法执行。来自Java 语言规范

\n
\n

在类 C 中声明或继承的实例方法会覆盖在类 A 中声明的另一个方法,当且仅当满足以下所有条件时:mCmA

\n
    \n
  • A是C的超类。

    \n
  • \n
  • C 不继承.mA

    \n
  • \n
  • 的签名是 签名的子签名 (\xc2\xa78.4.2) 。mCmA

    \n
  • \n
\n

...

\n
\n

还有这一段定义了方法签名:

\n
\n

两个方法或构造函数 M 和 N 具有相同的签名、相同的类型参数(如果有)(\xc2\xa78.4.4),并且在将 N 的形式参数类型调整为参数M的类型,与形参类型相同。

\n

方法的签名是方法签名的子签名m1m2

\n
    \n
  • m2具有相同的签名m1具有与, 或

    \n
  • \n
  • 的签名与m1的签名的擦除(\xc2\xa74.6)相同m2

    \n
  • \n
\n
\n