關於Java中的final關鍵字


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)不能,因為構造函數從來不會被繼承。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM