我對以下場景中首先呼叫的內容有些困惑:
我有一個帶有姓名和年齡的 Person 類。
public class Person {
private int age;
private String name;
//constructor, getters, ...
}
我現在嘗試比較兩個Person具有相同欄位值的單獨物件,即相同的名稱,相同的年齡
System.out.println(person1.equals(person2));
我顯然收到了一個false回傳值,因為我還沒有多載該equals(Obj object)方法。
但是說我沒有多載它,而是寫了另一個equals()只帶Person引數的方法:
public equals(Person person) {
return person.get_age()==this.age && person.get_name().equals(this.name);
}
現在呼叫哪個方法,為什么?下面的行仍然回傳false
System.out.println(person1.equals(person2));
除非我強行person2將其解釋為Person. 因此,下面的行回傳true
System.out.println(person1.equals((Person)person2));
這就是讓我困惑的地方,我現在洗掉了該型別轉換,Person并且出于某種原因,當我一次又一次地構建和運行代碼時,它不斷回傳true。強制它false再次開始回傳的唯一方法,即再次繼續采用默認equals(Object obj)方法是洗掉該equals(Person person)方法,運行一次代碼,然后粘貼我剛剛洗掉的方法。現在,比較false再次回傳。
JVM 是否快取了一些中間狀態?老實說,我對 Java 有點陌生。
uj5u.com熱心網友回復:
覆寫是當您實作已在超類中宣告的方法時。要符合覆寫條件,覆寫的簽名必須與被覆寫的方法的簽名匹配(在某些容差范圍內)。
多載是指您有多個名稱相同但簽名不同的方法。
在存在多載的情況下,呼叫哪一個完全由呼叫站點上引數的靜態型別決定。在您的示例中,您有兩個多載equals:
boolean equals(Object o) { ... }
boolean equals(Person p) { ... }
你打電話時:
Person p = ...
... equals(p) ...
過載選擇程序如下:
- 確定引數的靜態型別。
- 確定哪些多載適用(使用元數、子型別、轉換等)
- 如果有多個適用,請確定最具體的一個。
- 如果兩個或多個同樣特定,則會發出編譯時錯誤。
這里,引數型別是Person,并且兩個多載都適用(因為 aPerson是 an Object),但equals(Person)更具體,因此呼叫了一個。
如果我們稍微改變一下故事:
Object p = new Person(...);
... equals(p) ...
現在,pis的靜態型別Object,所以只有第一個多載 -- equals(Object)-- 適用。我們只知道它是一個Object; 它碰巧持有 aPerson是我們靜態不知道的。(我們可以用 動態找到它instanceof。)
總結一下:
- 運算式有靜態(編譯時)和動態(運行時)型別;
- 多載選擇完全基于靜態型別。
現在,您可能不想為equals(Person)您在這里看到的相同問題宣告——它看起來像一個覆寫,但實際上它是一個多載,并且不會在您認為它發生時被呼叫。
uj5u.com熱心網友回復:
其實Person有兩種方法:
boolean equals(Person);boolean equals(Object);(來自物件)
所以顯然person2是不被認可的Person。可能的解釋是忘記(洗掉)通用型別。
Person person = new Person();
List<Person> list = new ArrayList(); // Should have been new ArrayList<>();
...
if (person.equals(list.get(0)) { // equals(Object)
使用預泛型型別,編譯器不再檢查和依賴物件串列。也許您的 IDE 給出了相應的警告(橙色標記)。
提示:
使用
getAge和getName; Java中的駱駝案例。Java 中的約定在任何地方都非常嚴格。不要超載
equals和使用@Override。在很大程度上取決于原始equals,并且眾所周知 IDE 會警告personJoop.equals(dog)它總是會失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/343482.html
上一篇:由于堆損壞,應用程式觸發了斷點
