[英]Inner class and local variables
如果我在方法中定義的Inner class
需要使用它,為什么我需要將local variable
聲明為final
?
示例:
class MyOuter2 {
private String x = "Outer2";
void doStuff() {
final String y = "Hello World";
final class MyInner {
String z = y;
public void seeOuter() {
System.out.println("Outer x is "+x);
System.out.println("Local variable is "+y);
MyInner mi = new MyInner();
mi.seeOuter();
}
}
}
}
為什么String y
需要是最終常量? 它是如何影響的?
局部變量總是存在於堆棧中,當時方法已經超過所有局部變量都消失了。
但是即使在方法結束之后你的內部類對象也可能在堆上(假設一個實例變量保留在引用上),所以在這種情況下它不能訪問你的局部變量,因為它們已經消失了,除非你把它們標記為final
答案是兩者在不同的范圍內。 因此,在內部類訪問它之前,該變量可能會發生變化。 使其成為最終阻止。
這是因為函數內部的類實際上是復制局部變量,因為在本地類的實例仍然存在的情況下,函數調用之后可能會銷毀局部變量。 要使局部變量的兩個副本始終具有相同的值(使它們看起來相同),您必須將變量聲明為final。
我認為這是為了防止程序員犯錯誤。 這樣,編譯器提醒程序員,當您離開該方法時,該變量將不再可訪問。 這對於循環來說至關重要。 想象一下這段代碼:
public void doStuff()
{
InnerClass cls[] = new InnerClass[100];
for (int i = 0; i < 100; ++i)
{
cls[i] = new InnerClass()
{
void doIt()
{
System.out.println(i);
}
};
}
}
當調用doIt()
方法時,將打印什么? i
在循環時改變了。 為了防止這種混淆,您必須將變量復制到局部變量或創建變量final,但是您將無法循環。
你的內部類是最終的,因此你不應該從最終實體內部修改任何內容。
根據Java內存模型,使用final變量可確保始終初始化最終變量。 當我們嘗試使用沒有初始化的局部變量時,我們會收到錯誤 using final保證內部類初始化已使用的局部變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.