這只是一個知識/好奇心問題。引用來自內部類的封閉實例
在Java中待了好幾年之後,這只不過讓我印象深刻。
class Foo {
class Bar{
Foo.this.doSomething();
}
}
當我看着Foo.this
,我會認爲這是一個靜態引用這顯然並非如此。
我知道這是Java規範的一部分,但是到底使用<Class>.this
時發生了什麼?
它是那些「它只是」的東西之一嗎?
這只是一個知識/好奇心問題。引用來自內部類的封閉實例
在Java中待了好幾年之後,這只不過讓我印象深刻。
class Foo {
class Bar{
Foo.this.doSomething();
}
}
當我看着Foo.this
,我會認爲這是一個靜態引用這顯然並非如此。
我知道這是Java規範的一部分,但是到底使用<Class>.this
時發生了什麼?
它是那些「它只是」的東西之一嗎?
我知道這是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();
}
}
}
感謝喬恩,我從來不知道這一點。這是非常明確的,當這樣佈局;) – Simon
@JonSkeet很好的答案,但如果這是反編譯後的樣子,它是如何工作的,當內部類有一個參數化的構造函數? –
@MarkW:你爲什麼不試試看? :)(它只會爲你寫的列表添加一個額外的參數...) –
@noob。請不要編輯Android標籤。我只使用Java編寫代碼,因爲我創建了Android應用程序。這個問題也與Android開發者有着廣泛的關聯。 – Simon
首先,Bhesh Gurung是刪除Android標籤的人,而不是noob。你碰巧使用android的事實與標籤無關。如果我碰巧做我的Java編程來創建Windows應用程序,那麼我可以輕鬆地將這個問題標記爲Windows。你的問題是沒有使用任何與Android相關的功能,所以它不會提醒一個android標籤。我已經避免恢復編輯,但僅僅是因爲害怕無意義的編輯戰爭。 – Brian
@Brian。好吧,無論如何它都有點愚蠢,但是如果大多數Android開發者也訂閱了Java標籤,我可能會同意你的看法。由於他們不這樣做,並且Android開發人員是所有Java開發人員中非常重要的一員,所以我非常不同意。感謝您離開編輯。 – Simon