[TOC] Object 類 一、clone 1. 完整形式 2. 此方法用來實現對象的複製,如果要調用這個方法,必須實現 介面和覆蓋 方法,還需要在使用克隆的時候處理 ,因為此異常是非運行時異常。 3. 預設的覆寫,只是 淺拷貝 ,也就是只拷貝 基本數據類型 ,而對於對象的引用數據類型,也只是複製 ...
目錄
Object 類
一、clone
完整形式
protected native Object clone() throws CloneNotSupportedException
此方法用來實現對象的複製,如果要調用這個方法,必須實現
Cloneable
介面和覆蓋clone()
方法,還需要在使用克隆的時候處理CloneNotSupportedException
,因為此異常是非運行時異常。預設的覆寫,只是淺拷貝,也就是只拷貝基本數據類型,而對於對象的引用數據類型,也只是複製一份引用而已。如果想要實現深拷貝,就需要在覆寫的時候,將每一個引用數據類型進行克隆,但是這要求這些引用數據類型也都實現了
Clonable
介面。// 淺拷貝的重寫 public class User implements Cloneable{ private int id; private String name; private Date bir; @Override public Object clone() { User user = null; try { user = (User)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return user; } ... }
// 深拷貝的重寫 @Override public Object clone() { User user = null; try { user = (User)super.clone(); user.setBir((Date)this.bir.clone()); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return user; }
想要實現完全的深拷貝是很難做到的,因為你不能保證每個引用數據類型都重寫了
clone()
,在實際應用中,也很少用的到。
二、finalize
完整形式
protected void finalize() throws Throwable
此方法是用來釋放資源,在垃圾回收器回準備釋放該對象的資源時,會調用該方法。主要用在釋放資源時,執行一些清除操作。
三、getClass
完整形式
public final Class<?> getClass()
此方法是返回該對象的運行時類對象。因為java是純面向對象語言,類型、屬性和方法都可以看作是一個對象,所以可以通過類對象可以進行反射的操作,也就是通過類型對象來獲取類的屬性、方法等。
四、hashCode
完整形式
public int hashCode()
此方法是返回該對象hash碼值。不同的對象有不同的哈希碼值,所以在進行對象的比較中或相等判斷中要重寫此方法。以下是 Eclipse 預設重寫的方法:
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((bir == null) ? 0 : bir.hashCode()); result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; }
五、equals
完整形式
public boolean equals(Object obj)
此方法是用來判斷該對象與傳入的對象是否相同。而該對象預設的實現是比較兩個對象引用是否相等,那對於一些對象的判斷就不適用了,需要重寫此方法,以下是使用Eclipse 重寫的方法:
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (bir == null) { if (other.bir != null) return false; } else if (!bir.equals(other.bir)) return false; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
六、toString
完整形式
public String toString()
當該對象被列印時,會調用這個方法。它的預設輸出形式是
getClass().getName() + '@' + Integer.toHexString(hashCode())
七、wait
完整形式和它的重載方法
public final void wait() throws InterruptedException public final void wait(long timeout) throws InterruptedException public final void wait(long timeout,int nanos)throws InterruptedException
此方法是令當前對象進入等待隊列,直到被
notifyAll
、notify
喚醒或者被interrupt
中斷。而帶參數的重載方法是超過指定時間就進入等待狀態,其中 timeout 單位是毫秒,nanos 單位是毫微秒。
八、notify/notifyAll
完整形式
public final void notify() public final void notifyAll()
notify
是喚醒在此對象監視器上等待的某個線程,而notifyAll
是喚醒在此對象監視器上等待的所有線程。