內部類訪問的局部變量必須加final


(1)內部類是外部類的一個成員,就像外部類的成員方法一樣,所以內部類有權限訪問外部類的所有成員,包括private的。 
(2)內部類不能訪問外部類方法中的局部變量,除非變量是final的(一般發生在方法中定義的內部類)。這是因為局部變量的生命周期原因。  

 

  class Outer{    
  private int a;   
   public class Inner{   
       private int a;     
     public void method(int a){           
   a++;    //局部變量        
      this.a++;    //Inner類變量    
          Outer.this.a++;    //Outer類變量    
      }  
}
}    
 
         

 

一般做法是在Outer中寫一個返回Inner類對象的方法
  public Inner getInner(){   
   return new Inner(); 
 }    在其他類中使用內部類:
  Outer outer = new Outer();  
Outer.Inner inner = outer.new Inner(); 或者 Outer.Inner inner = outer.getInner(); 
   static內部類的使用:  Outer.Inner inner = new Outer.Inner();  
 
  (1).所謂“局部內部類”就是在對象的方法成員內部定義的類。而方法中的類,訪問同一個方法中的局部變量,卻必須要加上一個final。
  (2).原因是編譯程序實現上的困難:內部類對象的生命周期會超過局部變量的生命期。局部變量的生命期:當該方法被調用時,該方法中的局部變量在棧中被創建,當方法調用結束時,退棧,這些局部變量全部死亡。而內部類對象生命期,與其它類一樣,當創建一個局部內部類對象后,只有當沒有其它人再引用它時,它才能死亡。所以完全可能一個方法已調用結束(局部變量已死亡),但該局部類的對象仍然活着。即:局部類的對象生命期會超過局部變量。
  (3).局部內部類的對象訪問同一個方法中的局部變量,那么這就要求只要局部內部類對象還活着,那么棧中的那些它要訪問的局部變量就不能“死亡”(否則:它都死了,還訪問個什么呢?)。這就是說:局部變量的生命期至少等於或大於局部內部類對象的生命期。
  (4).解決方法:局部內部類的對象可以訪問同一個方法中被定義為final的局部變量。定義為final后,編譯程序的實現方法:將所有的局部內部類對象要訪問的final型局部變量,都拷貝成為該內部類對象中的一個數據成員。這樣,即使棧中局部變量(含final)已死亡,但由於它是final,其值永不變,因而局部內部類對象在變量死亡后,照樣可以訪問final型局部變量。(這一點我有些懷疑)
  (5).歸納總結:局部內部類對象中包含有要訪問的final型局部變量的一個拷貝,成為它的數據成員。因此,正是在這個意義上,final型局部變量的生命期,超過其方法的一次調用。嚴格來說,方法調用結束,所有的局部變量(含final)全死亡了。但:局部內部類對象中有final型局部變量的拷貝。
final 補充說明:
  1.在java中聲明類、屬性、方法時,可使用關鍵字final來修飾
  2.final標記的類不能被繼承。
  3.final標記的方法不能被子類重寫 
 4.final標記的變量(成員變量或局部變量)即成為常量,只能賦值一次。  
5.final標記的變量必須在聲明的同時或在構造方法中顯示賦值,然后才能使用。   
 final int x = 5;
  class Test{     
 final int x ; 
     Test(){    
      x=3;   
  }  }


免責聲明!

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



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