JAVA基礎面試1 Object

來源:互聯網
上載者:User

標籤:包含   syn   name   ble   for   ima   jni   而且   amp   

時間不多了,快上車。

先看Jdk8 中Java中所有對象的爸爸類Object.java。

居住地址在java.lang.

總共也沒有幾個方法,大部分還都是native方法。

順手把家底也掏了出來,

//object.c中方法static JNINativeMethod methods[] = {{"hashCode", "()I", (void *)&JVM_IHashCode},{"wait", "(J)V", (void *)&JVM_MonitorWait},{"notify", "()V", (void *)&JVM_MonitorNotify},{"notifyAll", "()V", (void *)&JVM_MonitorNotifyAll},{"clone", "()Ljava/lang/Object;", (void *)&JVM_Clone},};

貌似很簡單嘛。來來來,請出題。

由簡入深,請聽題

1 equals() 和 == 區別是什嗎?

      沒有區別,就是對比2個引用是否相同。 obj = new Object();  Obj 引用, 暫且理解為對象的地址。

public boolean equals(Object obj) { return this==obj}

   但很多時候,對使用者來說,不關心是指向了同一個對象,而是兩個內容是否長的一樣就行,比如String類。 子類繼承後要對比內容,需覆蓋override此方法。

  

2 equals()和hashcode()之間關係?

     其實從jdk源碼上根本看不出什麼關係,沒辦法,這是面試官最愛問的問題之一。

  hashcode() ,這裡討論爸爸類 Object中的。  由 JVM從對象頭裡面嘗試直接取得hashcode返回 int 類型值,通過一系列複雜運算得到,與引用不一樣。

    如果hashcode不同,equals肯定不一樣,因為一個對象不能有2個不同hashcode值;反之,不成立。

     equals相同,表明指向同一個對象,hashcode肯定相同;反之,不成立。

  因此如果子類override  equals(), 一般推薦重寫hashcode();  原因是對象在放入容器時候,為了提升效率,利用上面的特性,優先調用hashcode,再比equals。

 

3  為什麼要用clone?  clone 如何使用?

  一般情況,通過構造方法new 一個對象。此時的對象成員變數值都是預設值,如果要複製一個長的一樣的,需要調用get/set 逐個複製。

  如果而clone方法,JVM直接複製所有成員變數引用。 注意: 這是淺copy。基本類型,copy值,參考型別複製引用。 

  子類要實現clone,前提條件implement  Cloneable,  雖然只是個空介面,JVM調用之前會做校正。

  如果只是淺copy, clone(){ super.clone()};  如果要求深層次,那必須重寫,逐個clone 裡麵包含的對象。 JAVA設計模式中prototype。

 

4 finalize() ?

 喜歡和finally, final 關鍵字放一起。 關鍵字和方法,根本沒有關係。

這個方法主要是JVM調用,在引用回收之前調用一次。本想發揮一下的,考慮到JDK9中已經deprecated,那就算了。

 

5  getClass() ?

第一次遇到傳說中的 final 方法, 該方法不可以override,Class<?>返回的是帶有泛型(參數)的Class對象。

核心 : java中都是對象。 在Java中,每個class都有一個相應的Class對象. 編譯完成後,在產生的.class檔案中,就會產生一個Class對象,用於表示這個類的類型資訊。

int 應該是基本類型,不屬於(對象)參考型別,不能用new 構造, 這本身沒毛病。

基本類型卻有類類型,而且擷取類類型只有一種方式,  比如說

Class intclass = int.class;

參考型別

     1 類似基本類型,靜態擷取方式   
Class intclass = String.class;
  2 Object.java 不是static的類方法,通過對象來調用。
Test test =new Test();test.getClass();
     3 動態擷取,  運行時exception
Class.forName();     
   三者區別  1.類名.class    說明: JVM將使用類裝載器, 將類裝入記憶體(前提是:類還沒有裝入記憶體),不做類的初始化工作.返回Class的對象  2.Class.forName("類名字串")  (註:類名字串是包名+類名)  說明:裝入類,並做類的靜態初始化,返回Class的對象  3.執行個體對象.getClass()  說明:對類進行靜態初始化、非靜態初始化;返回引用o運行時真正所指的對象(因為:子物件的引用可能會賦給父物件的引用變數中)所屬的類的Class的對象 

6 線程通訊,多線程,鎖相關的  wait  notify?

   前提條件: 必須放在Synchronized 同步塊中使用。  產生者-消費者模式。 ReentrantLock 顯式的實現了Lock, Monitor,condition。 這些JVM隱含實現

  wait  notify為什麼不放入Thread類中?

  不管當前哪一個線程調用執行到 obj.wait(), 當前的線程就可以進入waiting隊列,等待其他線程執行obj.notify(從頭結點取出,放入等待喚醒隊列),monitorExit (同步塊和同步方法底層公用)會調用unpark喚醒。  如果在thread類中定義,每個thread的需要相互之間知道狀態,相互notify,需要直接通訊,obj充當了共用記憶體,實現線程通訊,減少耦合。

7toString 封裝使用了class  hashcode方法  略

JAVA基礎面試1 Object

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.