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

用户名

让我们看一下这段代码:

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");
    }
}

我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法?

曼努蒂

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

如果满足以下所有条件,则在类C中声明或由类C继承的实例方法类C中重写另一个在类A中声明的方法mCmA

  • A是C的超类。

  • C不继承mA

  • 的签名的签名的子签名(第8.4.2节)mCmA

...

这部分定义的方法签名:

如果两个方法或构造函数M和N具有相同的名称,则它们具有相同的签名,并且具有相同的类型参数(如果有)(第8.4.4节),并且在将N的形式参数类型调整为类型参数之后M,形式参数类型相同。

的方法的签名是一个子签名的方法的签名,如果任一:m1m2

  • m2具有相同的签名m1

  • 的签名与的签名m1的擦除(第4.6节)相同m2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章