簡體   English   中英

使用超類的變量訪問派生類的對象

[英]Using a variable of a superclass to access an object of a derived class

我試圖在這個問題中解決這個問題。 當使用父類引用來引用子類時,我們調用父類的方法。

class Programmer {
    void print() {
        System.out.println("Programmer - Mala Gupta");
    }
}

class Author extends Programmer {
    void print() {
        System.out.println("Author - Mala Gupta");
    }
}

class TestEJava {
    Programmer a = new Programmer();
    Programmer b = new Author();
    b.print();
}

按照這段代碼,我得到這樣的輸出“作者 - Mala Gupta”; 盡管如此,我應該執行父級的方法。 你能向我解釋一下幕后發生了什么嗎?

您不應該得到“程序員 - Mala Gupta”輸出,因為您正在創建Author對象:

new Author();

Programmer在這種情況下只是對對象的引用 而這個引用可以指向Programmer及其子類的任何對象。

但是,當你調用一個方法時,你是在引用指向的對象上調用它。 那是Author

Programmer是父類和Author是孩子Programmer 父類包含子類對象的引用,但您只能調用父類中的那些方法。

Programmer b實際上有一個Author類的引用。 這就是它調用Author類函數的原因。 它稱為Polymorphism

當通過超類引用調用重寫的方法時,Java 根據調用發生時引用的對象類型確定要執行該方法的哪個版本。 因此,該確定是在運行時進行的。

被引用的對象的類型(而不是引用變量的類型)決定了將執行哪個版本的重寫方法。

因此,如果超類包含被子類覆蓋的方法,那么當通過超類引用變量引用不同類型的對象時,將執行不同版本的方法。 這就是你得到輸出的原因:作者 - Mala Gupta

這個概念與運行時多態有關 這里,引用變量“b”屬於父類(Programmer),對象屬於子類(Author)。

現在,引用變量“b”指向子(作者)類。

print()方法有兩種定義,一種屬於Programmer類,另一種屬於Author類。調用方法的確定是基於引用變量所引用的對象。 對函數的調用將在運行時解析的過程。

因此,每當您調用 b.print() 時,您都會得到如下輸出:

暫無
暫無

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

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