为什么要调用父类方法?

时间:2018-06-24 11:37:37

标签: java inheritance override covariance

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

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。仍然是父方法。

有什么解释吗?

2 个答案:

答案 0 :(得分:4)

当您调用u.pubMethod(1)时,编译器仅考虑Parent类方法的签名,因为Parentu的编译类型类型。由于public String pubMethod(Integer i)Parent唯一具有所需名称的方法,因此已选择该方法。 public String pubMethod(int i)类的Child不被视为候选,因为Parent没有这种签名的方法。

在运行时,子类public String pubMethod(int i)的方法不能覆盖超类方法public String pubMethod(Integer i),因为它具有不同的签名。因此,将执行Parent类方法。

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

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

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

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

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

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

答案 1 :(得分:0)

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

Parent child = new Child();

但是您应该拥有:

Child child = new Child();