2013-04-13 66 views
3

這只是一個知識/好奇心問題。引用來自內部類的封閉實例

在Java中待了好幾年之後,這只不過讓我印象深刻。

class Foo { 

    class Bar{ 

     Foo.this.doSomething(); 

    } 

} 

當我看着Foo.this,我會認爲這是一個靜態引用這顯然並非如此。

我知道這是Java規範的一部分,但是到底使用<Class>.this時發生了什麼?

它是那些「它只是」的東西之一嗎?

+0

@noob。請不要編輯Android標籤。我只使用Java編寫代碼,因爲我創建了Android應用程序。這個問題也與Android開發者有着廣泛的關聯。 – Simon

+1

首先,Bhesh Gurung是刪除Android標籤的人,而不是noob。你碰巧使用android的事實與標籤無關。如果我碰巧做我的Java編程來創建Windows應用程序,那麼我可以輕鬆地將這個問題標記爲Windows。你的問題是沒有使用任何與Android相關的功能,所以它不會提醒一個android標籤。我已經避免恢復編輯,但僅僅是因爲害怕無意義的編輯戰爭。 – Brian

+0

@Brian。好吧,無論如何它都有點愚蠢,但是如果大多數Android開發者也訂閱了Java標籤,我可能會同意你的看法。由於他們不這樣做,並且Android開發人員是所有Java開發人員中非常重要的一員,所以我非常不同意。感謝您離開編輯。 – Simon

回答

7

我知道這是Java規範的一部分,但是當你使用.this時究竟發生了什麼?

它只是指Bar中的「隱藏」字段。通過反編譯很容易看到這一點。您會看到有一個Bar構造函數參考Foo的實例。該引用存儲在一個字段中,然後當您使用Foo.this時,它只會訪問該字段。因此,假如你把你的Foo.this.doSomething()someMethod電話,你的代碼是類似於:

class Foo { 

    static class Bar { 
     private final Foo $foo; 

     Bar(Foo foo) { 
      this.$foo = foo; 
     }  

     public void someMethod() { 
      $foo.doSomething(); 
     } 
    } 
} 
+0

感謝喬恩,我從來不知道這一點。這是非常明確的,當這樣佈局;) – Simon

+0

@JonSkeet很好的答案,但如果這是反編譯後的樣子,它是如何工作的,當內部類有一個參數化的構造函數? –

+0

@MarkW:你爲什麼不試試看? :)(它只會爲你寫的列表添加一個額外的參數...) –

相關問題