1. 子类实例化也调用父类的构造函数
首先我们看看下面的代码:
class Super {
String s;
public Super(){
System.out.println("Super");
}
}
class Sub extends Super {
public Sub(){
System.out.println("Sub");
}
public static void main(String[] args){
Sub s = new Sub();
}
}
Super
Sub
在上面的代码中,其实子类并没有调用Super()这个方法,但是子类实例化的时候还是调用了父类的构造函数。这是因为,如果子类的构造器没有显示的调用super()这个方法,编译器会自动插入super()这条语句到子类构造器中。这样设计就使子类的实例化必须调用父类的构造函数,因为父类里面如果有私有的成员变量子类是无法察觉的,还是需要用父类的构造器初始化父类的私有成员变量。
2. 编译报错:父类构造器没有定义
这样的报错是因为,编译器在编译的时候,如果子类 的构造器没有显示的调用super(),编译器也会默认在子类构造器中插入super(),但此时父类并没有无参构造器,所以上面的代码就报错了。解决方案有很多种:
1. 在父类中声明一个无参构造函数
2.之类的构造器中调用super(value)
3.去掉父类中的构造函数,这样编译器会自动的为父类加一个无参构造函数
3. 总结
总之,子类的构造器一定会调用父类的构造器,不管是显示调用还是隐式的调用,父类里面一定要定义相应的构造函数。