寫出java.lang.Object類的六個常用方法


java是面向對象的語言,而Object類是java中所有類的頂級父類(根類)。

每個類都使用Object類作為超類,所有對象(包括數組)都實現這個類的方法,即使一個類沒有用extends明確指出繼承於某個類,那么它都默認繼承Object類。

Object類中提供了很多方法,這里只取其中比較常用的方法做下簡述。

1)public String toString()  >>> 獲取對象信息的方法

這個方法在打印對象時被調用,將對象的信息變為字符串返回,默認輸出對象地址。

舉個例子:

/**
* 定義一個類 並重寫toString()方法
*/
public
class Person { private String name; private int age; private char gender; @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender=" + gender + '}'; } public Person() { } public Person(String name, int age, char gender) { this.name = name; this.age = age; this.gender = gender; }
/**
 * 測試類
 */
public class Test {
  public static void main(String[] args) {
    Person p1 = new Person("張三",22,'男');
    Person p2 = new Person("李思",23,'女');
    System.out.println(p1.toString());
    System.out.println(p2.toString());
  }
}

運行結果:與重寫的toString()結果結構一致。

2)public boolean equals(Object obj) >>> 對象相等判斷方法

該方法用於比較對象是否相等,而且此方法必須被重寫。

舉個例子:

/**
 * 定義一個類 並重寫equals方法
 */
public class Person {
  private String name;
  private int age;
  private char gender;
  public Person() {
  }
  public Person(String name, int age, char gender) {
    this.name = name;
    this.age = age;
    this.gender = gender;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public char getGender() {
    return gender;
  }
  public void setGender(char gender) {
    this.gender = gender;
  }
  /**
   *重寫equals方法
   */
  public boolean equals(Person p) {
    return super.equals(p);
  }
}
/**
 * 測試類
 */
public class Test {
  public static void main(String[] args) {
    Person p1 = new Person("張三",22,'男');
    Person p2 = new Person("張三",23,'男');
    Person p3 = new Person("張三",22,'男');
    Integer a = 10;
    Integer b = 10;
    boolean flag1 = p1.equals(p2);
    boolean flag2 = p1.equals(p3);
    boolean flag3 = p1.getName().equals(p2.getName());
    boolean flag4 = a.equals(b);
    System.out.println(flag1);
    System.out.println(flag2);
    System.out.println(flag3);
    System.out.println(flag4);
  }
}

運行結果:equals比較的是地址,即使p1和p3的各個屬性一樣,但是通過創建對象兩者在堆中的地址值是不一樣的,因此結果為false。

需要注意的是基本數據類型是沒有equals方法的。上述事例中Integer換成int會報錯,p1.getGender().equals(p2.getGender())也是不對的。

3)public native int hashCode() >>> 對象簽名

該方法用來返回其所在對象的物理地址(哈希碼值),常會和equals方法同時重寫,確保兩個相等的對象擁有相等的.hashCode。

  /**
   * 重寫hashCode方法
   */
  @Override
  public int hashCode() {
    return super.hashCode();
  }
/**
 * 測試類
 */
public class Test {
  public static void main(String[] args) {
    Person p1 = new Person("張三",22,'男');
    Person p2 = new Person("張三",22,'男');
    int i1 = p1.getName().hashCode();
    int i2 = p2.getName().hashCode();
    int i3 = p1.hashCode();
    int i4 = p2.hashCode();
    System.out.println(i1);
    System.out.println(i2);
    System.out.println(i3);
    System.out.println(i4);
  }
}

運行結果:

由此可見通過new的對象即使屬性賦值一致,對象的hashCode也是不一樣的。

4)public final native Class<?> getClass() >>> 返回此Object的運行時類

注意:此方法不可重寫,要調用的話一般和getName()聯合使用,如getClass().getName()

該方法在反射中有大用!

5)線程中常用的方法(此處合在一起說明)

public final void wait()  >>> 多線程中等待功能

public final native void notify() >>> 多線程中喚醒功能

public final native void notifyAll() >>> 多線程中喚醒所有等待線程的功能

其中wait()方法還有另外兩個帶不同功能的方法:

public final native void wait(long timeout) >>> 要等待的最長時間,單位毫秒

public final void wait(long timeout, int nanos) >>> nanos額外時間,單位納秒

6)protected native Object clone() >>> protected修飾的方法,功能是完成對象的淺復制(創建並返回此對象的一個副本----“副本”的准確含義可能依賴於對象的類)

只有實現了Cloneable接口才可以調用該方法,否則拋出CloneNotSupportedException。

Java中除了8種基本類型傳參數是值傳遞,其他的類對象傳參數都是引用傳遞,我們有時候不希望在方法里將參數改變,這時就需要在類中復寫clone方法(實現深復制)。

7)protected void finalize() >>> 垃圾回收(釋放資源的方法)

該方法即使被調用也不知道什么時候執行,所以一般很少主動使用。

finalize()方法的用途:

無論對象是如何創建的,垃圾回收器都會負責釋放對象占據的所有內存。這就將對finalize()的需求限制到一種特殊情況,即通過某種創建對象的方式以外的方式為對象分配了存儲空間。這種情況一般發生在使用“本地方法”的情況下,本地方法是一種在Java中調用非Java代碼的方式。

*>>Java的一大特點就是垃圾回收機制。關於垃圾回收需要注意以下幾點:

1)對象可能不被垃圾回收。

只要程序沒有瀕臨存儲空間用完的那一刻,對象占用的空間就總也得不到釋放。

2)垃圾回收並不等於“析構”。

3)垃圾回收只與內存有關。

使用垃圾回收的唯一原因就是為了回收程序不再使用的內存。

綜上所述,Object類常用的六種方法是toString()equals()hashCode()wait()notify()notifyAll()


免責聲明!

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



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