關於Java中的final關鍵字

來源:互聯網
上載者:User

標籤:編譯   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關鍵字

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.