Java—Object類及自定義克隆詳解

Object類介紹

  Object類是全部類、數組、枚舉的父類,當咱們定義一個類未使用extends關鍵字去顯示指定父類時,則表示該類默認繼承了Object父類。java

Object類經常使用方法

  1. boolean equals(Object obj):判斷兩個對象是否爲同一個對象;
  2. protected void finalize():JVM的垃圾回收GC器能夠使用來清理對象(無引用變量應用該對象,具體可查看JVM中可達性分析等算法)
  3. Class<?> getClass():返回該對象的運行時類;
  4. String toString():返回對象的字符串表示輸出;Object類的toString()方法返回的值爲「運行時類名@十六進制的hashCode值」;
  5. int hashCode():返回對象的hashCode值;
  6. wait():致使當前線程處於等待狀態,直至其餘線程調用該同步監聽器的notify()或者notifyAll()方法喚醒它。調用wait()方法的當前線程會釋放對該同步監視器的鎖定。wait()方法有三種形式:無時間參數、帶毫秒參數的和帶毫秒、毫微秒參數的。第一種是一直等待,直到其餘線程通知;第2、三種是等待指定時間後自動醒來。
  7. notify():喚醒在該同步監視器上等待的單個線程,若全部線程都在這個同步監視器上等待,就會任意選擇其中一個線程進行喚醒。只有當前線程釋放該同步監視器的鎖定後,才能執行被喚醒的線程。
  8. notifyAll():喚醒在該同步監視器上等待的全部線程;只有當前線程釋放該同步監視器的鎖定後,才能執行被喚醒的線程。
  9. protected clone():拷貝、克隆對象,獲得一個當前對象的副本,屬於淺複製,只會拷貝對象的成員變量,若是拷貝的對象內部還有對象,則不會進行拷貝。若是想實現對象中的引用變量(對象中的對象)則須要實現「遞歸」拷貝/克隆(深拷貝),繼續對下一級對象進行拷貝。

:上述提到的同步監視器是指synchronized等關鍵字修飾的同步方法,則同步監視器即爲該類的默認實例(this);或者是synchronized修飾的同步代碼塊,此時同步監視器即爲synchronized後面括號中的對象。算法

自定義拷貝/克隆

  既然提到clone()方法,有必要提一下如何實現自定義類的拷貝/克隆。數組

自定義clone實現步驟

  1. 自定義類實現Cloneable接口;
  2. 自定義類實現本身的clone()方法;
  3. clone()方法中須要有super.clone()來調用Object類實現的clone()方法去獲取該對象的副本,並返回該副本。

自定義clone()的示例

二級對象:測試

public class PersonInformation {
    String address;
    int telephoneNumber;
    public PersonInformation(String address, int telephoneNumber) {
        this.address = address;
        this.telephoneNumber = telephoneNumber;
    }
}

一級對象:this

public class Person implements Cloneable {
    String name;
    int age;
    PersonInformation personInfo;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        personInfo = new PersonInformation("江蘇-南京", 188xx11xx22)
    }
    // 實現clone()方法
    public Person clone() throws CloneNotSupportedException{
        return (Person)super.clone();
    }
}

測試:線程

public class CloneTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Person person1 = new Person("小紅", 20);
        // clone拷貝獲得person1的對象副本
        Person person2 = person1.clone();
        //判斷兩個對象是否相等;
        System.out.println(person1 == person2);
        // 判斷兩個對象中的引用變量是否相等;
        System.out.prinln(person1.personInfo == person2.personInfo);
    }
}

結果:code

true
false
相關文章
相關標籤/搜索