標籤:編譯 color 建構函式 ble span sys running ons 程式員
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)不能,因為建構函式從來不會被繼承。
關於Java中的final關鍵字