2 回答

TA貢獻1784條經驗 獲得超8個贊
重要的是要認識到這里只有一個對象和一個引用??赡芎苋菀讓⑺尸F為好像超類是位于您的 Third 實例中的 Second 的單獨實例,但事實并非如此;無法引用該實例,因為它不存在。
需要明確的是:并不是在 Third 中有一個隱藏的 Second 實例super
所指代,在 Second 中有一個 First,在 First 中有一個 Object。相反,只有一個對象可以作為對象,第一、第二或第三。不管局部變量或引用的類型(“靜態類型”),實例本身都有一個“運行時類型”,即Third。
唯一super
能為您做的就是故意調用屬于超類 (JLS 15.11.2) 的成員,該成員可能通過覆蓋或命名隱藏。這在這里什么都不做,因為getClass()
是final
在 Object 上聲明的方法。getClass
有文檔說明它“返回此對象的運行時類”(docs)。不可能有不同的實現,因此您將始終像您在問題中所做的那樣收到類型 Third。
更新:不像getClass
,equals
是非final
,并且可以被覆蓋。Point.equals
確保返回的 ClassgetClass
是相等的,并且x
和y
是相等的。equals
Point3D沒有編寫完全不同的 實現,而是遵循 Point 的定義,equals
并額外檢查該z
字段是否相等,這是因為 Point 會檢查那個object.getClass() == this.getClass()
,而不是那個object.getClass() == Point.class
。它不能簡單地通過調用來做到這一點equals
,因為那會使用Point3D.equals
實現;相反,它必須調用super.equals
以查看 Point 將如何計算equals
。
但是,我希望這是課程中的一個示例,因為多態性斷言 Point3D 是一個 Point 并且可以做 Point 可以做的任何事情(請參閱Liskov 替換原則)。對于 Point 和 Point3D,這可能會產生誤導:您可以編寫一個double distanceBetween(Point a, Point b)
使用 2D 點按預期工作但在使用 3D 點時給出錯誤結果的方法。在實際環境中,您需要小心您的類層次結構及其含義。

TA貢獻1877條經驗 獲得超1個贊
getClass()
是一種方法Object
。每個子類都沒有單獨的一個。如果你想像那樣沿著鏈向上,調用getSuperclass()
的結果getClass()
。
添加回答
舉報