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不保證此方法總被調用。