Object類 —getClass() ,hashCode(),toString(),equals(),finalize()

Java學習基礎知識思維導圖

Object類

  • 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層
  • 任何類,如沒有書寫extends顯示繼承某個類,都默認直接繼承Object類,否則爲間接繼承
  • Object類中所定義的方法,是所有對象都具有的方法
  • Object類型可以存儲任何對象:
    作爲參數,可以接受任何對象
    作爲返回值,可返回任何對象

getClass()方法

  • public final Class<?> getClass(){}
  • 返回引用中存儲的實際對象類型
  • 應用:通常用於判斷兩個引用中實際存儲對象類型是否一致
public class TestMethodForGetClass {
	public static void main(String[] args) {
		Animal[] as = new Animal[] {new Dog(),new Cat()};

		//判斷數組中兩個對象的真實類型是否相同
		/*
		if(as[0] instanceof Dog) {
			if(as[1] instanceof Dog) {
				System.out.println("兩個都爲Dog對象");
			}
		}
		if(as[0] instanceof Cat){
			if(as[1] instanceof Cat) {
				System.out.println("兩個都爲Cat對象");
			}
		}*/
		System.out.println(as[0].getClass()==as[1].getClass());//獲取引用中的真實類型
	}
}
class Animal{
	
}
class Dog extends Animal{}
class Cat extends Animal{}

hashCode()方法

  • public int hashCode(){}
  • 返回該對象的十進制的哈希碼值
  • 哈希算法根據對象的地址或字符串或數字計算出來的int類型的數值
  • 哈希碼並不唯一,可保證相同對象返回相同哈希碼,儘量保證不同對象返回不同哈希碼
public class TestMethodForHashCode {
	public static void main(String[] args) {
		Teacher t1 = new Teacher();
		System.out.println(t1.hashCode());
	}
}
class Teacher{}

toString方法

  • public String toString(){}
  • 返回該對象的字符串表示(表現形式)
  • 可以根據程序需求覆蓋該方法,如:展示對象各個屬性值
public class TestMethodForToString {
	public static void main(String[] args) {
		Fish fish = new Fish();
		System.out.println(fish.toString());
		System.out.println(fish);//打印對象,實質打印就是該對象的toString()的結果
		
		//打印出對象的結果後的數字由哈希碼產生,由十進制的哈希碼轉換爲十六進制的數值
		//getClass()獲得對象的真實類型+@+十六進制哈希碼
		System.out.println(fish.getClass().getName()+"@"+Integer.toHexString(fish.hashCode()));
	}
}
class Fish{}
public class TestMethodForToString1 {
	public static void main(String[] args) {
		Worker w1 = new Worker();
		w1.name="kunyan";
		w1.age =12;
		w1.sex ="女";
		w1.salary=8000;
		//System.out.println(w1.name+"\t"+w1.age+"\t"+w1.sex+"\t"+w1.salary);
		//若創建很多工人對象,每一個都需要輸出,則輸出語句重複寫很多遍
		System.out.println(w1);
	}
}
class Worker{
	String name;
	int age;
	String sex;
	double salary;
	@Override
	public String toString() {
		return name + "\t" + age +"\t" + sex + "\t" + salary;
	}
}

equals()方法

  • public boolean equals(Object obj){}
  • 默認實現爲(this==obj),比較兩個對象地址值是否相同
  • 可進行覆蓋,比較兩個對象的內容是否相同

比較地址不同,但內容相同的對象需要覆蓋。

public class TestMethodForEquals {
	public static void main(String[] args) {
		
		Student s1 = new Student("kunyan",20,"female",100);
		Student s2 = new Student("kunyan",20,"female",100);
		System.out.println(s1==s2);
		//有==判斷地址值是否相等,仍用equals
		//字符串String類型中equals和==結果不一樣,equals比內容,覆蓋equals方法
		System.out.println(s1.equals(s2));//爲返回true
		
		
	}
}

class Student{
	String name;
	int age;
	String sex;
	double score;
	
	public Student(String name, int age, String sex, double score) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.score = score;
	}
	public boolean equals(Object obj) {//比較內容
		//1.比較兩個對象的地址是否一樣
		if(this == obj) {
			return true;
		}
		//2.確認對象不爲null
		if(obj== null) {
			return false;
		}
		//3.確認類型,但是值爲null報錯NullPointerExption
		if(this.getClass() != obj.getClass()) {
			return false;
		}
		//4.轉型,傳入進的參數是子類,但前提需要確認是否爲Student
		Student stu = (Student)obj;//想獲取子類屬性,則需要將父類參數轉箱,轉爲子類類型
		//5.比較內容
		if(this.name.equals(stu.name) && this.age==stu.age && this.sex.equals(stu.sex) && this.score == stu.score) {//此處應爲equals,若傳的屬性爲引用類型則用==又是比較地址,內容無法確定相同
			return true;
		}
		
		
		return false;
	}
}
class MyObject{
	public boolean equals(Object obj) {
		return(this == obj);
	}
}

finalize()方法

  • 當對象被判爲垃圾對象時,由JVM自動給調用此方法,用以標記垃圾對象,進入回收隊列。
  • 垃圾對象:沒有有效引用指向此對象時,爲垃圾對象
  • 垃圾回收:由GC銷燬垃圾對象,釋放數據存儲空間。
  • 自動回收機制:JVM的內存耗盡,一次性回收所有垃圾對象。
  • 手動回收機制:使用System.gc();通知JVM執行垃圾回收。
public class TestFinalize {
	public static void main(String[] args) {
		System.out.println("程序開始");
		
		Student s1 = new Student();
		
		s1 = null;
		
		System.gc();//手工觸發垃圾收集的工作
		
		System.out.println("程序結束");
		
	}
}
class Student{
	@Override
	protected void finalize() throws Throwable {
		// TODO Auto-generated method stub
		super.finalize();//不要改
		System.out.println("Student finalize() Executed");
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章