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");