标签:
1 public class Outer { 2 private int own = 1; 3 public void outerMethod() { 4 System.out.println("In Outer class"); 5 Inner inner = new Inner(); 6 inner.innerMethod(); 7 } 8 public static void main(String[] args) { 9 Outer outer = new Outer(); 10 outer.outerMethod(); 11 } 12 13 private class Inner { 14 public void innerMethod() { 15 System.out.println("The var own in Outer is " + own); 16 } 17 } 18 }
1 public void innerMethod() { 2 System.out.println("The var own in Outer is " + <strong>outer</strong>.own); 3 }
编译器会修改Inner类的构造器,添加一个外部类Outer的引用作为参数,大概是这个样子:
1 public Inner(Outer outer) { 2 this.outer = outer; 3 }
所以我们在Outer类的outerMethod方法中调用Inner构造器那条语句实际上会被编译器“改成“这个样子:
1 Inner inner = new Inner(this);
1 OuterClass.this
例如,以上Inner类的innerMethod方法我们使用正规语法应该这么写:
public void innerMethod() { System.out.println("The var own in Outer is " + Outer.this.own); }
Inner inner = this.new Inner();
我们还可以显示的将内部类持有的外围类引用指向其它的外围类对象,假设outerObject是一个Outer类实例,我们可以这样写:
Outer.Inner inner = outerObject.new Inner();
这样一来,inner所持有的外围类对象引用即为outerObject。
OuterClass.InnerClass
1 public class Outer { 2 private int own = 1; 3 public void outerMethod() { 4 class Inner { 5 public void innerMethod() { 6 System.out.println("The var own in Outer is " + own); 7 } 8 } 9 System.out.println("In Outer class"); 10 Inner inner = new Inner(); 11 inner.innerMethod(); 12 } 13 public static void main(String[] args) { 14 Outer outer = new Outer(); 15 outer.outerMethod(); 16 } 17 }
new SuperType(construction parameters) { inner class methods and data }
匿名类不能有构造器,因此将构造器参数传给超类的构造器(SuperType)。匿名类内部可以定义一些方法与属性。
new Interface() { methods and data }
注意,以上代码的含义并不是实例化一个接口,而是实例化实现了某种接口的匿名内部类。
... ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent event) { ... } };
1 public class Outer { 2 private int own = 1; 3 public void outerMethod() { } 4 public static void main(String[] args) { } 5 6 private class Inner { 7 public void innerMethod() { } 8 } 9 }
标签:
原文地址:http://www.cnblogs.com/absfree/p/5324695.html