Java多层继承中派生类字段访问方法及构造方法报错处理
Java多层继承报错修复与疑问解答
编译报错原因与修复
你遇到的两个报错都来自sports类的构造函数写法错误:
- Java规范要求:子类构造函数中调用父类构造函数的
super()语句,必须是构造函数的第一行有效代码 - 你先写了
pts = points赋值语句,此时Java会默认在构造函数第一行插入无参的super()调用,但你的Student类只定义了带int,String参数的构造函数,没有无参构造,所以触发第一个参数不匹配的报错;第二个报错则是显式检测到super()没有写在第一行。
修复方法很简单,调换sports构造函数里两行代码的顺序即可:
class sports extends Student{ public int pts; sports(int rno, String name, int points){//line 16 super(rno,name); // 移到第一行 pts = points; } }
另外你代码里还藏了一个数组越界隐患:results类里定义int [] mark = new int[2];数组长度为2,但display方法循环访问了mark[0]、mark[1]、mark[2]三个元素,会触发数组越界。因为你构造函数里会把传入的marks数组赋值给this.mark,所以这行冗余初始化可以直接删掉,或者修改为你需要的长度。
疑问解答
你的初始理解完全正确:results的直接父类是sports,不是Student。能在results里访问Student类的rno、stud_name变量,核心原因是Java的继承具有传递性,遵循以下规则:
- 父类的
public、protected修饰的成员变量和方法,会被所有层级的子类继承(同包下缺省修饰的成员也可以被子类访问) sports作为Student的子类,已经继承了rno、stud_name两个public属性;results作为sports的子类,自然也继承了这两个属性,所以可以直接访问- 你在
results里写的super.stud_name,首先会去直接父类sports里找stud_name,找不到就会自动往上遍历父类链到Student找到对应属性,不需要你手动跳层级
如果要在results类中访问sports类的变量,直接用你代码里已经写的super.pts即可,pts是sports类定义的public属性,直接就能拿到。
修复后完整可运行代码
import java.util.Scanner; class Student{ public int rno; public 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){ super(rno,name); pts = points; } } class results extends sports{ public int [] mark; // 去掉冗余的初始化,用构造函数传入的数组 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[3]; // 刚好存3门成绩,避免空间浪费 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(); s.close(); } }
内容的提问来源于stack exchange,提问作者AxXxelWolf
相关产品推荐
相关产品推荐

