我在thinking in java 里看到了有这样个例子:
class WithInner{
class Inner{
}
}class InheritInner extends WithInner.Inner{
public InheritInner(WithInner wi){
wi.super();
}
public static void main(String[] args){
WithInner wi=new WithInner();
InheritInner ii=new InheritInner(wi);
}
}
于是自己仿照写了如下的程序:
class Outer{
private String name;
private Inner in;
public Outer(){
name="Outer";
in=new Inner("Inner");
System.out.print("It's name is ");
System.out.println(name);

public class Inner{
  private String name;
  public Inner(String name){
   this.name=name;
   System.out.print("My name is ");
   System.out.println(name);
   System.out.print("My SuzhuClass's name is ");
   System.out.println(Outer.this.name);
  }
}
public void display(){
System.out.println(name);
}

}class ExtendsInner extends Outer.Inner{

public ExtendsInner(Outer ot){
ot.super();

System.out.println("It is in ExtendsInner");
}
public static void main(String[] args){
Outer ot=new Outer();


ExtendsInner ei=new ExtendsInner(ot);
}
}
编译时提示在 ot.super 一句找不到符号。百思不得其解,请求各位火力支援!

解决方案 »

  1.   

    ExtendsInner 继承了Outer.Inner
    所以它的构造函数首先要蕴含Outer.Inner的构造函数
    你的Outer.Inner没有无参的构造函数,所以你的ExtendsInner的构造函数中必须写明怎么调用父类的构造函数的。
      

  2.   

    ot.super("wantingfreedom (自由风)");
      

  3.   

    public Inner(String name)这是你的内部类的一个构造器,不是默认的没有参数的。正因为这个你的默认的没有参数的构造器public Inner()就不会自动创建了,因此ot.super()就不能调用默认的构造器。当你自己创建一个构造器时,默认的构造器是不是自动创建的,这时,如果你还需要用这个没有参数的构造器就需要显示的创建。
      

  4.   

    ot.super();调用的是默认无参构造函数
      

  5.   

    我是一个Java新手,针对这个例子,我还想问一句,这里的   ot.super(); 倒底调用的是哪个构造器啊,按照上面老兄的说法,好象是Inner类的,但是 ot 按理说应该是Outer的一个对象啊?那么我感觉 ot.super();是调用了Object的构造器了,但这样一来就更想不通了,还请各位前辈不吝赐教~~~小弟先行谢过!
      

  6.   

    内部类是依赖于外部类的,所以在构造内部类需要传递一个外部类的对象的引用;
    super是调用父类的构造函数,但是由于要调用内部类的构造函数,必须和一个外部类的对象引用相关联,所以需要ot.super("wantingfreedom (自由风)");这种形式