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&gt;=90&amp;&amp;s&lt;=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&gt;=80&amp;&amp;s&lt;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&gt;=70&amp;&amp;s&lt;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&gt;=55&amp;&amp;s&lt;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&gt;=40&amp;&amp;s&lt;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&lt;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() 初始化会报错) ,这样的话,子类继承该类,就必须要显示的调用父类的构造函数,这样才能保证,编译器在将子类初始化前,父类先被初始化。