java常用類:Object類
阿新 • • 發佈:2020-12-25
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物件被回收了