为什么在创建子对象时调用父类方法。这甚至不是一个静态方法。
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
类的方法的签名,因为Parent
是u
的编译类型类型。由于public String pubMethod(Integer i)
是Parent
具有所需名称的唯一方法,因此这就是所选方法。Child
类public 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
。在运行时,Child
类public String pubMethod(int i)
方法将重写它。
我认为您没有正确创建子对象,您有:
Parent child = new Child();
但你应该有:
Child child = new Child();