首先咱们看看下面的代码: java
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()这条语句到子类构造器中。这样设计就使子类的实例化必须调用父类的构造函数,由于父类里面若是有私有的成员变量子类是没法察觉的,仍是须要用父类的构造器初始化父类的私有成员变量。 spa
这样的报错是由于,编译器在编译的时候,若是子类 的构造器没有显示的调用super(),编译器也会默认在子类构造器中插入super(),但此时父类并无无参构造器,因此上面的代码就报错了。解决方案有不少种:
1. 在父类中声明一个无参构造函数
2.之类的构造器中调用super(value)
3.去掉父类中的构造函数,这样编译器会自动的为父类加一个无参构造函数 设计
总之,子类的构造器必定会调用父类的构造器,无论是显示调用仍是隐式的调用,父类里面必定要定义相应的构造函数。 code