簡體   English   中英

父類定義的方法如何在子類object中被調用?

[英]How does the parent class's defined method get called in a sub-class object?

這更像是一個與實現相關的問題,或者我可能想多了。 假設我有一個繼承自父 class 的子類。 據我了解,它將繼承父 class 的方法定義,而不是構造函數。 我們需要提供或者編譯器會通過super方法調用提供構造函數。 我們這樣做的原因是我們從子 class 中的父 class 獲得的方法定義將不存在,如果沒有父 class ZA8CFDE6331BD5B62AC69

這是否意味着,當我調用父 class object 定義的尚未在子類中覆蓋的方法時,將在父 object 實例的子類內部內部調用? 我在想會是這種情況,因為子類確實調用了父 class 構造函數並創建了它的實例。

我認為您被“構造函數”一詞誤導了。 如果措辭是“初始化器”,恕我直言,那會更清楚 - 但既定術語是“構造器”。

如果您的子類Sub擴展了父 class Parent ,則創建Sub實例不會創建第二個單獨的Parent實例。

當您的Sub構造函數調用super()構造函數時,這僅意味着Parent class 中描述的方面會按照Parent構造函數想要的方式進行初始化,例如用適當的值填充Parent中定義的字段。 這個super()構造函數調用不會構造/創建新實例,而是初始化唯一實例的Parent定義部分,這就是為什么我認為“構造函數”這個名稱具有誤導性。

super()調用之后,您的Sub構造函數可以自由地輪到它。 所有這些都發生在一個結合了兩個類的字段(和方法)的實例上。

因此,當您在Sub實例上調用Parent定義的方法時,沒有可能接收調用的不同Parent實例,這一切都發生在單個Sub實例上。 由於該方法是在Parent Parent Sub擴展一無所知,例如,不能訪問 Sub 中定義的字段(除非使用反射之類的“骯臟技巧”)。

如果您願意,您可以將Sub實例視為Parent實例,其中一些字段和方法已添加到末尾。 Parent定義的方法作用於實例的Parent部分(1),而Sub方法查看完整的實例。

我們這樣做的原因是我們從子 class 中的父 class 獲得的方法定義將不存在,如果沒有父 class ZA8CFDE6331BD5B62AC69

所以,這不是真的。 “父 class object 實例”不存在(至少在與子類不同的實例意義上不存在),它是子類實例的第一部分,然后是子類字段。

(1) 有一些注意事項,例如,如果在Sub class 中覆蓋了Parent方法,但恕我直言,這超出了此問題的 scope。

暫無
暫無

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

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