簡體   English   中英

成員類(內部類)如何訪問外部類的實例變量?

[英]How Member Class(Inner class) is accessing instance variable of outer class?

我在下面編寫了運行良好的代碼,但是我對合成方法存有疑問。 由於生成這些訪問私有數據。 但是我有成員類中使用的外部類的公共實例變量 ,因此為了訪問實例變量,它創建了綜合方法 (就像在類文件中一樣!)。

代碼段如下:

public class TestInnerClass {
    public int x = 10;
        public static void main(String[] args) {
            TestInnerClass test= new TestInnerClass();
            A obj = test.new A();
            obj.display();
        }

        class A {
            void display() {
            System.out.println(x);
        }
    }
}

類文件生成如下。 對於內部類A作為TestInnerClass $ A:

import java.io.PrintStream;

class TestInnerClass$A {
    TestInnerClass$A(TestInnerClass paramTestInnerClass) {
    }

    void display() {
        System.out.println(this.this$0.x);
    }
}

類文件是為TestInnerClass生成的:

import java.io.PrintStream;
public class TestInnerClass {
    public int x = 10;
    public static void main(String[] args) { 
        TestInnerClass test = new TestInnerClass();
        TestInnerClass tmp13_12 = test; tmp13_12.getClass(); A obj = new A();
        obj.display();
   } 

   class A {
       A() {
       }
       void display() {
           System.out.println(TestInnerClass.this.x);
       }
   }
}

所以我的疑問是:

1)。 為什么顯示方法在類文件中具有不同的不同定義?

2)。 為什么在TestInnerClass類文件中,實例變量作為TestInnerClass.this.x訪問。 但是同一代碼在TestInnerClass $ A的類文件中與此不同。this$ 0.x

3)為什么JVM創建了合成方法this $ 0 ,但是實例變量是public

不能完全確定我是否理解您的問題,但我會嘗試回答它們:

  1. 為什么顯示方法在類文件中具有不同的定義?

您不能將Java文件與類似的類文件進行比較。 某些功能僅存在於一個世界中。 內部類就是這樣的功能之一。 他們沒有直接翻譯成字節碼的方法。 您需要在這里發現一些代碼按摩。

  1. 為什么在TestInnerClass類文件中,實例變量作為TestInnerClass.this.x訪問。 但是同一代碼在TestInnerClass$A類文件中與TestInnerClass$A不同this.this$0.x

因為在編譯內部類時,對外部類的隱式引用( TestInnerClass.this )會轉換為顯式引用。 由於此引用不能具有標識符this ,因此稱為this$0

  1. 為什么JVM創建了合成方法this$0 ,但是實例變量是public?

這不是一種方法,據我所知,它不是公開的。 這是一個存儲對封閉類對象的引用的字段。 訪問該對象的x是必需的。

您可以從外部類訪問變量,因為它們位於內部類的閉包中。 Java中存在閉包 ,但是Java字節碼中不存在閉包 您看到的綜合變量和訪問器是使閉包以Java字節代碼運行所需的處理的一部分。

全面披露:Java中的閉包實際上並不是閉包。 實際的關閉過程會捕獲在其中創建函數的整個環境。 在Java中,內部類始終可以訪問外部類的成員以及創建該方法的方法的最終局部變量。 但是,它不能像JavaScript這樣的語言訪問非最終局部變量。

暫無
暫無

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

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