2012-12-23 93 views

回答

9

這是一種從內部類中訪問封閉類的隱式實例的方法。例如:

public class Test { 

    private final String name; 

    public Test(String name) { 
     this.name = name; 
    } 

    public static void main(String[] args) { 
     Test t = new Test("Jon"); 
     // Create an instance of NamePrinter with a reference to the new instance 
     // as the enclosing instance. 
     Runnable r = t.new NamePrinter(); 
     r.run(); 
    }  

    private class NamePrinter implements Runnable { 
     @Override public void run() { 
      // Use the enclosing instance's name variable 
      System.out.println(Test.this.name); 
     } 
    } 
} 

參見爲「合格this」表達的Java Language Specification section 8.1.3所有關於內部類和封閉的情況下,和section 15.8.4

不限詞法包圍實例(§8.1.3)可以是通過顯式限定關鍵字this來引用。

CClassName表示的類別。令n是一個整數,使得C是合格的此表達式出現的類的第n個詞彙封閉類。

形式爲ClassName.this的表達式的值是這個的第n個詞彙封閉實例。

表達式的類型是C

+0

喬恩,有沒有在C#中類似的事情? –

+0

@AdamLee:否 - C#中的嵌套類不能像Java中的內部類一樣工作;沒有隱式的封閉實例。它們更像Java中的靜態嵌套類。 –

1

從內部類您正在調用一個instante方法從TestClass的實例,它堅持它。

1

您可以使用來自內部類的類,它將引用外部類。

例如,如果你有一流的貓

public class Cat { 

private int age; 
private Tail tail; 

public Cat(int age) { 
    this.age = age; 
    this.tail = new Tail(); 
} 

class Tail { 

    public void wave() { 
     for(int i = 0; i < Cat.this.age; i++) { 
      System.out.println("*wave*"); 
     } 
    } 

} 

public Tail getTail() { 
    return tail; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    new Cat(10).getTail().wave(); 
} 

}