簡體   English   中英

關於 java 中的 equals() 方法,下列哪項是正確的?

[英]Which of the following are correct regarding an equals() method in java?

這是我的一次練習考試中讓我難過的問題。

潛在的答案

  1. An equals() method written in a class named C must have a parameter that is declared to be of type C, in order to override the equals() method in the Object class.

  2. 為了覆蓋 Object class 中的 equals() 方法,equals() 方法必須具有聲明為 Object 類型的參數。

  3. An equals() method written in a class named C must cast its parameter to Object, even if its parameter is declared to be of type C, otherwise it will not be able to properly compare the fields of current object to those of the parameter object .

  4. 設計良好的 equals() 方法應檢查並處理其當前 object 可能為 null 的情況

  5. 子類中的 equals() 方法不能直接引用超類中的私有字段來比較它們,因此它應該調用超類的 equals() 方法來執行此操作

答案是#2 & #5。 我不明白為什么 #1 是錯誤的而 #2 是正確的。 您不必將一種類型的 C 與另一種類型的 C 進行比較嗎? 以及為什么#5 是正確的。 我完全不明白這一點。 子類不能訪問超類的私有字段嗎?

我不明白為什么#1 是錯誤的

因為:

  1. Object::equals被定義為public boolean equals(Object) ,和

  2. public boolean equals(SomeType)不會覆蓋public boolean equals(Object) 這實際上是重載而不是覆蓋。 它們是不同的操作。


子類不能訪問超類的私有字段嗎?

一般來說,不,他們不能。 檢查你的講義。

有一些例外涉及在超類中聲明的子類。


從技術上講,答案 #5 只對了一半。

  • 假設我們停留在純 Java 的范圍內,子類不能訪問超類中的私有字段是正確的。 Java 訪問規則禁止這樣做。 (但見上文。)

  • 調用super.equals(other)可能是一個解決方案是正確的。 事實上,它通常是正確的解決方案。

  • 暗示調用super.equals(other)是唯一的解決方案是不正確的。

其他可能的解決方案可能包括:

  • 在測試相等性時忽略超類字段,
  • 使用公共 getter 訪問超類的私有字段......如果它們存在,或者
  • 通過破壞抽象的反射訪問私有字段。

在替代方案中,第一個很少適用,第三個是一個非常糟糕的主意。 但這些替代方案意味着答案#5(如書面)在技術上是不正確的。

如果這是你的實踐考試:你的課程材料沒有涵蓋這個嗎?

至於#1:方法簽名是public boolean equals(Object obj) ,所以這就是你必須覆蓋的。 任何其他簽名,它不是覆蓋,它是“一種完全不同的方法”。

至於#5: 這就是 private 的意思 這些字段是私有的 class 並且只有 class 如果子類應該可以訪問它們,那么它們必須受到保護,而不是私有的。

考慮C class 的以下等於方法。

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        C c= (C) o;
        return id == c.id;
    }

1 & 5 選項的解釋:

  1. 如果您聲明C類型的參數,則它不會被overriding

    錯誤:

方法不會覆蓋其超類中的方法

指示方法聲明旨在覆蓋超類型中的方法聲明。 如果使用此注解類型對方法進行注解,則編譯器需要生成錯誤消息,除非至少滿足以下條件之一: 該方法確實覆蓋或實現了在超類型中聲明的方法。 該方法的簽名與 Object 中聲明的任何公共方法的簽名等效。

  1. 超類無法訪問 class 的私有字段,因此需要調用超類的equals方法進行比較。

暫無
暫無

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

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