1. 程式人生 > >面試題 Object類有多少種方法

面試題 Object類有多少種方法

想要更加詳細的瞭解,推薦大家去看原始碼。

java是一個龐大的知識體系,本文從java的開始,即作為面嚮物件語言最基本的類java.lang.Object開始

對於Object大家都知道是一個非常神奇的類,它是JAVA所有類的始祖,在JAVA裡每一個類都是由它間接或者直接的擴充套件而來,所以可以說Object類是上帝類,只要沒有明確的指出超類Object就被認為是這個類的超類(即在你編寫一個類的時候,若無指定父類(沒有顯式extendes一個父類)編譯器(一般編譯器完成該步驟)就會預設的新增Object為該類的父類),它位於java.lang包,該包包含java最核心基礎的類這些類的屬性和行為,是java語言的思維體現。 Object型別的變數只能用於作為各種值的通用持有者,要想對其中的內容進行具體的操作,還需要清楚物件的原始型別並進行型別裝換,在JAVA中只有基本型別不是物件,所有的陣列型別,不管是物件陣列還是基本型別的陣列都擴充套件於Object類 在編譯時會自動匯入,Object沒有定義屬性,一共有13個方法(但是有幾個函式只在處理執行緒

時才會被呼叫的方法),java 的任何類都繼承了這些函式,並且覆蓋了不被final修飾的函式 因為Object是Java所有類的祖先類,所以Java所有類都有Object中的方法,在看這些方法的時候要聯絡這些方法不是針對Objec一個類,而是所有類。   既然是所有類共有,設計的時候肯定想的是所有類的共性,比如:equals方法就是用來比較任意兩個相同型別物件是否相等的,toString是用來將任意物件轉換成String,方便列印檢視。當然,以上方法的實現都是預設的,想要實現自己的邏輯需要在自己類中覆蓋重寫。

先看看Object類的原始碼 package java.lang; public class Object { private static native void registerNatives(); static { registerNatives(); }

public final native Class<?> getClass(); public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } /本地CLONE方法,用於物件的複製。/ protected native Object clone() throws CloneNotSupportedException; /返回該物件的字串表示。非常重要的方法/ public String toString() { return getClass().getName() + “@” + Integer.toHexString(hashCode()); } /喚醒在此物件監視器上等待的單個執行緒。

/ public final native void notify(); /喚醒在此物件監視器上等待的所有執行緒。/ public final native void notifyAll(); /在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法前,導致當前執行緒等待。換句話說,此方法的行為就好像它僅執行 wait(0) 呼叫一樣。 當前執行緒必須擁有此物件監視器。該執行緒釋出對此監視器=的所有權並等待,直到其他執行緒通過呼叫 notify 方法,或 notifyAll 方法通知在此物件的監視器上等待的執行緒醒來。然後該執行緒將等到重新獲得對監視器的所有權後才能繼續執行。/ public final void wait() throws InterruptedException { wait(0); } /在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前執行緒等待。/ public final native void wait(long timeout) throws InterruptedException; /* 在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法,或者其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量前,導致當前執行緒等待。*/ public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException(“timeout value is negative”); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( “nanosecond timeout value out of range”); } if (nanos >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } /當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。/ protected void finalize() throws Throwable { } } 有以下13個方法 public Object() private static native void registerNatives() protected navite Object clone() public boolean equals(Object obj) protected void finalize() public final native Class<? > getClass() public native int hashCode() public final native void notify() public final native void notifyAll() public String toString() public final void wait() public final native void wait(long timeout) public final void wait(long timeout, int nanos)

對這些方法功能進行簡單的描述: (一)Object():預設構造方法 (二)clone():建立並返回此物件的一個副本 (三)equals():指示某個其他物件是否與此物件相等 (四)finalize():當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法 (五)getClass():返回一個物件的執行時類 (六)hashCode():返回該物件的雜湊值 (七)notify():喚醒此物件監視器上等待的單個執行緒 (八)notifyAll():喚醒此物件監視器上等待的所有執行緒 (九)toString():返回該物件的字串表示 (十)wait():導致當前的執行緒等待,直到其它執行緒呼叫此物件的notify()或notifyAll() (十一)wait(long timeout):導致當前的執行緒等待呼叫此物件的notify()或notifyAll() (十二)wait(long timeout, int nanos):導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify()或notifyAll(),或其他某個執行緒中斷當前執行緒,或者已超過某個實際時間量 (十三)registerNatives():對本地方法進行註冊