/**
 * 创建日期 2006-3-28     
 * Written by Terry Yip
 * TODO 
 * 
 **/
package a;/**
 * @author Terry Yip , Date:2006-3-28
 * 
 * TODO
 *  
 */
class Car
{
    Car()
    {
        System.out.println("Car is  running!");
    }    Car(int age)
    {
        System.out.println("In Car age = " + age);
    }    class Wheel
    {
        Wheel()
        {
            System.out.println("Wheel is running!");
            System.out.println("Wheel is running!2");
        }        Wheel(int age)
        {
            System.out.println("In Wheel age = " + age);
        }
    }
}class PlaneWheel extends Car.Wheel
{
    PlaneWheel(Car car)
    {
        car.super(5);/*这句不明白啊*/
    }    public static void main(String[] args)
    {
        Car car = new Car();
        PlaneWheel pw = new PlaneWheel(car);
    }
}
程序运行的结果是:Car is  running!
In Wheel age = 5
为什么car.super(5);这句,调用的是wheel中的构造函数呢?从语法上看,car.super调用的应该是car的超类的构造函数啊

解决方案 »

  1.   

    class PlaneWheel extends Car.Wheel//继承的是内部类Wheel.
      

  2.   

    引用:父类不是外部类.因为你的继承的特殊,继承了一个Nested class, 你可以把Nested class看做一个成员类.成员类是需要有外部类的偏移的, 或这样理解:所有类都在同一起点, 而Nested class是有偏移的, 所以, 在访问Nested class的时候要把偏移加上, 如果你直接调用super(),这样 编译器就回认为直接调用无偏移的父类,可是Nested class是有偏移的, 所以,需要加个偏移在前面.至于内存的分配状况[1]参见inside JVM [2]JSR203 
      

  3.   

    TOyuzl32(Hello!有酒醉):谢谢你这么有水准的回复,但我还是不明白,我理解你的回答是基于 class PlaneWheel extends Car.Wheel{}这句的,但这句car.super(5);是调用car的超类的构造函数,你怎么解释这一句呢?
      

  4.   

    car.super(5)调用的不是Car的超类的构造函数,应该是Wheel的构造函数(原因如上)
    由于你继承的是内部类,所以你必须要用外部实例来初始化它.
    你可以把它当作特定的语法使用就好啦.
      

  5.   

    TOyuzl32(Hello!有酒醉)的意思是car.super(5);调用的是PlaneWheel类的父类Car.Wheel。
    因为Nested class是有偏移的,在访问Nested class的时候要把偏移加上, 如果你直接调用super(),这样 编译器就回认为直接调用无偏移的父类,可是Nested class是有偏移的, 所以,需要加个偏移在前面.
      

  6.   

    因为PlaneWheel 的父类是Car.Wheel而不是Car  所以car.super(5);调用的是Wheel的构造器  而不是Car的构造器
      

  7.   

    第一次见到内部类不是private的,长见识了,谢谢各位!
      

  8.   

    那用对象car怎么调用car的构造函数啊?
      

  9.   

    yuzl32(Hello!有酒醉)
    引用:父类不是外部类.因为你的继承的特殊,继承了一个Nested class, 你可以把Nested class看做一个成员类.成员类是需要有外部类的偏移的, 或这样理解:所有类都在同一起点, 而Nested class是有偏移的, 所以, 在访问Nested class的时候要把偏移加上, 如果你直接调用super(),这样 编译器就回认为直接调用无偏移的父类,可是Nested class是有偏移的, 所以,需要加个偏移在前面.至于内存的分配状况[1]参见inside JVM [2]JSR203 =============================================================================请问这段话从哪里能找到呢?
      

  10.   

    car作为作为修饰作用,要看super! (这个super依赖Car的一个实例)