拉風(fēng)的咖菲貓
2021-10-13 15:40:31
我一共有三個(gè)班。Main、Animal(超類)和 Cat(子類)。當(dāng)我嘗試調(diào)用 whatIsTheClass() 方法時(shí),我不明白輸出“Cat”。我期待看到輸出“動物”。我期望輸出“Animal”的原因是因?yàn)槲蚁嘈?whatIsTheClass() 方法是從 Animal 對象而不是 Cat 對象調(diào)用的,因?yàn)樽宇惒话朔椒?。主要類: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()); }}我的理解是,在繼承中,子類不會從超類復(fù)制方法。如果被調(diào)用的方法沒有在 Subclass 對象中定義,它會在 Superclass 對象中尋找被調(diào)用的方法。如果在 Superclass 對象中定義了被調(diào)用的方法,它將從那里調(diào)用。在這種情況下,因?yàn)樽宇悰]有定義它自己的 whatIsTheClass() 方法,它必須使用在 Superclass 對象中定義的 whatIsTheClass() 方法。但是如果 whatIsTheClass() 是從 Superclass 對象調(diào)用的,為什么它返回的是 Subclass 的名稱而不是 Superclass 的名稱?
2 回答

皈依舞
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
方法whatIsTheClass
可以在 中定義Animal
,但在哪個(gè)類的代碼getClass()
中調(diào)用沒有區(qū)別。這完全與對象的運(yùn)行時(shí)類型有關(guān),如Javadocs for 中所述getClass()
:
返回 this 的運(yùn)行時(shí)類
Object
。
由 指定的對象的運(yùn)行時(shí)類型cat
是Cat
。
這也是為什么沒有類必須重寫getClass()
才能返回正確的Class
對象。(方法getClass()
是final
反正。)

神不在的星期二
TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
當(dāng)創(chuàng)建 Cat 類的對象時(shí),超類的所有方法和字段的副本將在該對象中獲取內(nèi)存。這就是為什么通過使用子類的對象,您還可以訪問超類的成員。請注意,在繼承過程中,只會創(chuàng)建子類的對象,而不是超類。
添加回答
舉報(bào)
0/150
提交
取消