原文轉自:http://blog.csdn.net/zhangjk1993/article/details/24196847
1 public class FinalTest1 { 2 //-----------------成員變量------------------// 3 //初始化方式一,在定義變量時直接賦值 4 private final int i = 3; 5 6 //初始化方式二,聲明完變量后在構造方法中為其賦值 7 //如果采用用這種方式,那么每個構造方法中都要有j賦值的語句 8 private final int j; 9 10 public FinalTest1() { 11 j = 3; 12 } 13 14 //如果取消該構造方法的注釋,程序就會報錯,因此它沒有為j賦值 15 /*public FinalTest1(String str) { 16 17 }*/ 18 19 //為了方便我們可以這樣寫 20 public FinalTest1(String str) { 21 this(); 22 } 23 24 //下面的代碼同樣會報錯,因為對j重復賦值 25 /*public FinalTest1(String str1, String str2) { 26 this(); 27 j = 3;//The final field j may already have been assigned 28 }*/ 29 30 31 //初始化方式三,聲明完變量后在構造代碼塊中為其賦值 32 //如果采用此方式,就不能在構造方法中再次為其賦值 33 //構造代碼塊中的代碼會在構造函數之前執行,如果在構造函數中再次賦值, 34 //就會造成final變量的重復賦值 35 private final int k; 36 37 { 38 k = 4; 39 } 40 41 //-----------------類變量(靜態變量)------------------// 42 //初始化方式一,在定義類變量時直接賦值 43 public final static int p = 3; 44 45 //初始化方式二,在靜態代碼塊中賦值 46 //成員變量可以在構造函數中賦值,但是類變量卻不可以。 47 //因此成員變量屬於對象獨有,每個對象創建時只會調用一次構造函數, 48 //因此可以保證該成員變量只被初始化一次; 49 //而類變量是該類的所有對象共有,每個對象創建時都會對該變量賦值 50 //這樣就會造成變量的重復賦值。 51 public final static int q; 52 53 static { 54 q = 3; 55 } 56 }