1.方法簡介
1> Object clone() ---->創建並返回對象的副本
2> boolean equals(Object obj) -->某個其他對象是否與該對象“相等”
3> void finalize() --->當垃圾回收器確定不存在該對象的更多引用時,由對象的垃圾回收器調用此方法進行回收
4> Class getClass() ---> 返回一個對象運行時類
5> int hashCode --->返回對象的哈希碼值
6>void notify --->喚醒在此對象監視器上等待的單個進程。
7> void notifyAll ---> 喚醒在此對象監視器上等待的所有進程
8>String toString() --->返回該對象的字符串表示
9> void wait() ---->導致當前對象等待,直到其他線程調用該對象的notify()或是notifyAll()方法
10> void wait(long timeout) --->導致當前對象等待,直到其他線程喚醒或是超過指定的時間量
11> void wait(long timeout,int nanos) --->...........或者某個其他線程中斷當前線程。
2.重點說明
1>hashCode ,常規規定:在java應用程序執行期間,同一對象調用hashCode(),必須返回相同的整數。前提是equals比較中所用的信息沒有被修改。不同程序的執行,無需一致。如果根據equals(Object)調用兩個對象相等,則hashCode也是相同的。
2>equals隊形必須是同一對象的引用,纔會true。重寫該方法,爲了維護常規規定,要重寫hashCode
3>clone, 這裏對象的副本是淺複製。
淺複製:被複制對象的所有變量都含有與原來對象相同的值,而所有的對其他對象的引用,仍指向其原來的對象 (僅複製所考慮的對象,而不復制所引用的對象)
深複製:引用其他對象的變量將指向被複制的新的對象。(把複製的對象所引用的所有對象都複製一遍)
Cloneable實現其接口可重寫clone方法,o=(student)super.clone;;;;如果是深複製,則要在重寫的方法中進行其他引用複製:o.p=(Teacher)p.clone();
如果引用層次比較高,要層層深度clone,且每個對象都要實行Cloneable接口,比較麻煩,可以用序列化。
對象序列化:將對象的狀態轉化爲字節流,再通過這些值生成相同狀態的對象。對象都實現Serializable接口。
public Object deepClone()throws...{
ByteArrayOutputstream bo=new ByteArrayOutputStream();
ObjectOutputstream oo=new ObjectOutputStream(bo);
oo.writeObject(this); //將對象寫在流裏
ByteArrayInputStream bi=new ByteArrayInputStream();
ObjectInputStream oi=new ObjectInputStream(bi);
return(oi.readObjct()); //叢流裏讀出來
}
4>toString() 返回:getClass.getName+'@'+Integer.toHexString(hashCode()) 此對象哈希碼的無符號十六進制
5> notify() 選擇一個線程喚醒,是任意的。競爭的結果