![](/img/trans.png)
[英]Why parent class method is getting called and not child class in this case?
[英]Why is the parent class method called?
為什么在創建子對象時調用父類方法。 這甚至不是靜態方法。
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
具有所需名稱的唯一方法,因此這是所選方法。 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)
方法將覆蓋它。
我認為你沒有正確創建你的子對象,你有:
Parent child = new Child();
但你應該:
Child child = new Child();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.