final關鍵字在Java中指的是"沒法改變的"。它做爲數據,方法和類的修飾符號有以下做用。spa
數據以final修飾來告知編譯器這是一塊恆定不變的數據,好比:code
1)一個永不改變的編譯時常量對象
2)一個不但願被改變的運行時初始化的值blog
對於永不改變的編譯時常量,編譯器可能將該常量值直接代入計算式中繼承
final int MAX = 20;
一般使用大寫,多個單詞如下劃線分隔,其效果(不考慮做用域)可類比於c語言中的:作用域
#define MAX 20
與static聯用,該域將佔據一個不能改變的存儲空間。編譯器
static final int MIN = 0;
修飾的對象引用不可改變,即一旦引用被初始化指向一個對象,就不能再把它改變指向另外一個對象。一個誤區是,引用的對象自己不能改變。編譯
public class Test { public static void main(String args[]){ final Person s1 = new Person(); Person s2 = new Person(); //s1 = s2; 報錯,緣由是s1是final修飾的對象引用 s2 = s1; //正確運行 s1.name = "Sakura"; //正確運行 } } class Person{ public String name = "sakura"; }
一般來講,修飾方法是爲了把方法鎖定,防止任何繼承類修改它的含義。class
class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } } class Student extends Person{ public void print(){ //報錯,沒法經過編譯 System.out.printf(name); } }
在方法參數列表中以聲明的方式將參數指定爲final,表明在方法中沒法改變參數指引的對象。引用
class Person{ public void print(final String str){ str = "sakura"; //沒法經過編譯,去掉final則正常運行 System.out.println(str); } }
將某個類總體定義爲final,即表明該類不能被繼承。
final class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } } class Student extends Person{ //沒法經過編譯 }
注意,類被final修飾,不表明類中的域被final修飾,類中的域不被final修飾就表明該域能夠被修改;即它的可修改性與類是否有final修飾無關。
public class Test { public static void main(String args[]){ Person s1 = new Person(); s1.name = "Sakura"; //運行正常 } } final class Person{ String name = "sakura"; public final void print(){ System.out.printf(name); } }
容許生成空白final,即未給定初值得final域;final修飾類中的某個域時,必須保證該域在定義時初始化或在構造器中被初始化。
class Person{ final String name; Person(){ name = "sakura"; } }