簡體   English   中英

聲明一個Java對象但調用子類的構造函數

[英]Declaring a Java object but calling the constructor of a child class

假設有兩個 Java 類,Dog 和 Poodle。 Poodle 類擴展了 Dog 類。

創建這些類的實例時,這是常見的語法:

Dog myDog = new Dog();
Poodle myPoodle = new Poodle();

我不明白當您創建父類類型的對象然后調用子類構造函數時發生了什么,如下所示:

Dog myDog = new Poodle();

如果 myDog 是一個 Dog 類,我們為什么要調用它的一個子類的構造函數,這意味着什么? 為什么不創建一個子類(貴賓犬)類型的對象?

換句話說,我不知道這句話是什么意思:“我要創建一個 Dog 類型的對象,但我要調用它的一個子類的構造函數,即使這個對象不是子類類型”。

我無法理解這意味着什么。 請幫助我了解這里發生了什么。

編輯- 鏈接的重復問題確實似乎在問同樣的問題。 令人沮喪的是,該頁面上兩個最受好評的答案並沒有提供一個明確的例子,說明如何有意義地使用提問者特別詢問的代碼段:

Parent parent = new Child();

我理解並遵循了鏈接的重復問題上兩個最受好評的答案提供的所有代碼段。 我什至明白多態發生的地方。 但是這兩個答案都沒有使用問題中特別提到的代碼行。 如果有人能告訴我一個例子,我真的非常感激

Parent parent = new Child();

在更廣泛的代碼段中有用且有意義地使用。 請。 我真的,真的很感激。

這個概念叫做動態方法分派,通過使用這個運行時多態性(覆蓋)在java中實現。

讓我們擴展你寫的例子如下

class Dog{

public void bark(){
// parent class implementation
System.out.println("I bark");
}

}

這里我們定義了一個Dog類,它有一個叫做bark的方法並提供它的實現。

假設Dog有兩個子類: PoodleChihuahua ,如下所示。

class Poodle extends Dog{

@Override
public void bark(){
//Poodle implementation
System.out.println("I bark like Poodle");
}
}

class Chihuahua extends Dog{

@Override
public void bark(){
//Chihuahua implementation
System.out.println("I bark like Chihuahua");
}
}

PoodleChihuahua類都有bark方法的實現。

並且您創建了一個子對象並為其分配了一個父引用並調用 bark 方法,如下所示。

Dog dog1 = new Poodle();
dog1.bark(); //prints **I bark like Poodle**

在運行時 JVM 知道您有一個Poodle對象並檢查Poodle覆蓋了 bark 方法然后調用它。

當您執行以下操作時,可以在 Collections 中觀察到這種模式。

List<String> list = new ArrayList<>();
list.add("test string"); //this gets added according to ArrayList implementation.

暫無
暫無

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

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