Object類的方法簡談
Java中所有的類都繼承自Object類,那我們今天來探讨一下Object類中的方法
PS:Object源碼中,作者那一欄中,出現了這個
package java.lang;
/**
* Class {@code Object} is the root of the class hierarchy.
* Every class has {@code Object} as a superclass. All objects,
* including arrays, implement the methods of this class.
*
* @author unascribed
* @see java.lang.Class
* @since JDK1.0
*/
public class Object {
....
}
unascribed,意思是無歸屬,我猜測是這個類經由很多大佬修改過,無法确定誰是主要作者,便寫了無歸屬。說歪了,回到正題吧!
Object類有以下這幾個方法(按照源碼中的順序)
【1】getClass():Class<?>
【2】hashCode():int
【3】equals(Object):boolean
【4】clone():Object
【5】toString():String
【6】notify():void
【7】notifyAll():void
【8】wait(long):void
【9】wait(long,int):void
【10】wait():void
【11】finalize():void
方法說明
【1】getClass():Class<?>
傳回該對象運作時類的Class對象,通俗點,就是這個對象所屬的類
代碼說明
public static void testGetClass() {
ObjectTest test = new ObjectTest();
System.out.println(test.getClass());
}
輸出為
可以看得出是輸出的結構是 class 包名.類名
【2】hashCode():int
傳回該對象的哈希值
(1)同一個對象的哈希值一定相同
(2)不同對象的哈希值可能相同,而不是絕對不相同
(3)哈希值一般用來提高查詢的效率
(4)HashSet使用對象的hashcode與equals來判斷是否插入了重複對象
代碼示範
public static void testHashCode(){
System.out.println("同一個對象");
ObjectTest test = new ObjectTest();
System.out.println(test.hashCode());
System.out.println(test.hashCode());
System.out.println("兩個不同的對象");
System.out.println(new ObjectTest().hashCode());
System.out.println(new ObjectTest().hashCode());
}
輸出為
【3】equals(Object):boolean
判斷兩個對象記憶體位址是否相同,方法内部直接 return (this==object)
注意(1)凡是涉及到new的操作,均傳回false,因為這是在堆中執行個體化了新的對象
代碼示範
public static void testEquals() {
System.out.println(new ObjectTest().equals(new ObjectTest()));
}
輸出為
(2)equals傳回true的兩個對象,其哈希值一定相同
(3)哈希值相同的兩個對象,equals不一定傳回true
【4】clone():Object
建立一個對象的副本
注意
(1)建立出來的是新的對象,equals傳回false
(2)clone()不會調用構造方法
(3)目前類需要實作Cloneable辨別接口,目前類對象才支援clone()方法
代碼示範
public class ObjectTest implements Cloneable{
......
public static void testClone(){
ObjectTest objectTest=new ObjectTest();
try {
ObjectTest objectTest1= (ObjectTest) objectTest.clone();
System.out.print(objectTest.equals(objectTest1));
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
...
testClone();
}
}
輸出為false
【5】toString():String
将對象轉換成字元串表達形式
(1)不重寫這個方法,直接調用則是輸出目前對象在記憶體中的首位址
(2)重寫這個方法後,輸出該對象的屬性
代碼示範
不重寫toString()方法
package day0807;
public class ObjectTest implements Cloneable {
public String name;
public int age;
public ObjectTest() {
}
public ObjectTest(String name, int age) {
this.name = name;
this.age = age;
}
....
public static void testToString() {
ObjectTest objectTest = new ObjectTest("tom", 22);
System.out.println(objectTest.toString());
}
public static void main(String args[]) {
...
testToString();
}
}
輸出為
重寫後
@Override
public String toString() {
return "ObjectTest{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
輸出為
【6】notify():void
【7】notifyAll():void
【8】wait(long):void
【9】wait(long,int):void
【10】wait():void
這幾個方法展現的是java中的多線程
(1)wait()使目前線程挂起并進入到該對象的等待隊列中
(2)從目前對象的等待隊列中随機喚醒一個挂起的線程,通知該線程可以運作
(3)喚醒目前對象的等待隊列中的所有線程
(4)wait(long)與wait(long,int)為下一次自動喚醒距離現在釋放鎖的時間間隔
[關于這幾個方法,涉及到的知識比較多,我會單獨拎出來]
【11】finalize():void
JVM在回收對象所占的記憶體之前調用該方法
(1)當對象不再被任何變量所引用時,會調用這個方法
public static void testFinalize() {
ObjectTest objectTest = new ObjectTest();
//将引用強制置為null
objectTest = null;
//通知gc開始工作,但gc何時工作無法控制,隻是通知
System.gc();
}