簡體   English   中英

為什么我們不能從內部的類構造函數訪問另一個內部類?

[英]Why can't we get access from the inner's class constructor to another inner class?

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
    }

    public class SuperInner{
        int a;
    }

    public class Inner{
        public class MegaInner{
            public MegaInner(){
                Main.SuperInner.this.a = 6; //error: not an enclosing class: Main.SuperInner
            }
        }
    }
}

愛迪生

JLS說的是:

令C為ClassName表示的類。 令n為整數,使C為限定該表達式出現的類的第n個詞法包圍類。

[...]

如果當前類不是類C或C本身的內部類,則這是編譯時錯誤。

C:=Main的情況下,內部類S := {SuperInner, MegaInner, Inner} 這意味着上面的代碼應該可以正常工作。 怎么了?

一個可以具有SuperInner以及InnerMegaInner多個實例。 調用Main.SupperInner.this.a從內部MegaInner ,它不會是清楚哪些情況下(如果在所有的實例),應該有a變量設置為6。

內部類的行為與普通類非常相似:人們總是需要一個實例來在其中設置變量。 Main.SuperInner.this不會從表示一個實例MegaInner的視圖,如this僅指的類層次結構MegaInner ,這SuperInner不的一部分。

該“合格這個”表達Main.SuperInner.this.a內appers MegaInner

MegaInner的封閉類是InnerMain 所以this是第0個合格thisInner.this是第一本合格,並Main.this是第二合格此。

您缺少的部分是它必須是帶有this的表達式出現的類的封閉類 SuperInner不是MegaInner的封閉類,因此Qualified this不適用於它。

考慮一下現實。 this表達式引用該類的實例 它不引用類本身。 例如,您不能從靜態方法中引用this

現在,當您創建MegaInner實例時,它必須是Inner實際實例和Main實際實例的一部分。 但是並不能保證存在SuperInner的實際實例。 封閉類的代碼可以隨時創建SuperInner類型的對象,並且獨立於Inner的實例。

因此,你不能訪問this在編譯時它。 但是,如果通過引用變量為其提供了實例,則可以訪問變量a ,因為它們都是同一外部類的成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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