如果你仔細觀察,你會發現Java的所有類別,全部都是繼承自java.lang.Object類別,如果某一個class沒有繼承任何類別,那麼它就會自動繼承Object,成為Object的子類別。Object可以顯式繼承,也可以隱式繼承,意思是一樣的。
// 顯式繼承
public class ClassName extends Object {...}
// 隱式繼承
public class ClassName {...}
用來判斷兩個物件的內容是否相同。若使用str1==str2
則是代表兩個物件的記憶體位址是否相同,兩者功用不太一樣,不要搞混啦~
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = "123";
String str4 = "Hello";
System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // false
System.out.println(str1.equals(str3)); // false
System.out.println(str2.equals(str4)); // true
我們可以使用toString()方法來獲取對象的字符串表示形式。如果沒有在class中重新定義toString()方法,就會將調用預設的toString()方法,會輸出<fully qualified class name>@<hash code of object in hexadecimal>
這個格式的字串。
public class Info {
String name;
int age;
double height;
double weight;
Info(String name, int age, double height, double weight){
this.name = name;
this.age = age;
this.height = height;
this.weight = weight;
}
public static void main(String[] args) {
Info info = new Info("nini", 19, 160, 45);
System.out.println(info); // Info@73a8dfcc
System.out.println(info.toString()); // Info@73a8dfcc
}
}
如果我想要得到Info裡的正確信息,必須在class中覆寫Object類的toString()方法。另外需要確保它被宣告爲public,並且返回類型是String,括號內不接受任何參數。
public String toString() {
String result = name+", "+age+", "+height+", "+weight;
return result;
}
再輸出一次就可以得到看得懂的資訊啦~
nini, 19, 160.0, 45.0
nini, 19, 160.0, 45.0
clone就是克隆嘛,也就是複製出一個一樣但又不能說完全一樣的物件。這個方法是淺拷貝,也就說只會複製原先物件的地址,而不是重新分配一個空間。
由於Object本身並沒有實現Cloneable這個抽象方法,所以如果不覆寫clone方法就直接呼叫clone()會出現CloneNotSupportedException
這邊先寫好一個物件:
public class Info implements Cloneable{
String name;
int age;
double height;
double weight;
public Info(String name, int age){
this.name = name;
this.age = age;
}
接著就來試著建立並複製這個物件。可以發現如果沒有用clone其實就只是指向同一個物件而已,因為地址都是相同的。
public static void main(String[] args) throws CloneNotSupportedException {
Info info = new Info("nini", 19);
Info info2 = info;
System.out.println(info); // Info@73a8dfcc
System.out.println(info2); // Info@73a8dfcc
}
而底下的程式碼可以發現它們的地址不一樣了,才是真真實實的克隆了一個新的物件。
public static void main(String[] args) throws CloneNotSupportedException {
Info info = new Info("nini", 19);
Info info2 = (Info)info.clone();
System.out.println(info); // Info@73a8dfcc
System.out.println(info2); // Info@1c655221
}