什么时候需要显式定义无参构造函数?首先要明白java中构造函数调用的规则
子类中的构造函数中第一条语句一定是调用父类的构造函数,如果没有显式调用,即通过super关键字调用父类的构造函数,编译器会在第一行插入super();,这时会调用父类的无参构造函数,当父类中没有显式声明构造函数时会自动生成一个默认构造函数。如果父类显式定义了构造函数,那么不会再自动生成默认构造函数,这时如果在父类中没有显式定义无参构造函数,并且子类中没有通过显式super(...)来调用父类的构造函数,编译时会报找不到父类无参构造函数的错误。