java類和對象:基類Object


一、Object類的疑問

Object是所有java類型的基類,但是隨便定義一個類型Test類,它是如何繼承於Object的呢?

public class Test{
     public static void main(String[] args){
          System.out.println("這是一個測試類");
     }
}

這無非有兩種情況:

  • java編譯器遇到沒有父類的java類時為其指定一個默認的父類(Object)
  • jvm虛擬機在運行時遇到沒有父類的java類時自動為其指定一個默認的父類

可以反編譯Test.class進行測試,發現反編譯的Test類繼承於java.lang.Object,則證明第一種猜測是正確的。

二、Object類的方法

1、 clone方法

protected Object clone()

  Creates and returns a copy of this object.

  Object類中的說明是:

  protected Object clone()

  throws CloneNotSupportedException

  這個方法比較特殊:

  首先,使用這個方法的類必須實現java.lang.Cloneable接口,否則會拋出CloneNotSupportedException異常。

  Cloneable接口中不包含任何方法,所以實現它時只要在類聲明中加上implements語句即可。

  第二個比較特殊的地方在於這個方法是protected修飾的,覆寫clone()方法的時候需要寫成public,才能讓類外部的代碼調用。

2、 equals方法

boolean equals(Object obj)

  Indicates whether some other object is "equal to" this one.

  “==”運算符判斷兩個引用是否指向同一個對象。

  對於Object類的equals()方法來說,它判斷調用equals()方法的引用於傳進來的引用是否一致,即這兩個引用是否指向的是同一個對象。

  Object類中的equals()方法如下:

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

  即Object類中的equals()方法等價於==。

  只有當繼承Object的類覆寫(override)了equals()方法之后,繼承類實現了用equals()方法比較兩個對象是否相等,才可以說equals()方法與==的不同。

  equals()方法需要具有如下特點:

  •   自反性(reflexive):任何非空引用x,x.equals(x)返回為true。
  •   對稱性(symmetric):任何非空引用x和y,x.equals(y)返回true當且僅當y.equals(x)返回true。
  •   傳遞性(transitive):任何非空引用x和y,如果x.equals(y)返回true,並且y.equals(z)返回true,那么x.equals(z)返回true。
  •   一致性(consistent):兩個非空引用x和y,x.equals(y)的多次調用應該保持一致的結果,(前提條件是在多次比較之間沒有修改x和y用於比較的相關信息)。
  •   約定:對於任何非空引用x,x.equals(null)應該返回為false。

  並且覆寫equals()方法時,應該同時覆寫hashCode()方法,反之亦然

3、 hashCode方法

int hashCode()

  Returns a hash code value for the object.

  當你覆寫(override)了equals()方法之后,必須也覆寫hashCode()方法,反之亦然。

  這個方法返回一個整型值(hash code value),如果兩個對象被equals()方法判斷為相等,那么它們就應該擁有同樣的hash code。

  Object類的hashCode()方法為不同的對象返回不同的值,Object類的hashCode值表示的是對象的地址。

  hashCode的一般性契約(需要滿足的條件)如下:

  1.   在Java應用的一次執行過程中,如果對象用於equals比較的信息沒有被修改,那么同一個對象多次調用hashCode()方法應該返回同一個整型值。應用的多次執行中,這個值不需要保持一致,即每次執行都是保持着各自不同的值。
  2.   如果equals()判斷兩個對象相等,那么它們的hashCode()方法應該返回同樣的值。
  3.   並沒有強制要求如果equals()判斷兩個對象不相等,那么它們的hashCode()方法就應該返回不同的值。即,兩個對象用equals()方法比較返回false,它們的hashCode可以相同也可以不同。但是,應該意識到,為兩個不相等的對象產生兩個不同的hashCode可以改善哈希表的性能。

4、 toString方法

String toString()

  Returns a string representation of the object.

  當打印引用,如調用System.out.println()時,會自動調用對象的toString()方法,打印出引用所指的對象的toString()方法的返回值,因為每個類都直接或間接地繼承自Object,因此每個類都有toString()方法。

  Object類中的toString()方法定義如下:

public String toString()
{
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

 博客參考:http://www.cnblogs.com/mengdd/archive/2013/01/03/2842809.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM