【发布时间】:2021-09-07 17:18:29
【问题描述】:
我试图通过这个程序理解多级继承
import java.util.Scanner;
class Student{
public
int rno;
String stud_name;
Student(int r, String name){
rno = r;
stud_name = name;
}
}
class sports extends Student{
public
int pts;
sports(int rno, String name, int points){//line 16
pts = points;
super(rno,name); //line 18
}
}
class results extends sports{
public
int [] mark = new int[2];
int sum =0;
results(int rno, String name, int marks[], int points){
super(rno,name,points);
this.mark = marks;
}
void display(){
for(int i = 0; i<3; i++){
sum += mark[i];
}
System.out.println("Student Name: "+super.stud_name);
System.out.println("Student Roll no"+super.rno);
System.out.println("Sports points: "+super.pts);
System.out.println("Total marks: "+sum);
}
}
class Main{
public static void main(String args[]){
Scanner s = new Scanner(System.in);
int rollno;
int points;
String name;
int[] marks = new int[5];
System.out.println("Enter Student name");
name = s.nextLine();
System.out.println("Enter Student roll no");
rollno = s.nextInt();
for(int i = 0; i<3; i++){
System.out.println("Enter the"+i+"th mark");
marks[i] = s.nextInt();
}
System.out.println("Enter Sports pts");
points = s.nextInt();
results stud = new results(rollno, name, marks, points);
stud.display();
}
}
但我收到了这些错误
Main.java:16:错误:Student 类中的构造函数 Student 不能应用于给定类型; 运动(int rno,字符串名称,int 点){ ^ 必需:整数,字符串 发现:没有参数 原因:实际参数列表和形式参数列表的长度不同 Main.java:18:错误:对 super 的调用必须是构造函数中的第一条语句 超级(rno,名称); ^ 2 个错误
当我试图解决这个错误时,我得到了一个新的疑问
1)如果 super 关键字指的是直接父类,那么我如何能够从 results class(results 班级的直接父级是体育班不是学生班)。如果我理解错误并且 results 类的 直接父级是 student class 那么我如何从 results 类访问 sports 类 中的变量.
请帮我解决这个错误,我已经尝试在网上搜索解决方案和示例,但我只找到具有 1 个子类的程序。
【问题讨论】:
-
只需交换行的顺序,以便首先调用
super。 -
首先,你需要将 super() 移动到构造函数定义之后的第一行。
-
我也没有看到
public使用正确。包定义在哪里?构造函数可能不可见,因为它没有被声明为公共的(它们都不是)。 -
最主要的是
super用来调用一个ctor必须是构造函数的第一行。这是语言要求的。我猜另一个错误是由于第一个错误导致构造函数“坏”,因此当您尝试调用它时无法使用。 -
System.out.println("Student Name: "+super.stud_name);应该只使用this.stud_name。这些字段是可访问的,因为它们是继承的。这同样适用于以下两行。
标签: java oop inheritance super