亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java:從子類調用 super.getClass()

Java:從子類調用 super.getClass()

Helenr 2021-09-03 14:44:18
我知道這里已經有人問過這個問題,但我不明白“為什么”部分。讓我們以下面的例子為例:public class First {    First() {       System.out.println(super.getClass());    }}public class Second extends First {    Second() {       System.out.println(super.getClass());    }}public class Third extends Second {    Third() {       System.out.println(super.getClass());    }}  當我實例化一個類型為 Third 的對象時:public class Main {    public static void main(String[] args) {        Third third = new Third();    }}輸出是:class Thirdclass Thirdclass Third  而我所期望的是(認為 super.getClass() 應該返回父類的名稱):class java.lang.Objectclass Firstclass Second這表明我不明白繼承在 Java 中實際上是如何工作的。請幫助我在腦海中獲得正確的概念。
查看完整描述

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是相等的,并且xy是相等的。equalsPoint3D沒有編寫完全不同的 實現,而是遵循 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 點時給出錯誤結果的方法。在實際環境中,您需要小心您的類層次結構及其含義。


查看完整回答
反對 回復 2021-09-03
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

getClass()是一種方法Object。每個子類都沒有單獨的一個。如果你想像那樣沿著鏈向上,調用getSuperclass()的結果getClass()


查看完整回答
反對 回復 2021-09-03
  • 2 回答
  • 0 關注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號