标签:nbsp ted rate 输出 实例化 rgs 类的方法 div 一个
Java中继承匿名内部类一个要结局的问题就是,内部类的构造器必须要指向其外围对象的引用,所以要采取特殊的语法。书上给的示例代码的可有编译版本,必须在继承的内部类的构造器内添加enclosingClassReference.super().
1 class WithInner{ 2 class Inner{} 3 } 4 public class InheritInner extends WithInner.Inner{ 5 InheritInner(){ 6 enclosingClassReference.super(); 7 } 8 InheritInner(WithInner wi){ 9 wi.super(); 10 } 11 public static void main(String[] args){ 12 WithInner wi = new withInner(); 13 InheritInner i1 = new InheritInner(wi); 14 } 15 }
在java中可以子类不需要什么特别的声明就可以覆盖父类的方法,但是如果要覆盖父类的内部类就必须指明覆盖的是谁。
代码块1和代码块2说明了这一点
class Egg{ private Yolk y; protected class Yolk{ public Yolk(){ System.out.println("Egg.Yolk"); } } public Egg(){ System.out.println("New Egg()"); y=new Yolk(); } }
public class BigEgg extends Egg{ public class Yolk { public Yolk() { System.out.println("BigEgg.Yolk()"); } } public static void main(String[] args) { // TODO Auto-generated method stub new BigEgg(); } }
代码块的输出是:New Egg(),Egg.Yolk()
如果要覆盖书上给出了下面的示例:
1 public class Egg2 { 2 protected class Yolk { 3 public Yolk() { 4 System.out.println("Egg2.Yolk()"); 5 } 6 7 public void f() { 8 System.out.println("Egg2.Yolk.f()"); 9 } 10 } 11 12 private Yolk y = new Yolk(); 13 14 public Egg2() { 15 System.out.println("new Egg2()"); 16 } 17 18 public void insertYolk(Yolk yy) { 19 y = yy; 20 } 21 22 public void g() { 23 y.f(); 24 } 25 }
1 public class BigEgg2 extends Egg2 { 2 3 public class Yolk extends Egg2.Yolk { 4 public Yolk() { 5 System.out.println("BigEgg2.Yolk()"); 6 } 7 8 public void f() { 9 System.out.println("BigEgg2.Yolk().f()"); 10 } 11 12 } 13 14 public BigEgg2() { 15 insertYolk(new Yolk()); 16 } 17 18 public static void main(String[] args) { 19 // TODO Auto-generated method stub 20 Egg2 e2 = new BigEgg2(); 21 e2.g(); 22 } 23 24 }
这样写就明确的覆盖了类,当实例化BigEgg2(),不仅调用父类的构造方法,子类的方法也调用了,e2.g(),输出的不再是父类的f(),而是子类的。
Think in java读书笔记之:java匿名内部类的继承和覆盖
标签:nbsp ted rate 输出 实例化 rgs 类的方法 div 一个
原文地址:http://www.cnblogs.com/lovefoolself/p/7359890.html