Java 子类有参构造器报错
Java 子类的有参构造器报错:Implicit super constructor Person() is undefined. Must explicitly invoke another constructor
import java.util.*;class Person {
protected String firstName;
protected String lastName;
protected int idNumber;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Constructor</span> Person(String firstName, String lastName, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> identification){ </span><span style="color: rgba(0, 0, 255, 1)">this</span>.firstName =<span style="color: rgba(0, 0, 0, 1)"> firstName; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.lastName =<span style="color: rgba(0, 0, 0, 1)"> lastName; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.idNumber =<span style="color: rgba(0, 0, 0, 1)"> identification; } </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Print person data</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> printPerson(){ System.out.println( </span>"Name: " + lastName + ", " +<span style="color: rgba(0, 0, 0, 1)"> firstName </span>+ "\nID: " +<span style="color: rgba(0, 0, 0, 1)"> idNumber); }
}
class Student extends Person{
private int[] testScores;</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> * Class Constructor * * @param firstName - A string denoting the Person's first name. * @param lastName - A string denoting the Person's last name. * @param id - An integer denoting the Person's ID number. * @param scores - An array of integers denoting the Person's test scores. </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Write your constructor here</span> Student(String firstName, String lastName, <span style="color: rgba(0, 0, 255, 1)">int</span> id, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">[] scores){<br><br> <strong><span style="color: rgba(255, 0, 0, 1)">super(); //隐藏会执行的默认构造器 </span></strong></span><strong><span style="color: rgba(255, 0, 0, 1)">super(firstName, lastName, id); //因为少了父类自定义构造器初始化,所以会报错 </span></strong><span style="color: rgba(0, 0, 255, 1)">this</span>.firstName =<span style="color: rgba(0, 0, 0, 1)"> firstName; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.lastName =<span style="color: rgba(0, 0, 0, 1)"> lastName; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.idNumber =<span style="color: rgba(0, 0, 0, 1)"> id; </span><span style="color: rgba(0, 0, 255, 1)">this</span>.testScores =<span style="color: rgba(0, 0, 0, 1)"> scores; } </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> * Method Name: calculate * @return A character denoting the grade. </span><span style="color: rgba(0, 128, 0, 1)">*/</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Write your method here</span> <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">char</span><span style="color: rgba(0, 0, 0, 1)"> calculate(){ </span><span style="color: rgba(0, 0, 255, 1)">int</span> num =<span style="color: rgba(0, 0, 0, 1)"> testScores.length; </span><span style="color: rgba(0, 0, 255, 1)">int</span> s = 0<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> score : testScores) { s </span>= s +<span style="color: rgba(0, 0, 0, 1)"> score; } s </span>= s/<span style="color: rgba(0, 0, 0, 1)">num; </span><span style="color: rgba(0, 0, 255, 1)">char</span> grade = '-'<span style="color: rgba(0, 0, 0, 1)">; </span><span style="color: rgba(0, 0, 255, 1)">if</span>(s>=90&&s<=100<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'O'<span style="color: rgba(0, 0, 0, 1)">; }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(s>=80&&s<90<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'E'<span style="color: rgba(0, 0, 0, 1)">; }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(s>=70&&s<80<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'A'<span style="color: rgba(0, 0, 0, 1)">; }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(s>=55&&s<70<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'P'<span style="color: rgba(0, 0, 0, 1)">; }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(s>=40&&s<55<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'D'<span style="color: rgba(0, 0, 0, 1)">; }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span>(s<40<span style="color: rgba(0, 0, 0, 1)">){ grade </span>= 'T'<span style="color: rgba(0, 0, 0, 1)">; } </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> grade; }
}
class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String firstName = scan.next();
String lastName = scan.next();
int id = scan.nextInt();
int numScores = scan.nextInt();
int[] testScores = new int[numScores];
for(int i = 0; i < numScores; i++){
testScores[i] = scan.nextInt();
}
scan.close();Student s </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Student(firstName, lastName, id, testScores); s.printPerson(); System.out.println(</span>"Grade: " +<span style="color: rgba(0, 0, 0, 1)"> s.calculate()); }
}
原因:父类的构造方法Person()只有有参数的构造方法,也可以说 父类没有无参的构造方法 (即默认的 super() 初始化会报错) ,这样的话,子类继承该类,就必须要显示的调用父类的构造函数,这样才能保证,编译器在将子类初始化前,父类先被初始化。