Java写继承子类的时候报错There is no default constructor available in ‘子类名’
最近因为工作需要,不得不开始学习Java,跟着教程学习过程中也遇到了不少的问题,在这里总结记录一下。
我写了一个父类,在写继承子类的时候出现的报错,父类代码如下:
public class Person {
private String name;
private int age;
/*
public void setName(String name){
this.name = name;
}
public void setAge(int age){
this.age=age;
}
*/
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
}
在写继承的子类的时候(如下),就报了标题的错误
class Student extends Person{
private double scroe;
public double getScore(){
return this.scroe;
}
public void setScore(double score){
this.scroe=score;
}
}
Google了一番发现原来是父类当中构造方法存在参数,而在子类当中,默认的构造方法是没有参数的。可能许多人猛地一看,这有什么问题吗?首先需要了解以下知识
- 当写一个类的时候如果不写一个构造方法,那么编译器就会默认创建一个无参数的构造方法
- 当你写了一个有参数的构造方法时,默认创建的那个构造方法就会被废弃,如果仍想要使用,需要显示的写出来才行
- 在通过new实例化子类的时候,在子类的构造方法中会先调用父类的构造方法,如果子类没写,那么就会默认用super()自动调用父类的构造方法;而如果像现在这样,父类的构造方法有参数,而子类默认调用的父类无参数的构造方法,而无参数的构造方法因为没有显示表达,被废弃。那么在初始化的时候父类的构造方法就初始化不成功。
所以在子类中,至少有一个和父类中一致的构造方法,才能够正常的初始化。像下边这样,在子类的构造方法中显示的调用父类的构造方法即可解决这个问题。
public Student(String name, int age){
super(name, age);
}