[英]Using a Superclass's getClass method from a Subclass object
我一共有三節課。 主要,動物(超類)和貓(子類)。 當我嘗試調用whatIsTheClass()方法時,我不理解輸出“ Cat”。 我期待看到輸出“動物”。 之所以期望輸出“動物”,是因為我相信從動物對象而不是貓對象調用方法whatIsTheClass(),因為子類不包含此方法。
主班:
package com.example.java;
public class Main {
public static void main(String[] args) {
Animal cat = new Cat();
}
}
貓類:
package com.example.java;
public class Cat extends Animal {
public Cat() {
super();
whatIsTheClass();
}
}
動物類:
package com.example.java;
public class Animal {
public void whatIsTheClass() {
System.out.println(this.getClass().getSimpleName());
}
}
我的理解是,在繼承中,子類不會從超類復制方法。 如果在Subclass對象中未定義被調用的方法,它將在Superclass對象中查找被調用的方法。 並且,如果在Superclass對象中定義了to方法的調用,則會從那里調用它。 在這種情況下,因為子類沒有定義它自己的whatIsTheClass()方法,所以它必須使用在超類對象中定義的whatIsTheClass()方法。 但是,如果從超類對象調用whatIsTheClass(),為什么它返回子類的名稱而不是超類的名稱?
方法whatIsTheClass
可以在Animal
中定義,但是調用類的代碼getClass()
則沒有區別。 如Javadocs中對getClass()
所述,這與對象的運行時類型有關:
返回此
Object
的運行時類。
cat
指定的對象的運行時類型為Cat
。
這也是為什么沒有任何類僅為了返回正確的Class
對象而必須重寫getClass()
。 (方法getClass()
仍然是final
的。)
創建Cat類的對象時,超類的所有方法和字段的副本將獲取該對象中的內存。 這就是為什么通過使用子類的對象,您還可以訪問超類的成員。 請注意,在繼承期間僅創建子類的對象,而不創建超類的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.