Java 面向對象-多態 ③

覆寫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字段就不可修改。

Java 面向對象-多態 ①

Java 面向對象-多態 ②

Java 面向對象-多態 ③

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章