簡體   English   中英

為什么調用父類方法?

[英]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類方法的簽名,因為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 在運行時, Child類的public String pubMethod(int i)方法將覆蓋它。

我認為你沒有正確創建你的子對象,你有:

Parent child = new Child();

但你應該:

Child child = new Child();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM