1. 程式人生 > 實用技巧 >java常用類:Object類

java常用類:Object類

Object類

  • 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層

  • 任何類,如果沒有書寫extends顯示繼承某個類,都預設直接繼承Object類,否則為間接繼承

  • Object 類位於 java.lang 包中,編譯時會自動匯入,我們建立一個類時,如果沒有明確繼承一個父類,那麼它就會自動繼承 Object,成為 Object 的子類。

  • Object類中所定義的方法,是所有物件都具備的方法

  • Object型別可以儲存任何物件:

    作為引數,可以接受任何物件

    作為返回值,可以返回任何物件


getClass()方法

  • public final Class<?> getClass(){}

  • 返回引用中儲存的實際物件型別

  • 應用:通常用於判斷兩個引用中實際儲存物件型別是否一致

public class TestStudent {
    public static void main(String[] args) {
        Student s1=new Student("aaa",20);
        Student s2=new Student("bbb",22);
        //判斷s1和s2是不是同一個型別
        Class class1=s1.getClass();
        Class class2=s2.getClass();
        if(class1==class2){
            System.out.println("s1和s2屬於同一個型別");
        }else
            System.out.println("s1和s2不屬於同一個型別");
    }
}
//結果
//s1和s2屬於同一個型別


hashCode()方法

  • public int hashCode(){}
  • 返回該物件的雜湊碼值,是一個整數,表示在雜湊表中的位置
  • 雜湊值根據物件的地址或字串或數字使用hash演算法計算出來的int型別的數值
  • 一般情況下相同物件返回相同雜湊碼
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3=s1;
System.out.println(s3.hashCode());
//結果
//460141958
//1163157884
//460141958  s3與s1記憶體一樣,所以雜湊碼值一樣


toString()方法

  • public String toString(){}
  • 返回該物件的字串表示(表現形式)
  • 預設返回格式:物件的 class 名稱 + @ + hashCode 的十六進位制字串
  • 可以根據程式需求覆蓋該方法,如:展示物件各個屬性值
 //toString()
 System.out.println(s1.toString());
 System.out.println(s2.toString());
//結果
//com.wu.Object.Student@1b6d3586
//com.wu.Object.Student@4554617c

//重寫toString()方法
@Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
//結果
//Student{name='aaa', age=20}
//Student{name='bbb', age=22}


equals()方法

  • public boolean equals(Object obj){}
  • 預設實現為( this==obj ),是判斷兩個物件引用指向的是同一個物件,即比較兩個物件地址是否相同
  • 可進行覆蓋,比較兩個物件的內容是否相同;
  • 如果子類重寫了 equals() 方法,就需要重寫 hashCode() 方法,比如 String 類就重寫了 equals() 方法,同時也重寫了 hashCode() 方法
class RunoobTest {
    public static void main(String[] args) { 
        // Object 類使用 equals() 方法
        // 建立兩個物件
        Object obj1 = new Object();
        Object obj2 = new Object();
 
        // 判斷 obj1 與 obj2 是否相等
        // 不同物件,記憶體地址不同,不相等,返回 false
        System.out.println(obj1.equals(obj2)); // false
 
        // obj1 賦值給 obj3
        // String 重寫了 equals() 方法
        // 物件引用,記憶體地址相同,相等,返回 true
        Object obj3 = obj1;
        System.out.println(obj1.equals(obj3)); // true
    }
}
//結果
//false
//true

equals()方法覆蓋步驟

  • 比較兩個引用是否指向同一個物件
  • 判斷obj是否為null
  • 判斷兩個引用指向的實際物件型別是否一致
  • 強制型別轉換
  • 依次比較各個屬性值是否相同

此處先簡單瞭解下:

當equals()方法被重寫時,通常有必要重寫hashCode方法,以維護hashCode方法的常規約定:值相同的物件必須有相同的hashCode。

object1.equals(object2)為true,hashCode也相同;

hashCode不同時,object1.equals(object2)為false;

hashCode相同時,object1.equals(object2)不一定為true;

//重寫equals()方法
@Override
public boolean equals(Object o) {
    //判斷兩個物件是否是同一個引用
    if (this == o)
        return true;
    //判斷o是否null;判斷是否是同一個型別,也可以用instanceof判斷
    if (o == null || getClass() != o.getClass())
        return false;
    //強制型別轉換
    Student student = (Student) o;
    
    return age == student.age &&
        Objects.equals(name, student.name);
}
//重寫hashCode()方法
//@Override
//public int hashCode() {
//	return Objects.hash(name, age);
// }


finalize()方法

  • 當物件被判定為垃圾物件時,由JVM自動呼叫此方法,用以標記垃圾物件,進入回收佇列
  • 垃圾物件:沒有有效引用指向此物件時,為垃圾物件
  • 垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間
  • 自動回收機制:JVM的記憶體耗盡,一次性回收所有垃圾物件
  • 手動回收機制:使用System.gc(); 通知JVM執行垃圾回收
//重寫finalize()方法
@Override
protected void finalize() throws Throwable {
    System.out.println(this.name+"物件被回收了");
}
//測試
Student s1=new Student("aaa",20);
Student s2=new Student("bbb",20);
new Student("ccc",20);
new Student("ddd",20);
//回收垃圾
System.gc();
System.out.println("回收垃圾");

//結果:
//回收垃圾
//ddd物件被回收了
//ccc物件被回收了