内部类可以被覆盖吗

来源:互联网 发布:舜德数据怎么样 编辑:程序博客网 时间:2024/05/17 04:55
package lu.innerclasses;
import static lu.utils.Print.*;
/*
 * 默认的构造器是编译自动生成的,这里调用基类的默认构造器。
 * 当继承了某个外围类的时候,内部类并没有发生什么神奇变化。这两个内部类是完全独立的两个实体。*/
class Egg{
private Yolk y;
protected class Yolk{
public Yolk(){print("Egg.Yolk");}    
}
public Egg(){
print("New Egg()");
y=new Yolk();
}
}
public class BigEgg extends Egg{
   public class Yolk{
  public Yolk(){print("BigEgg.Yolk()");}
   }
   public static void main(String[] args){
  new BigEgg();
   }

}


Output:

New Egg()
Egg.Yolk

明确继承某个内部类也是可以的

package lu.innerclasses;
import static lu.utils.Print.*;
/*
 * BigEgg2.Yolk通过extends Egg2.Yolk明确地继承了此内部类,并且覆盖了其中的方法。
 * insertYolk()方法允许BigEgg2将自己的Yolk对象向上转型为Egg2中的引用y。所以当g()调用y.f()时,
 * 覆盖后的新版的f()被执行。第二次调用Egg2.Yolk(),结果是BigEgg2.Yolk的构造器调用了基类的构造器。
 * 可以看到在调用g()的时候,新版的f()被调用了。*/
 class Egg2 {
  protected class Yolk{
 public Yolk(){print("Egg2.Yolk()");}
 public void f(){print("Egg2.Yolk.f()");}
  }
  private Yolk y=new Yolk();
  public Egg2(){print("New Egg2()");}
  public void insertYolk(Yolk yy){y=yy;}
  public void g(){y.f();}
}
 public class BigEgg2 extends Egg2{
public class Yolk extends Egg2.Yolk{
public Yolk(){print("BigEgg2.Yolk()");}
public void f(){print("BigEgg2.Yolk.f()");}
}
public BigEgg2(){insertYolk(new Yolk());}
public static void main(String[] args){
Egg2 e2=new BigEgg2();
e2.g();
}
 }
outPut
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()

0 0