[英]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 ?
不能完全確定我是否理解您的問題,但我會嘗試回答它們:
- 為什么顯示方法在類文件中具有不同的定義?
您不能將Java文件與類似的類文件進行比較。 某些功能僅存在於一個世界中。 內部類就是這樣的功能之一。 他們沒有直接翻譯成字節碼的方法。 您需要在這里發現一些代碼按摩。
- 為什么在
TestInnerClass
類文件中,實例變量作為TestInnerClass.this.x
訪問。 但是同一代碼在TestInnerClass$A
類文件中與TestInnerClass$A
不同this.this$0.x
?
因為在編譯內部類時,對外部類的隱式引用( TestInnerClass.this
)會轉換為顯式引用。 由於此引用不能具有標識符this
,因此稱為this$0
。
- 為什么JVM創建了合成方法
this$0
,但是實例變量是public?
這不是一種方法,據我所知,它不是公開的。 這是一個存儲對封閉類對象的引用的字段。 訪問該對象的x
是必需的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.