为什么在创建子对象时调用父类方法。这甚至不是静态方法。
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
。仍然是父方法。
有什么解释吗?
答案 0 :(得分:4)
当您调用u.pubMethod(1)
时,编译器仅考虑Parent
类方法的签名,因为Parent
是u
的编译类型类型。由于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
。在运行时,Child
类public String pubMethod(int i)
方法将覆盖它。
答案 1 :(得分:0)
我认为您没有正确创建子对象,您有:
Parent child = new Child();
但是您应该拥有:
Child child = new Child();