Java 中Object類的方法
Java是單根繼承結構語言,也就是說,Java中所有的類都有一個共同的祖先,這個祖先就是Object類。
如圖所示:Object類中的方法
說明:
1、hashCode和equals函式用來判斷物件是否相同,
equals()用於確認兩個物件是否相同。
hashCode()用於獲取物件的雜湊值,這個值的作用是檢索,具體的作用可以參考這裡
雜湊值相同的物件不一定equals()
equals()返回true的兩個物件一定相同。
equals()通常用來進行比較,在Object類中,它進行了引用的比較,只有引用相同時會返回true,但是這樣並不是我們想要的比較的情況,比如字串的比較是比較每個字元是否相同。
==與equals在Java中經常被使用,大家也都知道==與equals的區別:
==表示的是變數值完成相同(對於基礎型別,地址中儲存的是值;引用型別則儲存指向實際物件的地址;)
equals表示的是物件的內容完全相同,此處的內容多指物件的特徵/屬性。
public boolean equals(Object obj) {
return (this == obj);
}
由此可見,Object原生的equals()方法內部呼叫的正是==,與==具有相同的含義。既然如此,為什麼還要定義此equals()方法?
equlas()方法的正確理解應該是:判斷兩個物件是否相等。那麼判斷物件相等又是什麼?
如果自定義的類沒有重寫equals()方法來重新定義此標尺,那麼預設的將是其父類的equals(),直到object基類。
如果按實際需求,對於StudentBean,由實際的業務需求可知當屬性id相同時,表示的是同一個Student,即兩個Student物件相等。則可以重寫equals以重定義Student物件相等。
package com.hlx; public class Student{ private int id; private String name; private int age; public Student(int id,String name){ this.id =id; this.name = name; } public int getId() { return id; public void setId(int id) { this.id = id; } protected String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object obj) { if (obj == null || !(obj instanceof Student)) { return false; } if (((User) obj).getId() == this.getId()) { return true; } return false; } }
測試結果:
Student stu1=new Student(1100,"mike");
Student stu2=new Student(1100,"麥克");
System.out.println(stu1.equals(stu2)); //返回true
因為Student類定義中重寫了equals()方法,判斷這兩個人是不是同一個人,這時只用判斷id是否相同即可。
如上重寫equals方法表面上看上去是可以了,實則不然。因為它破壞了Java中的約定:重寫equals()方法必須重寫hasCode()方法。
2、toString()和getClass是可以在執行時獲得類。
原始碼如下:
public final native Class<?> getClass();
public boolean equals(Object obj) {
return (this == obj);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
3、wait(),wait(long),wait(long,int),notify(),notifyAll()
4、clone()
5、finalize()用於在垃圾回收