熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java語言深入 final在java中的應用

2013-11-23 19:28:34  來源: Java核心技術 
final在Java中並不常用然而它卻為我們提供了諸如在C語言中定義常量的功能不僅如此final還可以讓你控制你的成員方法或者是一個類是否可被覆寫或繼承等功能這些特點使final在Java中擁有了一個不可或缺的地位也是學習Java時必須要知道和掌握的關鍵字之一
final成員
  當你在類中定義變量時在其前面加上final關鍵字那便是說這個變量一旦被初始化便不可改變這裡不可改變的意思對基本類型來說是其值不可變而對於對象變量來說其引用不可再變其初始化可以在兩個地方一是其定義處也就是說在final變量定義時直接給其賦值二是在構造函數中這兩個地方只能選其一要麼在定義時給值要麼在構造函數中給值不能同時既在定義時給了值又在構造函數中給另外的值下面這段代碼演示了這一點
import javautilList;
import javautilArrayList;
import javautilLinkedList;
public class Bat{
    final PI=;          //在定義時便給址值
    final int i;            //因為要在構造函數中進行初始化所以此處便不可再給值
    final List list;        //此變量也與上面的一樣
    Bat(){
        i=;
        list=new LinkedList();
    }
    Bat(int iiList l){
        i=ii;
        list=l;
    }
    public static void main(String[] args){
        Bat b=new Bat();
        blistadd(new Bat());
        //bi=;
        //blist=new ArrayList();
        Systemoutprintln(I=+bi+ List Type:+blistgetClass());
        b=new Bat(new ArrayList());
        blistadd(new Bat());
        Systemoutprintln(I=+bi+ List Type:+blistgetClass());
    }
}
  此程序很簡單的演示了final的常規用法在這裡使用在構造函數中進行初始化的方法這使你有了一點靈活性如Bat的兩個重載構造函數所示第一個缺省構造函數會為你提供默認的值重載的那個構造函數會根據你所提供的值或類型為final變量初始化然而有時你並不需要這種靈活性你只需要在定義時便給定其值並永不變化這時就不要再用這種方法在main方法中有兩行語句注釋掉了如果你去掉注釋程序便無法通過編譯這便是說不論是i的值或是 list的類型一旦初始化確實無法再更改然而b可以通過重新初始化來指定i的值或list的類型輸出結果中顯示了這一點
I= List Type:class javautilLinkedList
I= List Type:class javautilArrayList
  還有一種用法是定義方法中的參數為final對於基本類型的變量這樣做並沒有什麼實際意義因為基本類型的變量在調用方法時是傳值的也就是說你可以在方法中更改這個參數變量而不會影響到調用語句然而對於對象變量卻顯得很實用因為對象變量在傳遞時是傳遞其引用這樣你在方法中對對象變量的修改也會影響到調用語句中的對象變量當你在方法中不需要改變作為參數的對象變量時明確使用final進行聲明會防止你無意的修改而影響到調用方法
另外方法中的內部類在用到方法中的參變量時此參變也必須聲明為final才可使用如下代碼所示
public class INClass{
   void innerClass(final String str){
        class IClass{
            IClass(){
                Systemoutprintln(str);
            }
        }
        IClass ic=new IClass();
    }
  public static void main(String[] args){
      INClass inc=new INClass();
      incinnerClass(Hello);
  }
}
final方法
  將方法聲明為final那就說明你已經知道這個方法提供的功能已經滿足你要求不需要進行擴展並且也不允許任何從此類繼承的類來覆寫這個方法但是繼承仍然可以繼承這個方法也就是說可以直接使用另外有一種被稱為inline的機制它會使你在調用final方法時直接將方法主體插入到調用處而不是進行例行的方法調用例如保存斷點壓棧等這樣可能會使你的程序效率有所提高然而當你的方法主體非常龐大時或你在多處調用此方法那麼你的調用主體代碼便會迅速膨脹可能反而會影響效率所以你要慎用final進行方法定義
final類
  當你將final用於類身上時你就需要仔細考慮因為一個final類是無法被任何人繼承的那也就意味著此類在一個繼承樹中是一個葉子類並且此類的設計已被認為很完美而不需要進行修改或擴展對於final類中的成員你可以定義其為final也可以不是final而對於方法由於所屬類為final的關系自然也就成了 final型的你也可以明確的給final類中的方法加上一個final但這顯然沒有意義
  下面的程序演示了final方法和final類的用法
final class final{
    final String str=final Data;
    public String str=non final data;
    final public void print(){
        Systemoutprintln(final method);
    }
    public void what(){
        Systemoutprintln(str+\n+str);
    }
}
public class FinalDemo {   //extends final 無法繼承 
    public static void main(String[] args){
        final f=new final();
        fwhat();
        fprint();
    }
}
  從程序中可以看出final類與普通類的使用幾乎沒有差別只是它失去了被繼承的特性final方法與非final方法的區別也很難從程序行看出只是記住慎用
final在設計模式中的應用
  在設計模式中有一種模式叫做不變模式在Java中通過final關鍵字可以很容易的實現這個模式在講解final成員時用到的程序Batjava就是一個不變模式的例子如果你對此感興趣可以參考閻宏博士編寫的《Java與模式》一書中的講解
  到此為止thisstaticsuper和final的使用已經說完了如果你對這四個關鍵字已經能夠大致說出它們的區別與用法那便說明你基本已經掌握然而世界上的任何東西都不是完美無缺的Java提供這四個關鍵字給程序員的編程帶來了很大的便利但並不是說要讓你到處使用一旦達到濫用的程序便適得其反所以在使用時請一定要認真考慮 
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26924.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.