[英]Why the list must be declare by final
TIntArrayList list = new TIntArrayList();
final TIntArrayList tempList = new TIntArrayList();
list.add(10086);
list.add(12345);
list.add(1989);
list.forEach(new TIntProcedure() {
@Override
public boolean execute(int i) {
if (i > 10086) {
tempList.add(i);
}
return true;
}
});
我使用intellij,它提示我用final聲明tempList,為什么tempList必須用final聲明?
“ tempList”的范圍在方法內。 該方法完成后,“ tempList”將最終丟失。 但是,您編寫的匿名類可能仍在堆上,以后可以引用。 將其設置為最終將確保匿名類仍將按預期運行。
這是因為虛擬機的工作方式。
首先,要了解這一點,您需要知道內部堆棧和堆棧框架是什么(在虛擬機內部)
局部變量(基元和引用)都存儲在方法的堆棧框架中,其他方法不可訪問。
在您的情況下,局部變量tempList
在boolean execute(int i)
方法中不可訪問,因為它“屬於”封裝方法(它“存在”於本地堆棧幀中)。
但是,為了使其可訪問,您可以將變量聲明為final,這樣可以將它內部放置在方法的“外部”,就像它是私有實例變量一樣,以便可以由execute()
和其他方法訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.