为什么调用父类方法?



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

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)时,编译器只考虑Parent类的方法的签名,因为Parentu的编译类型类型。由于public String pubMethod(Integer i)Parent具有所需名称的唯一方法,因此这就是所选方法。Childpublic String pubMethod(int i)不被视为候选人,因为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)方法将重写它。

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

Parent child = new Child();

但你应该有:

Child child = new Child();

相关内容

  • 没有找到相关文章

最新更新