覆寫Object方法
因爲所有的class
最終都繼承自Object
,而Object
定義了幾個重要的方法:
toString()
:把instance輸出爲String
;equals()
:判斷兩個instance是否邏輯相等;hashCode()
:計算一個instance的哈希值。
在必要的情況下,我們可以覆寫Object
的這幾個方法。例如:
class Person {
...
// 顯示更有意義的字符串:
@Override
public String toString() {
return "Person:name=" + name;
}
// 比較是否相等:
@Override
public boolean equals(Object o) {
// 當且僅當o爲Person類型:
if (o instanceof Person) {
Person p = (Person) o;
// 並且name字段相同時,返回true:
return this.name.equals(p.name);
}
return false;
}
// 計算hash:
@Override
public int hashCode() {
return this.name.hashCode();
}
}
調用super
在子類的覆寫方法中,如果要調用父類的被覆寫的方法,可以通過super
來調用。例如:
class Person {
protected String name;
public String hello() {
return "Hello, " + name;
}
}
Student extends Person {
@Override
public String hello() {
// 調用父類的hello()方法:
return super.hello() + "!";
}
}
final
繼承可以允許子類覆寫父類的方法。如果一個父類不允許子類對它的某個方法進行覆寫,可以把該方法標記爲final
。用final
修飾的方法不能被Override
:
class Person {
protected String name;
public final String hello() {
return "Hello, " + name;
}
}
Student extends Person {
// compile error: 不允許覆寫
@Override
public String hello() {
}
}
如果一個類不希望任何其他類繼承自它,那麼可以把這個類本身標記爲final
。用final
修飾的類不能被繼承:
final class Person {
protected String name;
}
// compile error: 不允許繼承自Person
Student extends Person {
}
對於一個類的實例字段,同樣可以用final
修飾。用final
修飾的字段在初始化後不能被修改。例如:
class Person {
public final String name = "Unamed";
}
對final
字段重新賦值會報錯:
Person p = new Person();
p.name = "New Name"; // compile error!
可以在構造方法中初始化final字段:
class Person {
public final String name;
public Person(String name) {
this.name = name;
}
}
這種方法更爲常用,因爲可以保證實例一旦創建,其final
字段就不可修改。