簡體   English   中英

匿名類變量

[英]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的原因是xprivate ; 正如它在JLS Sec 8.2中所述

聲明為private的類的成員不會被該類的子類繼承。

所以沒有AnonClass$1.x可以打印; 名為x范圍中唯一的標識符是AnonClass.x

這里有兩個類:常規類AnonClass和匿名類AnonClass$1擴展AnonClass

這兩個類都有x字段

您還有兩個對象:一個是在main方法中實例化的AnonClass類型,其中x = 4 ,另一個類型為AnonClass$1testMethod()實例化, x = 12

當你打印super.x的值時,你正在訪問第二個對象的x字段; x的值屬於第一個對象,因為您的類不是static並且包含對外部類實例的隱式引用

參考: Java中的嵌套類

暫無
暫無

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

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