常用類-Object類
阿新 • • 發佈:2020-09-09
Object類
概念
- 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層。
- 任何類,如果沒有書寫extends顯示繼承某個類,都預設直接繼承Object類,否則為間接繼承。
- Object類中所定義的方法,是所有物件都具備的方法。
- Object型別可以儲存任何物件。
- 作為引數,可接受任何物件。
- 作為返回值,可返回任何物件。
方法摘要
JDK官方文件中的方法摘要
方法介紹
這裡只講getClass()
、equals()
、hashCode()
、toString()
、finalize()
這5個方法,其他方法後面用到了再講
getClass()
-
原始碼,返回值為
Class
public final Class<?> getClass(){}
-
返回引用中儲存的實際物件型別
-
應用:通常用於判斷兩個引用中實際儲存物件型別是否一致
-
學生類
package com.ciao.classDemo.demo01; public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
-
測試類
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //建立例項 Student s1 = new Student("言身寸", 23); Student s2 = new Student("雨山夆", 23); //獲取例項儲存物件的型別 Class s1Class = s1.getClass(); Class s2Class = s2.getClass(); //判斷是否一致 Boolean flag = s1Class==s2Class; System.out.println("s1與s2型別是否一致?"+ flag); } }
-
hashCode()
-
原始碼,返回值為
int
public int hashCode(){}
-
返回該物件的雜湊碼值
-
雜湊值根據物件的地址或字串或數字使用hash演算法計算出來的Int型別的數值
-
一般情況下相同物件返回相同雜湊碼
接上一個例項
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //建立例項 Student s1 = new Student("言身寸", 23); Student s2 = new Student("雨山夆", 23); //獲取例項的雜湊值,int型別 int s1Hash = s1.hashCode(); int s2Hash = s2.hashCode(); //判斷雜湊值是否一致 Boolean flag2 = s1Hash==s2Hash; System.out.println("s1:"+s1Hash+"與s2:"+s2Hash+"是否一致?"+ flag2); //新建一個例項s3等於s1,發現s3的雜湊值與s1一致,指向地址一致 Student s3 = s1; System.out.println(s3.hashCode()); } }
輸出
s1:1735600054與s2:21685669是否一致?false 1735600054
toString()
-
原始碼
型別為
String
,返回值包括類名+@+雜湊值十六進位制public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
-
返回該物件的字串表示(表示形式,類名字+雜湊值十六進位制),可重寫該方法,變成你想要的字串形式(展示物件的各個屬性值)
-
未重寫返回值
程式碼
System.out.println(s1.toString()); System.out.println(s2.toString());
輸出
com.ciao.classDemo.demo01.Student@677327b6 com.ciao.classDemo.demo01.Student@14ae5a5
-
重寫後返回物件的各個屬性
這裡使用快捷重寫
@Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; }
程式碼
System.out.println(s1.toString()); System.out.println(s2.toString());
輸出
Student{name='言身寸', age=23} Student{name='雨山夆', age=23}
-
equals()
-
原始碼
返回值型別為
boolean
值,判斷兩個物件指向的地址是否一致public boolean equals(Object obj) { return (this == obj); }
-
可進行重寫,比較兩個值的內容是否相同
-
未重寫,輸出為
false
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //建立例項 Student s1 = new Student("雨山夆", 23); Student s2 = new Student("雨山夆", 23); //判斷兩個內容一樣的物件是否相等 System.out.println(s1.equals(s2)); } }
-
重寫後再比較,輸出為
true
@Override public boolean equals(Object obj) { //1.比較兩個引用是否指向同一個物件 if(this==obj){ return true; } //2.判斷obj是否是null if(obj == null){//非空性 return false; } //3.判斷兩個引用指向的實際物件型別是否一致 /* if(this.getClass()==obj.getClass()){} */ if(obj instanceof Student){//instanceof 判斷物件是否是某種型別 //4.強制型別轉換 Student s = (Student) obj; //5.依次比較各個屬性值是否相等 if(this.name.equals(s.getName())&&(this.age==s.getAge())){ return true; } } return false; }
-
-
equals()
與==
的區別
finalize()
-
原始碼
protected void finalize() throws Throwable { }
-
當物件被判定為垃圾物件時,由JVM自動呼叫此方法,以標記垃圾物件,進入回收佇列
-
垃圾物件:沒有有效引用指向此物件時,為垃圾物件
-
垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間
-
自動回收機制:JVM記憶體耗盡,一次性清空所有垃圾物件
-
手動回收機制:使用
System.gc()
;通知JVM執行垃圾回收 -
測試:
-
重寫
finalize()
方法,使其輸出誰被回收了@Override protected void finalize() throws Throwable { System.out.println(this.name+"被回收了~"); }
-
被引用的物件不會被回收,未被引用的物件被回收
package com.ciao.classDemo.demo01; public class Test { public static void main(String[] args) { //建立例項 Student s1 = new Student("aaa", 1); Student s2 = new Student("bbb", 1); new Student("ccc", 1); //回收垃圾 System.gc(); System.out.println("已執行回收垃圾!"); } }
輸出
com.ciao.classDemo.demo01.Test 已執行回收垃圾! ccc被回收了~ Process finished with exit code 0
-