class Aa {
public Aa(String a,String b) {   }
}
public class Bb extends Aa {
    public Bb(String a,String b) {
     super(a,b);
    }
    public static void main(String args []) {
        Aa a = new Aa("Hi","Tom");
        Aa b = new Bb("Hi","Bart");
    }
}
如果去掉super(a,b);则会出现编译错误,提示未定义隐式超级构造函数 Aa()。必须显式调用另一个构造函数
此时要么加super(a,b),要么给Aa写无参构造函数。
我不理解!!!????

解决方案 »

  1.   

    因为Bb继承了Aa,那么在初始化Bb之前必须初始化Aa所以必须调用Aa的构造函数,如果你在Bb中不显式调用Aa的构造函数,
    而Java规范中是说明这样表示调用父类的无参数构造函数
    同时,Java还规定了如果一个类没有显式声明构造函数,则认为存在一个无参的构造函数所以这里你必须显式调用super(a,b)这个有参数的构造函数,或者在Aa中显式声明一个无参的构造函数上述都是Java中对没有显式声明的规范罢了。
      

  2.   

    看看thinking in java 之类的,一个类初始化的时候如果有父类他必需先初始化一个父类的实例,那在构造方法里必需显式调用父类的构造方法,或者隐式调用父类默认的构造方法(如果有的话)
      

  3.   

    此题中,在调用
        Aa b = new Bb("Hi","Bart");
     时,先调Aa的构造函数,初始化父类的一实例,再调Bb的构造函数(其中再调用一次Aa的构造函数)是吗?