2012-12-23 127 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(); 
} 

}