[英]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
以及Inner
或MegaInner
多個實例。 調用Main.SupperInner.this.a
從內部MegaInner
,它不會是清楚哪些情況下(如果在所有的實例),應該有a
變量設置為6。
內部類的行為與普通類非常相似:人們總是需要一個實例來在其中設置變量。 Main.SuperInner.this
不會從表示一個實例MegaInner
的視圖,如this
僅指的類層次結構MegaInner
,這SuperInner
不的一部分。
該“合格這個”表達Main.SuperInner.this.a
內appers MegaInner
。
MegaInner
的封閉類是Inner
和Main
。 所以this
是第0個合格this
, Inner.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.