class Outer{
  private int a;
  public Outer(int a)
  {
  this.a=a;
  System.out.println("g");
  }  class Inner{
    public Inner(){}
    public void print(){System.out.println("a="+a);}  //访问外部类的实例变量a
  }
}public class Sample extends Outer.Inner{
  //public Sample(){} //编译错误  public Sample(Outer o){
    o.super();
  }  public static void main(String args[]){
     Outer outer1=new Outer(1);
     Outer outer2=new Outer(2);     Outer.Inner in=outer1.new Inner();
     in.print();     Sample s1=new Sample(outer1);
     Sample s2=new Sample(outer2);
     s1.print();  //打印a=1
     s2.print();  //打印a=2
  }
}问题 Sample构造函数中o.super()是在做什么。为什么能这么做。

解决方案 »

  1.   

    因为Sample继承的是内部内Inner。
    子类的构造函数会先调用父类的构造函数,但由于你继承的是内部内,只有先调用了Outer的构造函数后,才能够调用Inner的构造函数。
    故public Sample(){}会出现编译错误。必须先显性调用Outer的构造函数后才能够正常调用Inner的构造函数。
      

  2.   

    以上说法都不正确,总结完毕。
    你为什么要研究这个恶心的问题?你只要清楚super()就是调用父类的构造方法就可以了。
      

  3.   

    构造子类的时候,首先要先调用父类的构造方法,即创建父类。(子类中 super 指向此时创建的父类)而你继承了内部类,而非静态内部类的构造,必须依赖外部类,所以要先有外部类才可以。所以。。
      

  4.   

    你只要清楚super()就是调用父类的构造方法就可以了。