本帖最后由 woshilaojiang 于 2010-10-19 10:43:21 编辑

解决方案 »

  1.   

    当父类没有无参构造方法你就必须手动调用,否则jvm会默认调用父类无参的构造方法
      

  2.   

    当父类有带参数的构造函数时,子类就必须实现一个带参数的构造函数,在构造函数的第一行加入super()方法,
    里面放入构造时的参数,如父类不含有无参构造函数,则子类也不能有无参构造函数,如果父类有多个构造函数,那么子类只实现一个构造函数即可,可以不用全部都实现。
      

  3.   

    先理解一个对象的实例化过程即可。
    Child extend Parent在实例化Child的时候,会先去实例化Parent(嵌套的一层层上溯)。Child c = new Child();一瞬间做的事情:
    实例化是在构造函数中完成的,那么,调用Child的构造函数时候,必须先拿到Parent的对象也就是调用Parent的构造函数。回到你的题目,Parent没有默认构造函数,Child也只有一个带参构造函数。
    Child c = new Child(p);
    要实例化c必须先实例化Parent
    但是,Parent没有默认构造函数,只能用带参构造函数实例化它。
    但你的子类代码中没有显式去调用Parent的那个构造函数,Parent就无法完成初始化。何时子类必须显式调用父类构造函数:
    1 父类没有默认构造函数(这时候子类必须无条件显式写一个任意的构造函数包括默认构造函数,第一句就是super(...))2 父类有默认构造函数,但子类的构造函数不想jvm调用父类默认的那个构造函数, 就要用spuer(...)(如果父类还有其他构造函数)其他场景,都是可写可不写。但是一旦写了super(...),super的参数怎么给必须与父类的构造函数相符。
      

  4.   

    因为放父类没有构造函数时,JVM会默认父类有一个无参的构造函数,但是当父类有构造函数时,JVM不会再给父类默认的构造函数,所以初始化的时候要用 Super()显示调用