Java final 實例字段(學習 Java 編程語言 030)

final 實例字段:定義爲 final 的實例字段。java

final 實例字段必須在構造對象時初始化。也就是說,必須確保在每個構造器執行以後,這個字段的值已經設置,而且之後不能再修改這個字段。app

例如,將 Employee 類中的 name 字段聲明爲 final,由於在對象構造以後,這個值不會再改變,即沒有 setName 方法。ide

在構造方法中初始化 final 實例字段:ui

public class Employee {
    private final String name;

    public Employee(String name) {
        this.name = name;
    }
    ...
}

在初始化塊中初始化 final 實例字段:this

public class Employee {
    private final String name;

    {
        name = "initialization name";
    }
    ...
}

final 修飾符對於類型爲基本類型或者不可變類的字段尤爲有用。(若是類中的全部方法都不會改變其對象,這樣的類就是不可變的類。例如,String 類就是不可變得。)code

對於可變的類,使用 final 修飾符可能會形成混亂。例如 orm

public class Testing {
    private final StringBuilder name;

    public Testing(String name) {
        this.name = new StringBuilder();
        this.name.append(name);
    }
    public StringBuilder getName() {
        return this.name;
    }
    @Override
    public String toString() {
        String str = "%s[name=%s]";
        return String.format(str, getClass().getName(), this.getName());
    }

    public static void main(String[] args) {

        Testing harry = new Testing("Harry");
        System.out.println(harry.toString());

        harry.getName().append(" Hacker");
        System.out.println(harry.toString());
    }
}

final 關鍵字只是表示存儲在 name 變量中的對象引用不會再指示另外一個不一樣的 StringBuilder 對象,不過這個對象是能夠更改的:對象

Testing harry = new Testing("Harry");
harry.getName().append(" Hacker");
相關文章
相關標籤/搜索