Java中的final關鍵字是用來限制用戶行為的,說白了,就是用來限制我們這些程序員的。final可以用來修飾:變量、方法、類。
1)Java final variable
final用來修飾變量時,該變量的值是不能改變的,其實就變成了常量,等同於c++中的constant關鍵字。來個栗子嘗嘗:
1 class Bike9{ 2 final int speedlimit=90;//final variable 3 void run(){ 4 speedlimit=400; 5 } 6 public static void main(String args[]){ 7 Bike9 obj=new Bike9(); 8 obj.run(); 9 } 10 }//end of class
Output:Compile Time Error
這段代碼中的speedlimit變量被final修飾,在run() 方法中試圖對該變量進行修改,於是乎編譯器如願以償地報錯了,因為被final修飾的變量只能被賦值一次,一旦賦值,其值不能再被改變。
2)Java final method
被final修飾的方法,不能被覆蓋。舉個栗子:
1 class Bike{ 2 final void run(){System.out.println("running");} 3 } 4 5 class Honda extends Bike{ 6 void run(){System.out.println("running safely with 100kmph");} 7 8 public static void main(String args[]){ 9 Honda honda= new Honda(); 10 honda.run(); 11 } 12 }
Output:Compile Time Error
編譯器再次如我們所願,父累Bike的run() 方法被final修飾,子類Honda試圖覆蓋父類的該方法,編譯報錯。
3)Java final class
被final修飾的類不能被繼承。再來一顆栗子:
1 final class Bike{} 2 3 class Honda1 extends Bike{ 4 void run(){System.out.println("running safely with 100kmph");} 5 6 public static void main(String args[]){ 7 Honda1 honda= new Honda(); 8 honda.run(); 9 } 10 }
結果都不用看了,跟上面一樣。
Q)final 方法能被繼承嗎?
Ans)可以,子類不能覆蓋父類的final方法,但是可以繼承之。栗子:
1 class Bike{ 2 final void run(){System.out.println("running...");} 3 } 4 class Honda2 extends Bike{ 5 public static void main(String args[]){ 6 new Honda2().run(); 7 } 8 }
Output:running...
父類Bike的final run() 方法在子類Honda2中能夠正常調用。
Q)何為未被初始化的 final 變量?
Ans)在聲明final修飾的變量的時候沒有初始化的變量,也稱為 blank final 變量。
考慮這樣一個場景,一個對象的某個字段,只有在該對象被實例化的時候被賦值一次,以后該字段的值不會被改變。這個時候blank final 變量就派上用場了。
1 class Student{ 2 int id; 3 String name; 4 final String PAN_CARD_NUMBER; 5 ... 6 }
Student中的PAN_CARD_NUMBER 字段只有在學生實例被創建的時候賦值一次,以后不會改變。
Q)何時初始化blank final 變量?
Ans)blank final 變量只能在構造函數中初始化。
Q)何為 static blank final 變量?
Ans)被static 和final 修飾的,在聲明的時候未被初始化的變量。static blank final 變量只能在靜態代碼塊中被初始化。栗子:
1 class A{ 2 static final int data;//static blank final variable 3 static{ data=50;} 4 public static void main(String args[]){ 5 System.out.println(A.data); 6 } 7 }
Q)何為final參數?
Ans)被final修飾的參數,該參數的值不能改變。栗子:
1 class Bike11{ 2 int cube(final int n){ 3 n=n+2;//can't be changed as n is final 4 n*n*n; 5 } 6 public static void main(String args[]){ 7 Bike11 b=new Bike11(); 8 b.cube(5); 9 } 10 }
上述代碼中,cube() 方法的參數n被final修飾,其內部對n試圖修改將產生編譯錯誤。
Q)構造函數能聲明為final嗎?
Ans)不能,因為構造函數從來不會被繼承。