簡體   English   中英

內部類和局部變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM