为什么调用父class方法?

Why is the parent class method called?

为什么我在创建子对象时调用父 class 方法。这甚至不是静态方法。

class Parent {
    public String pubMethod(Integer i) {
        return "p";
    }
}

public class Child extends Parent {
    public String pubMethod(int i) {
        return "c";
    }

    public static void main(String[] args) {
        Parent u = new Child();
        System.out.println(u.pubMethod(1));  // Prints "p"   why??
    }   
}

这里我传递了一个原始的 int 。仍然转到父方法。

有什么解释吗?

当你调用u.pubMethod(1)时,编译器只考虑Parentclass方法的签名,因为Parent是[=的编译类型类型15=]。由于 public String pubMethod(Integer i)Parent 中唯一具有所需名称的方法,因此这是选定的方法。 Child class 的 public String pubMethod(int i) 不被视为候选人,因为 Parent 没有此类签名的方法。

在运行时,sub-class的方法,public String pubMethod(int i),不能覆盖super-class的方法public String pubMethod(Integer i),因为它有不同的签名。因此 Parent class 方法被执行。

为了执行 Child class,您必须更改其签名以匹配 Parent class 方法的签名,这将允许它覆盖 Parent class 方法:

public class Child extends Parent {
    @Override
    public String pubMethod(Integer i) {
        return "c";
    }
}

或者您可以向 Parent class 添加第二个方法,现有 Child class 方法将覆盖该方法:

class Parent {
    public String pubMethod(Integer i) {
        return "pInteger";
    }
    public String pubMethod(int i) {
        return "pint";
    }
}

在第一种情况下,编译器仍将有一个方法可供选择 - public String pubMethod(Integer i) - 但在 运行 时,Child class 方法将覆盖它。

在第二种情况下,编译器将有两种方法可供选择。它将选择 public String pubMethod(int i),因为文字 1 的类型是 int。在 运行 时间,Child class public String pubMethod(int i) 方法将覆盖它。

我认为您没有正确创建子对象,您有:

Parent child = new Child();

但你应该:

Child child = new Child();