java.lang.Object中的Object是所有class的super class ,不管是哪個class ,最終都會繼承 到它。
Object class 中沒有宣告任何的屬性 只有方法 ,並且也只有一個沒有任何參數 的constructor 。
Object.clone() :複製一個class。 (會在Heap 中放入一個新的,位址值跟與被複製的不同 )
public class Person {
public static void main(String[] args) {
String[] str = new String[5]; 位址值1
String[] str1 = str.clone(); // 位址值2
}
}
Object.**finalize() :**會在物件被垃圾回收器(GC )回收前做某些事,JDK9後不建議使用。
public class Person {
protected void ~~finalize~~() {
System.out.println("我要被回收啦!!!");
}
}
Object.equals():用來比較兩個物件是否相等,只能使用在引用數據類型 ,若是沒有重寫(override)時,比較的是兩個物件的位址值 ,一般會重寫。
public class Person {
public static void main(String[] args) {
int[] i1 = new int[5];
int[] i2 = new int[5];
System.out.println(i1.equals(i2)); // false
}
}
由於Object.equals() 所比較的是位址值,所以i1 i2 不會相等。
一般重寫Object.equals() 的方式:(比較類中的屬性是否相等)。
class Person {
String name;
int age;
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj instaceOf Person) {
Person person = (Person) obj;
return this.age == person.age && this.name.equals(person.name);
}
return false;
}
}
逐行解釋:
this (本身)和參數 的位址值 是否相等,若相等代表指向同一個位置,因此一定會相等。instanceOf 先確認參數 是否為sub class (昨天多態中有提到過),如果符合的話,先將參數 進行強制轉換,再去比較每一個屬性是否相等。name 是String 類型(引用類型),所以無法使用== 進行比較,而是使用String類中已經重寫過的equals 方法去進行值的比較。Object.toString() :將物件所對應的位址值 轉換為String ,一般也會進行重寫 ,將物件中的屬性轉換成String 後印出。
public class Person {
public static void main(String[] args) {
int[] i1 = new int[5];
System.out.println(i1); //I@16b12f91
System.out.println(i1.toString()); //I@16b12f91
}
}
System.out.println() 到最後也是會調用了Object.toString() ,所以當在System.out.println() 內寫一個物件時,不論有沒有寫toString() ,最終都會調用到toString() 方法本身。
一般重寫Object.toString() 的方式:(將屬性和值變為String)。
class Person {
String name;
int age;
String job;
public String toString() {
return "Person{ name = " + name + ", age = " + age + ", job = " + job + " }";
}
}
會將屬性 、值和class name 變為String 後返回。