You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java多层继承中派生类字段访问方法及构造方法报错处理

Java多层继承报错修复与疑问解答

编译报错原因与修复

你遇到的两个报错都来自sports类的构造函数写法错误:

  1. Java规范要求:子类构造函数中调用父类构造函数的super()语句,必须是构造函数的第一行有效代码
  2. 你先写了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:57:02