如何書寫乙個恰當的equals 方法?

2021-06-07 14:45:47 字數 1819 閱讀 6491

若有錯誤,歡迎指正。

object類中的equals()方法預設比較的是物件之間的引用是否一樣,但在實際開發中需要比較的是物件之間的狀態是否一樣。這就要求我們覆寫equals()方法。

考慮繼承層次下的equals()方法應如何書寫?

1、父類的equals()方法比較共有屬性部分,等待子類中的equals()呼叫

2、子類各自覆寫equals()方法比較新增屬性部分

下面以person, student, teahcer這三個類舉例

person類

package com.test.equals;

public class person

@override

public boolean equals(object obj)

if (obj == null)

// 採用getclass()方法來比較雙方是否屬於同乙個類

if (this.getclass() != obj.getclass())

person person = (person) obj;

return this.name.equals(person.name) && (this.age == person.age);

} public string getname()

public void setname(string name)

public int getage()

public void setage(int age)

}

student類

package com.test.equals;

public class student extends person

public int getscore()

public void setscore(int score)

@override

public boolean equals(object obj)

return false;

}}

teacher類

package com.wujilin.equals;

public class teacher extends person

@override

public boolean equals(object obj)

return false; }

public int getsalary()

public void setsalary(int salary)

}

注意:

1、super關鍵字,並不是指父類物件的引用,它只是告訴編譯器要去呼叫父類的方法的關鍵字。

2、考慮到繼承,所以採用getclass()進行檢測,而不是使用instanceof關鍵字來比較,這是因為子類有自己的相等概念。

舉個例子,如果使用的是instanceof關鍵字,父類中的equals()方法應該為:

@override

public boolean equals(object obj)

if (obj == null)

if (obj instanceof person)

return false;

}

當student子類物件和teacher子類物件的名字和年齡都一樣的情況下,那麼要如何在子類中所覆寫的equals()方法再進一步比較這兩個物件呢?

所以,如果是由超類來決定相等的概念的話,那麼就可以使用instanceof關鍵字進行比較了。

書寫乙個儲存過程

delimiter console 轉換為 定義儲存過程 引數 in輸入引數 out輸出引數 row count 返回上一條修改型別sql delete,insert,update 的影響條數 row count 0 未修改資料 0 表示sql出錯 0 表示修改了行數 create procedur...

乙個equals方法引發的錯誤

今天在寫乙個狀態判斷的時候,沒有注意到其中乙個物件為short,另外乙個是基本型別int,導致雖然數值相等但是equals方法返回false,查詢short方法和equals方法後得知,大多數類都重寫了equals方法,重寫的時候一般第一步就是判斷型別是否相同,不同就返回false。所以雖然shor...

Linux下書寫乙個簡單的makefile

在linux下我們經常需要 編譯 而談起編譯就離不開 makefile 了,簡單來說 makefile 是編譯的乙個引導檔案,關於它的詳細介紹網上有許多資料,這裡只為介紹如何書寫乙個簡單的 makefile sources include libs objects sources cpp o tar...