天天看點

【JAVA】Object類的方法簡談

                                           Object類的方法簡談

Java中所有的類都繼承自Object類,那我們今天來探讨一下Object類中的方法

PS:Object源碼中,作者那一欄中,出現了這個

package java.lang;

/**
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */
public class Object {
    ....   
}      

unascribed,意思是無歸屬,我猜測是這個類經由很多大佬修改過,無法确定誰是主要作者,便寫了無歸屬。說歪了,回到正題吧!

Object類有以下這幾個方法(按照源碼中的順序)

【1】getClass():Class<?>

【2】hashCode():int

【3】equals(Object):boolean

【4】clone():Object

【5】toString():String

【6】notify():void

【7】notifyAll():void

【8】wait(long):void

【9】wait(long,int):void

【10】wait():void

【11】finalize():void

方法說明

【1】getClass():Class<?>  

傳回該對象運作時類的Class對象,通俗點,就是這個對象所屬的類

代碼說明

public static void testGetClass() {
        ObjectTest test = new ObjectTest();
        System.out.println(test.getClass());
    }      

輸出為

【JAVA】Object類的方法簡談

可以看得出是輸出的結構是   class   包名.類名

【2】hashCode():int

傳回該對象的哈希值

(1)同一個對象的哈希值一定相同

(2)不同對象的哈希值可能相同,而不是絕對不相同

(3)哈希值一般用來提高查詢的效率

(4)HashSet使用對象的hashcode與equals來判斷是否插入了重複對象

代碼示範

public static void testHashCode(){
        System.out.println("同一個對象");
        ObjectTest test = new ObjectTest();
        System.out.println(test.hashCode());
        System.out.println(test.hashCode());
        System.out.println("兩個不同的對象");
        System.out.println(new ObjectTest().hashCode());
        System.out.println(new ObjectTest().hashCode());
    }      

輸出為

【JAVA】Object類的方法簡談

【3】equals(Object):boolean

判斷兩個對象記憶體位址是否相同,方法内部直接 return (this==object)

注意(1)凡是涉及到new的操作,均傳回false,因為這是在堆中執行個體化了新的對象

代碼示範

public static void testEquals() {
        System.out.println(new ObjectTest().equals(new ObjectTest()));
    }      

輸出為

【JAVA】Object類的方法簡談

(2)equals傳回true的兩個對象,其哈希值一定相同

(3)哈希值相同的兩個對象,equals不一定傳回true

【4】clone():Object

建立一個對象的副本

注意

(1)建立出來的是新的對象,equals傳回false

(2)clone()不會調用構造方法

(3)目前類需要實作Cloneable辨別接口,目前類對象才支援clone()方法

代碼示範

public class ObjectTest implements Cloneable{

   ......

    public static void testClone(){
        ObjectTest objectTest=new ObjectTest();
        try {
           ObjectTest objectTest1= (ObjectTest) objectTest.clone();
           System.out.print(objectTest.equals(objectTest1));
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
      ...
        testClone();

    }
}      

輸出為false

【5】toString():String

将對象轉換成字元串表達形式

(1)不重寫這個方法,直接調用則是輸出目前對象在記憶體中的首位址

(2)重寫這個方法後,輸出該對象的屬性

代碼示範

不重寫toString()方法

package day0807;

public class ObjectTest implements Cloneable {
    public String name;
    public int age;

    public ObjectTest() {
    }

    public ObjectTest(String name, int age) {
        this.name = name;
        this.age = age;
    }

   ....

    public static void testToString() {
        ObjectTest objectTest = new ObjectTest("tom", 22);
        System.out.println(objectTest.toString());
    }

    public static void main(String args[]) {
       ...
        testToString();

    }
}      

輸出為

【JAVA】Object類的方法簡談

重寫後

@Override
    public String toString() {
        return "ObjectTest{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }      

輸出為

【JAVA】Object類的方法簡談

【6】notify():void

【7】notifyAll():void

【8】wait(long):void

【9】wait(long,int):void

【10】wait():void

這幾個方法展現的是java中的多線程

(1)wait()使目前線程挂起并進入到該對象的等待隊列中

(2)從目前對象的等待隊列中随機喚醒一個挂起的線程,通知該線程可以運作

(3)喚醒目前對象的等待隊列中的所有線程

(4)wait(long)與wait(long,int)為下一次自動喚醒距離現在釋放鎖的時間間隔

[關于這幾個方法,涉及到的知識比較多,我會單獨拎出來]

【11】finalize():void

JVM在回收對象所占的記憶體之前調用該方法

(1)當對象不再被任何變量所引用時,會調用這個方法

public static void testFinalize() {
        ObjectTest objectTest = new ObjectTest();
        //将引用強制置為null
        objectTest = null;
        //通知gc開始工作,但gc何時工作無法控制,隻是通知
        System.gc();
    }      

繼續閱讀