- java中每个类必须有一个构造函数,如果没有显示的声明构造函数,那么编译器会自动加一个无参的构造函数。当显示定义了带参数的构造函数之后,而没有显示的定义无参构造函数,那么这个类就没有无参构造函数了。
- 子类继承父类,必须在子类的构造函数中调用父类的构造函数,如果子类的构造函数中,没有显示的调用父类的构造函数,那么会自动调用父类的无参数构造函数,如果父类没有无参数构造函数,那么子类中必须显示的调用父类的构造函数(使用super关键字即可),而且必须是在构造方法的第一个语句 中进行调用。
PS:现在说说你的代码的问题,父类Animal没有显示的定义无参构造函数,所以只有有参构造函数,子类必须调用父类的构造方法(即父类的有参构造方法),用来初始化父类。(子类在执行过程中,先执行父类,所以必须初始化父类的构造器,避免出现错误)。
//父类AnimalpublicclassAnimal{ privateStringcolor; privateStringsize; //只定义了有参构造函数,未显示定义无参构造函数 publicAnimal(Stringcolor,Stringsize){ this.color=color; this.size=size; }}//子类Dog继承父类AnimalclassDogextendsAnimal(){//子类继承父类,需要调用父类的构造方法,使用super关键字即可publicDog(Stringcolor,Stringsize,Stringtest){ super(color,size);//必须放在第一个构造函数第一行 }}下面是你想达到的效果:
publicclassAnimal{ privateStringcolor; privateStringsize; //显示定义无参构造函数 publicAnimal(){} publicAnimal(Stringcolor,Stringsize){ this.color=color; this.size=size; }}classCatextendsAnimal{ publicCat(Stringcolor,Stringsize,Stringtest){ super();//其实也是调用了父类的无参构造方法,编译器默认调用而已,也可以不写该super() }} |