由於每次實例化一個對象時,系統會分配一塊內存地址給這個對象,而系統默認是根據內存地址來檢測是否是同一個對象,所以就算是同一個類里實例化出來的對象它們也不會相等。
public class Transport { //名字 public String name; //運輸類型 public String type; { name = "交通工具"; type = "運輸方式"; } public void todo() { System.out.println("交通工具可以載人載物"); } }
實例化對象后查看下內存地址,並用equals方法判斷是否相等:
public static void main(String[] args) { Transport obj = new Transport(); Transport obj1 = new Transport(); System.out.println(obj.toString()); //Transport@49476842 System.out.println(obj1.toString()); //Transport@78308db1 System.out.println(obj.equals(obj1)); // false }
結果是不相等的,那么這兩個對象明明是同一個對象,我們該怎么判斷它們到底是不是同一個對象呢? 方法也很簡單,我們自己重寫一個類方法來判斷:
public boolean equals(Object o) { if (this == o) return true; //先判斷o是否為本對象,如果是就肯定是同一對象了,this 指向當前的對象 if (o == null || getClass() != o.getClass()) return false; //再判斷o是否為null,和o.類對象和本類對象是否一致 Transport transport = (Transport) o; //再把o對象強制轉化為Transport類對象 return Objects.equals(name, transport.name) && Objects.equals(type, transport.type); //查看兩個對象的name和type屬性值是否相等,返回結果 }
再來運行一遍程序:
public static void main(String[] args) { Transport obj = new Transport(); Transport obj1 = new Transport(); System.out.println(obj.toString()); //Transport@49476842 System.out.println(obj1.toString()); //Transport@78308db1 System.out.println(obj.equals(obj1)); // true }
