Object所屬包:java.lang
Object在Java_API幫助文檔中的描述:類 Object
是類層次結構的根類。每個類都使用 Object
作爲超類。所有對象(包括數組)都實現這個類的方法。
本次講述類Object的hashCode()方法,getClass()方法,toString()方法,equals()方法
首先創建一個JavaBean類Student,其中的屬性包括姓名,年齡,性別,代碼如下:
public class Student {
private String name;
private Integer age;
private String sex;
public Student() { // 空參構造
super();
}
public Student(String name, Integer age, String sex) { // 有參構造
super();
this.name = name;
this.age = age;
this.sex = sex;
}
/*
* 生成屬性的get,set方法(使用快捷鍵-Alt+Shift+s 生成)
*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
(類Object的hashCode()方法)
hashCode():返回該對象的哈希碼值;返回值類型爲int型。
import com.heima.bean.Student;
public class Demo1_Hashcode {
/*
* 不同對象的,hashCode()一般來說不會相同。但是,同一個對象的hashCode()值肯定相同。
*/
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.hashCode());
Student stu1 = new Student("張三", 23, "男"); // Ctrl + Alt + 下建 向下複製一行
Student stu2 = new Student("李四", 24, "男");
System.out.println(stu1.hashCode());
System.out.println(stu2.hashCode());
}
}
我們會發現三個輸出語句輸出的結果都不相同。
(類Object的getClass()方法)
getClass():返回該對象正在運行的類;通過obj.getClass().getName()來獲取當前正在運行的Java對象的類的名稱,返回值爲String類型的字符串。
public class Demo2_GetClass {
public static void main(String[] args) {
Student stu = new Student();
Class clazz = stu.getClass(); // 獲取該對象的字節碼文件
String name = clazz.getName(); // 獲取類的名稱
System.out.println(name);
}
}
(類Object的toString()方法)
toString():返回該對象的字符串表示,建議所有子類都重寫此方法;返回值爲String類型的字符串。
public class Demo3_ToString {
/* 沒有重寫toString()方法時輸出
* com.heima.bean.Student@15db9742
* public String toString() {
* return getClass().getName() + "@" + Integer.toHexString(hashCode());
* }
* 左邊:類名
* 中間:@
* 右邊:hashCode的十六進制表現形式,返回值爲String
* toString()方法一般重寫,用來更方便的顯示對象的屬性值
* 而getXxxx()方法可以獲取值,除可以顯示屬性值之外,還可以進行修改和其他操作
*/
public static void main(String[] args) {
Student stu = new Student("張三", 23, "男");
System.out.println(stu.toString());
System.out.println(stu); // 如果直接打印對象的引用,或默認調用toString()方法
System.out.println("姓名:" + stu.getName() + ",年齡:" + stu.getAge() + ",性別:" + stu.getSex());
}
}
toString()源碼中的 Integer.toHexString(hashCode()) 我們通過查看API中的Integer可知:
toHexString(int i):以十六進制無符號整數形式返回一個整數參數的字符串表現形式。
在Student類中重寫toString()方法:
// 使用快捷鍵生成toString()方法 - Alt+Shift+s
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
(類Object的equals()方法)
equals():用於比較兩個對象是否相等,使用類Object中的equals()方法時,一般會重寫equals()方法;返回值類型boolean型。
public class Demo4_Equals {
/*
* equals()方法,用於比較兩個對象是否相等
* public boolean equals(Object obj) {
* return (this == obj);
* }
* 類Object中的equals()方法是比較對象的地址值,沒有什麼實際意義,
* 因爲在開發過程中我們通常比較的是對象的屬性值,我們認爲相同的屬性是同一對象,
* 因此我們一般要重寫equals()方法
*/
public static void main(String[] args) {
Student stu1 = new Student("張三", 23, "男");
Student stu2 = new Student("張三", 23, "男");
boolean b = stu1.equals(stu2);
System.out.println(b);
System.out.println(stu1 == stu2); // 比較兩個對象是否相等,其實equals()方法的底層原理使用的就是-(this == obj)
}
}
重寫類Object中的equals()方法:
@Override
public boolean equals(Object obj) { // stu1.equals(stu2);
// (Object obj)與(stu2): 父類引用指向子類對象,所以父類無法反問子類所特有的屬性和行爲,需向下轉型
Student stu = (Student) obj;
return this.name.equals(stu.name) && this.age == stu.age && this.sex.equals(stu.sex);
}