Java Object類(二)

Java中所有的類都是直接或間接的繼承自Object類,Object類是所有類的父類
常用方法:
這裏寫圖片描述

以及與多線程相關方法:

wait() 等待狀態,是當前線程等待,並讓該線程釋放對象鎖,放進對象的等待池中,等待其他線程將其喚醒。
notify() 通知方法,喚醒等待池中的線程,(隨機選擇一個喚醒)
notifyAll() 通知方法,喚醒等待池中所有線程

Object類的常用方法操作:

/**
 * 重寫toString()
 * @author lzq
 *
 */
class Person {
    private String name;
    private int age;
    public Person() {

    }
    public Person(String name,int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {  //重寫的toString()
        return ("姓名:"+name+",年齡:"+age);
    }

}

public class TestDemo1 {


    public static void main(String[] args) {
        Person per = new Person("小強",22);
        System.out.println(per.toString());

    }

}

運行結果:

姓名:小強,年齡:22

如果沒有重寫toString():將其屏蔽:

javaleiku.Person@e3c624

在Object中的equals()方法定義如下:

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

在Object中的equals()方法並沒有比較兩個對象是否相等的功能,只是判斷兩個引用是否指向同一個對象,所以用的時候要子類重寫,equals()方法的形參必須是Object類型


/**
 * 重寫equals()方法
 * 重寫hashCode()方法
 * @author lzq
 *
 */
class Person {
    private String name;
    private int age;
    public Person() {

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

    public boolean equals(Object o) { //重寫equals()方法
        if(this == o) {        //判斷當前對象是否與指定對象相等
            return true;
        }
        if(o == null) {        //判斷指定對象是否爲空
            return false;
        }
        if(!(o instanceof Person)) {   //判斷指定對象是否是Person的實例
            return false;
        }
        Person per = (Person)o;  //將指定對象轉換爲Person實例
        if(this.name .equals(per.name) && this.age == per.age) { //比較對象屬性是否相等
            return true;
        }else {
            return false;
        }
    }

    public int hashCode() {
        final int prime = 13;
        int result = 13;
        result = prime*result+((name == null) ? 0:name.hashCode());
        result = prime*result+age;
        return result;
    }
}

public class TestDemo1 {


    public static void main(String[] args) {
        /*Person per = new Person("小強",22);
        System.out.println(per.toString());*/
        Person per1 = new Person("小強",22);
        Person per2 = new Person("小強",22);
        Person per3 = new Person("小紅",20);
        System.out.println("per1的哈希碼:"+per1.hashCode());
        System.out.println("per2的哈希碼:"+per2.hashCode());
        System.out.println("per3的哈希碼:"+per3.hashCode());

        if(per1.equals(per2)) {
            System.out.println("per1與per2相等");
        }else {
            System.out.println("per1與per2不相等!!");
        }

        if(per2.equals(per3)) {
            System.out.println("per2與per3相等");
        }else {
            System.out.println("per2與per3不相等!!");
        }


    }

}

運行結果:

per1的哈希碼:9816634
per2的哈希碼:9816634
per3的哈希碼:9921152
per1與per2相等
per2與per3不相等!!

在Java中對equals()方法和hashCode() 方法有以下的約定:

  • 在程序執行期間,如果一個對象的equals()方法做比較所用到的信息沒有被修改,則該對象多次調用的hashCode()方法返回的結果值必須一致。
  • 如果兩個對象根據equals()方法結果值是true,則調用這兩個對象中任意對象的hashCode()方法必須返回同一個整數值
  • 如果兩個對象根據equals()方法結果值是false(),則調用這兩個對象中任意一個對象的hashCode()方法,不要求產生相同的整數結果。但如果不同,則可以提高散列表的性能。就是說,這兩個對象的hashCode()值相同,並代表這兩個對象相等。

對象的克隆,可以通過Object類中的clone()方法,創建一個和該對象內容完全一樣的對象,新的對象也會擁有獨立的內存空間,在子類重寫該方法時,應當擴大訪問權限,但具體的克隆方法還是在Object類中實現,所以只需要在重寫的clone()方法中調用Object()類的clone()方法即可,在對象所在的類中要實現Cloneable()接口,該接口只是一個標識接口,表示對象可以被克隆:

//重寫clone()方法
public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

final、finally和finalize的區別:

  • final用於聲明屬性、方法和類,分別表示了屬性不可變、方法不可重寫、類不可以被繼承,內部類要訪問局部變量,局部變量必須要定義成final類型
  • finally是異常處理語句的一部分,表示總是執行。
  • finalize表示Object類的一個方法,在垃圾回收器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾回收時的其他資源回收,如關閉文件等,JVM不保證此方法總被調用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章