[英]Anonymous class variables
我今天正在嘗試匿名課程。 當我做System.out.println(super.x);
,它打印12,當我使用System.out.println(x);
它打印4.我認為super.x
將打印4,並想知道是否有人可以請你解釋為什么這是?
public class AnonClass {
private int x = 1;
public AnonClass(int x) {
this.x = x;
}
public static void main(String[] args) {
AnonClass test = new AnonClass(4);
test.testMethod();
}
public void testMethod() {
AnonClass anon = new AnonClass(12) {
{
System.out.println(super.x); //Prints 12
System.out.println(x); //prints 4
}
};
}
}
在class AnonClass
定義這樣的匿名類時:
AnonClass anon =
new AnonClass(12) {
{
System.out.println(super.x); //Prints 12
System.out.println(x); //prints 4
}
};
編譯器將創建一個這樣的類:
class AnonClass$1 extends AnonClass {
final AnonClass enclosed;
AnonClass$1(AnonClass enclosed, int x) {
super(x);
System.out.println(super.x);
System.out.println(enclosed.x);
this.enclosed = enclosed;
}
}
然后調用它:
AnonClass anon = new AnonClass$1(this, 12);
請注意, super(x);
的調用( super(x);
)發生在實例初始化程序( System.out.println
行)的內容之前。
因此,字段AnonClass.x
由超級AnonClass.x
器初始化為12,然后通過System.out.println(super.x);
將其值打印為12
System.out.println(super.x);
。
然后, System.out.println(x)
實際上是在AnonClass
的封閉實例中引用x
,其值為4。
它不再打印12
的原因是x
是private
; 正如它在JLS Sec 8.2中所述 :
聲明為private的類的成員不會被該類的子類繼承。
所以沒有AnonClass$1.x
可以打印; 名為x
范圍中唯一的標識符是AnonClass.x
。
這里有兩個類:常規類AnonClass
和匿名類AnonClass$1
擴展AnonClass
這兩個類都有x
字段
您還有兩個對象:一個是在main
方法中實例化的AnonClass
類型,其中x = 4
,另一個類型為AnonClass$1
在testMethod()
實例化, x = 12
當你打印super.x
的值時,你正在訪問第二個對象的x
字段; 但x
的值屬於第一個對象,因為您的類不是static
並且包含對外部類實例的隱式引用
參考: Java中的嵌套類
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.