簡體   English   中英

從子類對象使用超類的getClass方法

[英]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.

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