[英]Does the object of superclass created when object of derived class is created?
[英]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.