天天看點

Java中equals()方法的重寫

equals

我們知道equals()方法是定義在Object類中的,在沒有被覆寫時該方法與運算符==的作用是一樣的。因為在 Object 類中equals()直接使用= =來實作。

值得注意的是 == 比較時用的是正真的位址。

那是不是我們要用時都需要覆寫呢?其實也不是這樣的,在一些标準類庫中有的已經覆寫好了可以直接使用,常見的有 file , integer , data , String類。

下面我們一起來學習吧!

訓示其他某個對象是否與此對象“相等”。

equals 方法在非空對象引用上實作相等關系:

· 自反性:對于任何非空引用值

x,x.equals(x) 都應傳回 true。

· 對稱性:對于任何非空引用值

x 和 y,當且僅當 y.equals(x) 傳回 true 時,x.equals(y) 才應傳回 true。

· 傳遞性:對于任何非空引用值

x、y 和 z,如果 x.equals(y) 傳回 true,并且 y.equals(z) 傳回 true,那麼 x.equals(z) 應傳回 true。

· 一緻性:對于任何非空引用值

x 和 y,多次調用 x.equals(y) 始終傳回 true 或始終傳回 false,前提是對象上 equals 比較中所用的資訊沒有被修改。

· 對于任何非空引用值 x,x.equals(null) 都應傳回 false。

Object 類的 equals 方法實作對象上差别可能性最大的相等關系;即,對于任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才傳回 true(x == y 具有值 true)。

注意:當此方法被重寫時,通常有必要重寫

hashCode 方法,以維護 hashCode 方法的正常協定,該協定聲明相等對象必須具有相等的哈希碼。

參數:

obj

  • 要與之比較的引用對象。

傳回:

如果此對象與 obj 參數相同,則傳回 true;否則傳回 false。

此處隻是為了實作equals方法的重寫,就不對hashcode方法的重寫。

那怎樣實作呢?

Students類

package it.itcost;
 
 public class Students {
 
  //學生的姓名
  private String name;
  
  //學生的學号
  private int id;
  
  //學生的成績
  private double grade;
  
  Students(String name,int id,double grade){//三個參數的構造函數,用于給屬性初始化
   
   this.name = name;
   this.id = id;
   this.grade = grade;
   
  }
  
  //重寫object的equals方法
  //形參用object類型,有利于在繼承了同一個父類的子類對象可以使用該方法
  public boolean equals(Object obj){//顯示參數名為obj
   
   //檢測this與obj是否引用同一個對象
   if(this == obj)
    return true;
   
   //檢測odj是否為null,如果為空則傳回false
   if(obj == null)
    return false;
   
   //比較this與odj是否屬于同一個類如果equals的語義在每一個類中有所改變,就使用getClass檢測
   if(this.getClass().getName() != obj.getClass().getName())
    return false;
   
 //  //如果所有的子類都有統一的語義,就使用instanceof檢測
 //  //instanceof是Java中的二進制運算符,左邊是對象,右邊是類;當對象是右邊類或子類所建立對象時,傳回true;否則,傳回false。
 //  if(!(obj instanceof Students))
 //   return false;
   
   
   //通過以上的判斷我們知道了Students的對象以及傳給obj的對象不為null
   
   //對obj向下造型
   Students other = (Students)obj;
   
   //測試對象的各屬性的值是否相等
   return name.equals(other.name)  //name是String類型是引用類型并且覆寫了equals方法,可以通過調用String類的equals來比較
     &&this.id==other.id  //id是基本類型直接使用==比較值是否相等
     &&this.grade==other.grade;  //grade是基本類型直接使用==比較值是否相等
  
  }
 
   
 }
           

下面是測試代碼

package it.itcost;

 public class StudentsTest {
 
  public static void main(String[] args) {
   
   
   Students Stu0 = new Students("柒間",20182206,90.00);
   Students Stu1 = new Students("柒間",20182206,90.00);
 
   Students Stu = new Students("Tom",20180000,80.00);
   
   //Stu1---Stu0
   System.out.println((Stu1.equals(Stu0)));
   
   //Stu---Stu0
   System.out.println((Stu.equals(Stu0)));
  }
 
 }
           

上面代碼自己手寫的如有改進的地方歡迎留言一起學習!