java匿名類使用的局部變量只能用final修飾?



public class OuterClass {
    public InnerClass getInnerClass(final int num,String str2){
        return new InnerClass(){
            int number = num + 3;
            public int getNumber(){
                return number;
            }
        };        /* 注意:分號不能省 */
    }
   
    public static void main(String[] args) {
        OuterClass out = new OuterClass();
        InnerClass inner = out.getInnerClass(2, "chenssy");
        System.out.println(inner.getNumber());
    }
}

interface InnerClass {
    int getNumber();
}

方法中匿名類使用到的局部變量只能用final關鍵字修飾:這是方法和匿名類生命週期的結果--當執行方法getInnerClass後,獲得匿名類對象inner,
這是,方法已經執行完畢,方法的局部變量(num、str2)應該會被jvm銷燬,但是,匿名類對象inner還會存在,還被繼續使用(inner.getNumber()),
這個時候,一個解決的途徑是使用final來修飾,java對於被final修飾的變量,會進行復制,複製品直接作爲局部內部中的數據成員,這樣:當局部內部類訪問局部變量 時,其實真正訪問的是這個局部變量的"複製品"(即:複製了變量棧內存,這個複製品就代表了那個局部變量).因此:當運行棧中的真正的局部變量死亡時,局部內部類對象仍可以 訪問局部變量(其實訪問的是"複製品"),給人的感覺:好像是局部變量的"生命期"延長了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章