[英]Which of the following are correct regarding an equals() method in java?
這是我的一次練習考試中讓我難過的問題。
潛在的答案
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.
為了覆蓋 Object class 中的 equals() 方法,equals() 方法必須具有聲明為 Object 類型的參數。
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 .
設計良好的 equals() 方法應檢查並處理其當前 object 可能為 null 的情況
子類中的 equals() 方法不能直接引用超類中的私有字段來比較它們,因此它應該調用超類的 equals() 方法來執行此操作
答案是#2 & #5。 我不明白為什么 #1 是錯誤的而 #2 是正確的。 您不必將一種類型的 C 與另一種類型的 C 進行比較嗎? 以及為什么#5 是正確的。 我完全不明白這一點。 子類不能訪問超類的私有字段嗎?
我不明白為什么#1 是錯誤的
因為:
Object::equals
被定義為public boolean equals(Object)
,和
public boolean equals(SomeType)
不會覆蓋public boolean equals(Object)
。 這實際上是重載而不是覆蓋。 它們是不同的操作。
子類不能訪問超類的私有字段嗎?
一般來說,不,他們不能。 檢查你的講義。
有一些例外涉及在超類中聲明的子類。
從技術上講,答案 #5 只對了一半。
假設我們停留在純 Java 的范圍內,子類不能訪問超類中的私有字段是正確的。 Java 訪問規則禁止這樣做。 (但見上文。)
調用super.equals(other)
可能是一個解決方案是正確的。 事實上,它通常是正確的解決方案。
暗示調用super.equals(other)
是唯一的解決方案是不正確的。
其他可能的解決方案可能包括:
在替代方案中,第一個很少適用,第三個是一個非常糟糕的主意。 但這些替代方案意味着答案#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 選項的解釋:
如果您聲明C
類型的參數,則它不會被overriding
。
錯誤:
方法不會覆蓋其超類中的方法
指示方法聲明旨在覆蓋超類型中的方法聲明。 如果使用此注解類型對方法進行注解,則編譯器需要生成錯誤消息,除非至少滿足以下條件之一: 該方法確實覆蓋或實現了在超類型中聲明的方法。 該方法的簽名與 Object 中聲明的任何公共方法的簽名等效。
equals
方法進行比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.