2015-07-01 73 views
1

下是合法的(據我所知):OuterClass.this.someMethod()背後的基本原理是什麼?

class Outer { 
    void someMethod() { 
     // do something 
    } 

    class Inner { 
     void innerMethod() { 
      Outer.this.someMethod(); 
     } 
    } 
} 

雖然我明白髮生了什麼,結果是什麼,我不明白爲什麼這是好的。

我最常被外部類的實例如何通過靜態成員語法訪問困惑:Outer.this不應該this,對特定的外部實例的引用是任何東西但是靜態的?語法是一樣的,但功能是不同的,或者是某種外部的靜態字段?

換言之,該代碼使用Class.field語法訪問外部類的實例,該語法我總是與靜態成員相關聯。但是,如果它是一個類的特定實例,它怎麼能是靜態的?通過這個邏輯,Outer的另一個實例將從Object.this返回一個不同的Outer對象......這不是靜態的......我的腦子受傷了。

回答

4

this也不是一成不變的確實。這只是用於區分生活在同一範圍內的不同對象的符號。

如果沒有這種表示法,將無法從Inner對象中獲取對Outer對象的引用。將Outer.this.someMethod()替換爲this.someMethod(),由於this本身指的是Inner對象(它沒有someMethod方法),因此會出現編譯錯誤。

3

在您的內部類中,this引用您的Inner實例,所以您需要一種方法來引用外部實例或外部實例的字段,以防與內部實例中的字段衝突。因此,此語法指示您所指的是哪個類的哪個實例,它不是靜態訪問!

https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

0

這是指當前對象。靜態字段/方法作爲一個整體屬於類。 在內部類中,這將表示Inner類對象。 this.someMethod()會給出錯誤,因爲內部類中沒有someMethod()。因此,如果它們相同,則需要區分內部和外部類字段的方法。 Outer.this.someMethod()〜引用外部類的someMethod()函數。

相關問題