Java基礎之初識Java中的Object類

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);
	}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章