object

Diy_os發表於2015-10-31
Java中的Object是所有類的父類,是“萬類之源”

Class Object
java.lang.Object
public class Object
Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

我們把jdk安裝路徑目錄下的src.rar檔案解壓,可以看到Object.java:
(為了頁面大小,刪除了大量的註釋,讀者自行檢視)

點選(此處)摺疊或開啟

  1. public class Object {

  2.     private static native void registerNatives();
  3.     static {
  4.         registerNatives();
  5.     }
  6.     
  7.     public boolean equals(Object obj) {
  8.         return (this == obj);
  9.     }
  10.     
  11.     protected native Object clone() throws CloneNotSupportedException;
  12.     
  13.     public String toString() {
  14.         return getClass().getName() + "@" + Integer.toHexString(hashCode());
  15.     }

  16.     public final native void notify();

  17.     public final native void notifyAll();
  18.  
  19.     public final native void wait(long timeout) throws InterruptedException;
  20.   
  21.     public final void wait(long timeout, int nanos) throws InterruptedException {
  22.         if (timeout < 0) {
  23.             throw new IllegalArgumentException("timeout value is negative");
  24.         }

  25.         if (nanos < 0 || nanos > 999999) {
  26.             throw new IllegalArgumentException(
  27.                                 "nanosecond timeout value out of range");
  28.         }

  29.         if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
  30.             timeout++;
  31.         }

  32.         wait(timeout);
  33.     }

  34.     public final void wait() throws InterruptedException {
  35.         wait(0);
  36.     }
  37.      
  38.     protected void finalize() throws Throwable { }
  39. }

仔細觀察上面的各方法,很快就知道哪些方法可以被子類所繼承,被finally,private修飾的方法已經被"寫死"在父類中,子類不能繼承修改,而static方法不具有多型特性。(java中除了被private,static,private修飾的方法是前期繫結,其他的方法都是後期繫結,這是題外話,這屬於多型方面的知識)
查閱API文件,Object類中定義的方法:


其中可以被子類繼承的方法是:
具體的各個方法可以查閱API文件去了解。


點選(此處)摺疊或開啟

  1. public class Name implements Cloneable {
  2.   
  3.     private String firstName,lastName;
  4.     public Name(String firstName,String lastName){
  5.         
  6.         this.firstName = firstName;
  7.         this.lastName = lastName;
  8.     }
  9.     public String getFirstName(){
  10.         return firstName;
  11.     }
  12.     public String getLastName(){
  13.         return lastName;
  14.     }
  15.     public String toString(){
  16.         
  17.         return firstName + " " + lastName;
  18.     }
  19.     
  20.     public Object clone() throws CloneNotSupportedException {
  21.      return (Name)super.clone();
  22.     }
  23.     
  24.     public boolean equals(Object obj){
  25.         
  26.         if(obj instanceof Name){
  27.             
  28.             Name name = (Name)obj;
  29.             return (firstName.equals(firstName))&&(lastName.equals(lastName));
  30.         }
  31.      return super.equals(obj);
  32.     }
  33.     public int hashCode(){
  34.         
  35.         return firstName.hashCode();
  36.     }
  37. }

  38. public class Test{
  39.    
  40.     public static void main(String[] args){
  41.         Name n = new Name("diy","os");
  42.      try{
  43.      Name m =(Name)n.clone();
  44.      String ss = m.getFirstName() + m.getLastName();
  45.      System.out.println(ss);
  46.      System.out.println(m.equals(n));
  47.      System.out.println(n.equals(m));
  48.      System.out.println("m.hashCode:" + m.hashCode() + " " + "n.hashCode:" + n.hashCode());
  49.     
  50.      Name p = n;
  51.      System.out.println("n.hashCode:" + n.hashCode() + " " + "p.hashCode:" + p.hashCode());
  52.      System.out.println("p.hashCode" + p.hashCode() + " " + "m.hashCode" + m.hashCode());
  53.      System.out.println(n.getClass());
  54.      }catch(CloneNotSupportedException e){
  55.         
  56.          e.printStackTrace();
  57.      }
  58.     
  59.  }
  60. }
執行結果:


指出該方法可能丟擲異常,則對這種異常,一定要進行捕獲處理(對於把異常拋給呼叫者,但是最終還是被處理),上面重寫了clone方法,並用public修飾,為了在Test類中可以呼叫。然後在Test類中捕獲可能發生的異常,引用m是從n clone而來,所以equals為true,而且hashCode也相等,接著在棧裡建立了Name引用p,n賦值給p,也就是兩者指向同一堆記憶體,比較p,n的hashCode,是相同的!p,m的hashCode也是相同的!腦海裡應該自然的浮現四塊記憶體區域:棧中:m,n,p  堆中:new出的Name物件    m,p,n指標指向Name物件   
這裡說明的是,hashCode並不是實際的實體地址!
getClass()返回的是當前執行的類物件
關於toString()方法,這裡不再贅述,學習java的朋友,這個方法都應該很熟悉。
上面簡單的介紹,也是自己一個小小的總結,關於深入的瞭解Object類,可以參考其他書籍,如果錯誤之處,請讀者指正!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1819489/,如需轉載,請註明出處,否則將追究法律責任。

相關文章