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()。