簡體   English   中英

為什么在本示例中未調用子類方法,因為它在Java中是動態多態性中調用的?

[英]Why child class method is not called in this example as it is called in dynamic polymorphism in Java?

我已經做過一些研究,但是在下面的示例中我無法找到為什么運行時多態性沒有發生的原因。 根據我的理解,應該在孩子中調用foo(int a)。但是輸出的是“ Parent with long”。有人可以對此加以說明嗎?

class Parent {
public void foo() throws RuntimeException {
    System.out.println("Parent with no Parameter");
}

public void foo(long a) {
    System.out.println("Parent with long");
}
}

class Child extends Parent {
public void foo() {
    System.out.println("Child with no parameter");
}

public void foo(int a) throws RuntimeException {
    System.out.println("Child with int");
}
}

class Demo {
public static void main(String... args) {
    Parent p = new Child();
    int a = 10;
    p.foo(a);
}
}

輸出:

父母長

僅當方法具有完全相同的簽名(相同數量和類型的參數)時,多態性才適用。

您擁有的是具有2種方法的Parentfoo(long)foo() 從其父級繼承並添加兩個新的不同方法的Childfoo(int)和(該方法重載了現有方法) foo() (該方法覆蓋了繼承的方法)。

有不同的機制:什么在編譯時發生,什么在運行時發生。 在編譯時,編譯器只會相應地查看變量類型。 在運行時,執行環境。 將查看對象類型。

現在,在編譯調用p.foo(a) ,編譯器將查看p的類型(即Parent並在Parent類中查找相應的可調用方法。 它找到foo(long) ,然后在運行時(類型為Child )從intlong轉換為真實對象的方法foo(long)的動態調用。 但是此對象只有一個這樣的方法, Parent的一個,因此將調用此方法。

Childfoo(int)更改為foo(long) ,您將擁有所需的內容。

正如您所說,多態性是正確的。 您所看到的是編譯時多態性,這是超載的。

Child的方法已經在編譯時確定,因為在parent中沒有定義等效的方法,也沒有應用ovveriding(運行時多態)。

在Java中,多態性從頭到尾發揮作用。..您看到..在創建子對象時,實際上是在創建專利對象..當您的孩子擴展到專利時,它將永遠不會出錯。 所以..您實際上是在創建一個專利對象..根本不是一個子對象..這就是為什么它執行父母的方法..如果您想了解多態性是如何工作的..則只需創建Child對象= new Child() 。 然后傳遞Long或int變量。希望對您有所幫助

暫無
暫無

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

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