2017-05-24 66 views
1
class MyClass1 { 

    int x = 10; 

    public static void main(String[] args) { 
     MyClass1 obj = new MyClass1(); 
     obj.execute(); 
    } 

    private void execute() { 
     Thread t = new Thread(new Runnable(){ 
      @Override 
      public void run() { 
       System.out.println(this); 
       System.out.println(MyClass1.this.x); 
      } 
     }); 
     t.start(); 
    } 

} 

這裏指的是匿名內部類的對象。這就是爲什麼this.x不起作用。但是我們如何使用這個來引用MyClass1對象?請解釋。當我們執行Sysout(this)時,它會輸出[email protected],其中$指定內部類對象。我不清楚這一點。引用匿名內部類中的實例變量

+0

你'this'是匿名的Runnable類,而不是MyClass1的。 –

+2

@HovercraftFullOfEels不應該爲靜態主類中的類成員變量工作或? – SomeJavaGuy

+3

@SomeJavaGuy:完全正確。需要。更多。咖啡! –

回答

5

不能使用this關鍵字在靜態方法,因爲this指向一個實例的類的和靜態方法,你沒有一個實例。

3

創建匿名內部類的方法不是實例方法,而是靜態方法。

另外,語法是MyClass1.this.x,而不是this.x

要讓它工作,重寫它是這樣的:

class MyClass1 { 
    int x= 10; 
    public static void main(String[] args) { 
     new MyClass1().main(); 
    } 

    private void main() { 
     Thread t= new Thread(new Runnable(){ 

      @Override 
      public void run() { 
       System.out.println(this); 

       System.out.println(MyClass1.this.x); 
      } 
     }); 
     t.start(); 
    } 
} 
+0

我明白這裏指的是匿名內部類的對象。因此,如果它是一個實例方法,它仍然指向匿名內部類,那麼如何將它引用爲MyClass1.this.x?我的意思是我們如何使用這個來引用MyClass1 obj?我仍然不清楚這一點。 –

+0

在這個例子中,MyClass1的一個實例方法創建一個內部類。內部類獲得'MyClass1'類型的'隱藏'字段,您可以通過'MyClass1.this'在代碼中引用該字段。 –