2014-03-12 103 views
2

我創建了一個名爲student的類,它具有如下所示的equals方法。 我的問題是這樣的。等於方法的問題

我創建了一個學生類的實例並將其添加到ArrayList,現在我想檢查天氣列表包含學生對象的副本。當我嘗試用下面的等號函數給出錯誤的結果。

例如。

Student stud1= new Student(101,"Student1"); 
    Student stud5= new Student(105,"Student5"); 
    Student stud6= new Student(105,"Student5"); 
    list1.add(stud1); 
    list1.add(stud5); 
    System.out.println(list1.contains(new Student(105,"Student5")));// outputting false 



class Student{ 
int sid; 
String sname; 

public Student(int sid,String sname){ 
    this.sid=sid; 
    this.sname=sname; 
} 

public String toString(){ 
    return ""+this.sid; 
} 



public boolean equals(Student test){ 
    return this.sid==test.sid; 
} 

}

但是當我用一個低於其給出正確的結果。爲什麼是取代平等的功能?技術上沒有區別嗎?能否請你幫我的JVM是如何看代碼..

public boolean equals(Object cond){ 
    if(cond instanceof Student){ 
     Student test = (Student) cond; 
     return test.sid==this.sid; 
    } 
    return false; 
} 

回答

10

equals(Student)方法不會覆蓋Object#equals(Object)方法。因此,list.contains(Student)方法將調用默認的Object#equals()方法,並使用==比較參考值。因此,對於兩個不同的對象,它將返回false

+0

我們說每個對象都是一個類的實例,所以從這個意義上講,學生不會成爲一個對象嗎? – User27854

+0

@ user2900314這是事實,但這不是重寫的方式。不改變方法的簽名。你可以在參數中給出協變類型。協變類型可以和返回類型一起工作。 –

+0

明白了,謝謝。 – User27854

1

的包含的javadoc狀態

返回true如果此列表包含指定的元素。更正式地說,當且僅當該列表包含至少一個元素e(例如(o == null?e == null:o.equals(e))時才返回true。

必須覆蓋equals(Object),在你的榜樣,你定義equals(Student),它調用list1.contains(當不使用。

1

不,他們是不一樣的。 爲了使等號正常工作,您需要覆蓋超類(Object)中的方法。而重寫的方法簽名是

public boolean equals(Object cond){} 

通過這樣做public boolean equals(Student test){}你實際上重載方法。因此它不再是回調方法,並且Object的equals方法被調用。

1
public boolean equals(Object cond) 

public boolean equals(Student cond) 

有兩種不同的方法簽名

第一個,你將覆蓋Object類的equals方法。 (相同的簽名的Object.Equals

你重載方法中的第二個。與不同的簽名。

覆蓋,方法簽名必須是相似的。

這就是爲什麼等於(對象除外)的作品