天天看點

java中final關鍵字介紹

Final關鍵字  

 (1)final成員

  final資料

     當在類中定義變量時,在前面加上final關鍵字,那邊是說,這個變量一旦初始化便不可改變,這裡的不可改變的意思對基本類型來說是其值不可變,而對于對象變量來說其引用不可再變,但引用變量所指向的對象中的内容還是可以改變的。例如:

例如,對于如下語句:

 final StringBuffer a=new StringBuffer("immutable");

執行如下語句将報告編譯期錯誤:

a=new StringBuffer("");

但是,執行如下語句則可以通過編譯:

a.append(" broken!"); 

   final參數

有人在定義方法的參數時,可能想采用如下形式來阻止方法内部修改傳進來的參數對象:實際上,這是辦不到的,在該方法内部仍然可以增加如下代碼來修改參數對象:

例如:

public void method(final  int  i)

{
      retrun i+1;
} 

public void method(final  StringBuffer  param)
{
      param.append("a");
} 

           

 final空白

         java允許“生成空白final”,所為空白final是指被被聲明為final但有未給定初值的域。

  其初始化可以在兩個地方,一是其定義處,也就是在final變量定義時直接給其指派,二是在構造函數中。這兩個地方隻能選其一。

  例如:

package mstest;
class Poppet {
private int i;
public Poppet(int ii) { i = ii; }

}

public class BlankFinal {

  private final int i = 0;  //定義時初始化
  private final int j;      //空白final
  private final Poppet p;   //空白final引用
  
           
//空白finals必須在構造器中初始化
  public BlankFinal() {
       j = 1;
       p = new Poppet(1);
    }

  public BlankFinal(int x) {
       j = x;
       p = new Poppet(x);
    }

  public static void main(String[] args) {

       new BlankFinal();
       new BlankFinal(23);

    }
}       
           

(3)final方法

      使用final方法有兩個原因:第一,(主要是正對繼承來說的)把方法鎖住,防止任何繼承類修改它的含義,即說明該方法提供的功能已經滿足你的要求,不需要進行擴充,并且不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也即是說可以直接使用。第二,效率。在java早期實作中,如果将一個方法指明為final,就是同意編譯器将針對該方法的所用調用都轉為内嵌調用。也即所說的inline機制,他會是你在調用final方法時,直接将方法的主題插入到調用處,而不是進行例行的方法調用,例如存斷點,壓棧等,這樣可能會使你的程式效率有所提高,然而,當你的方法主體非常龐大時,或你在多處調用此方法,那麼你的調用主體代碼便會迅速膨脹,可能反而會影響效率,是以要慎用final進行方法定義。

  注意:類中所有的private方法都隐式地指定為final的。由于無法取用private方法,是以也就無法覆寫它。可以對private方法添加final’修飾詞,但這并不能給該方法增加任何額外的意義。

(3)final類

      将某個類整體定義為final是,就表明該類無法被繼承,換句話說,處于某種考慮,你對該類的設計用不需要做任何改動,或者處于安全考慮,你不希望他有子類。這樣,final類中所有的方法都隐式指定為final的,因為無法覆寫他們。