这个例子:
class Car
{
class Wheel
{
}
}class Planewheel extends car.Wheel
{
Planewheel(Car car)
{
car.super(); //建立从内部类对象到外部类对象的引用关系,这里问什么是super?
}
public static void main(String[] args)
{
Car car=new Car();
Planewheel pw=new Planewheel(car);
}
}内部类和外部类之间难道不是外部类为super么?

解决方案 »

  1.   

    Planewheel(Car car)
    {
    car.super(); //建立从内部类对象到外部类对象的引用关系,这里问什么是super?
    }不需要这样写的
    只需要
    Planewheel() {
      super();//参数的构造函数可以不写
    }
    调用者只需要Planewheel pw=new Planewheel();不需要创建父类的。
      

  2.   

    class Car
    {
        class Wheel
       {
        } 
    }class Planewheel extends car.Wheel 
    {
          Planewheel( )
          { 
              super( ); 
           }
       public static void main(String[] args)
      {
        Car car=new Car();
        Planewheel pw=new Planewheel( );
      }
    }楼上这样是正解吗。
          Planewheel( )
          { 
              super( ); 
           }
    此时构建Wheel对象时跳过了外部类Car了啊。
      

  3.   

    Planewheel(Car car)
    {
    car.super(); //建立从内部类对象到外部类对象的引用关系
    }这个运行是绝对没问题的。只是super让人费解。
    我看过别人的解释:
    由于内部类构建器必须同封装类对象的一个句柄联系到一起,所以从一个内部类继承,需要创建一个构建器的时候,默认对象已经没有意义,不能只是传递封装对象的一个句柄。必须在构建器中采用下述语法: 
    enclosingClassHandle.super(); 
    它提供了必要的句柄,以便程序正确编译。 
    内部类中隐藏一个outer指针$this,指向外围类的对象。 
    用java反射分析类结构时,wheel会被解析成car$wheel
    this是一个对象指针,可以指向一个对象。但super与this不同,只是告诉编辑器调用父类方法或构造器,并不是一个指针。可以用this给一个对象附值,可以return this,但绝对不能用super给对象附值或return super。 
    car.super(),可以分两步理解。car提供一个句柄,用于通过外围类找到内部类,super,提示调用父类构造器。 
    另外,java中点运算符“.”的功能有两个:一是引用类中成员,二是指示包的层次等级。 
    这里应该表示的是层次等级。
      

  4.   

     <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); 


    一摸一样的1、子类的构造函数先必须调用父类的构造函数 
    2、而内部类特殊性在于其构造函数要一个外部类的实例才能调用 
    这两个合起来就是wi.super(); 
    只能这么理解了。
    由于原因1,super被编译器理解为Planewheel的super。
    由于原因2,super必须被wi调用。另car.super( ); //等同于car.new car.Wheel();-----------------------------------------
    o(︶︿︶)o 唉