如何在多级继承中从另一个派生 class 访问派生 class 的字段

how to access fields of derived class from another derived class in multilevel inheritance

我想通过这个程序来理解多级继承

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: error: constructor Student in class Student cannot be applied to given types; sports(int rno, String name, int points){ ^ required: int,String found: no arguments reason: actual and formal argument lists differ in length Main.java:18: error: call to super must be first statement in constructor super(rno,name); ^ 2 errors

当我试图解决这个错误时,我遇到了新的疑问

1) 如果 super 关键字引用立即数 parent class 对,那么我如何访问变量 rnostud_name from results class(results class's immediate parent is 运动 class 不是 学生 class)。如果我理解错了 结果 class's immediate parent is student class 那怎么办我从 results class.

访问 sports class 中的变量

请帮我解决这个错误,我尝试在网上搜索解决方案和示例,但我只找到带有 1 child class.

的程序

错误本身很容易解决,只需将 super() 调用放在构造函数的开头即可,如错误消息所示:

    sports(int rno, String name, int points){
        super(rno,name);
        pts = points;
    }

但是,您的代码中有很多东西很臭,我建议您检查一下:

  • 整洁的代码:遵循命名约定,class 名称以大写字母开头,例如 Sport 或 Result,不要让它们成为复数形式
  • 了解 OOP 的概念,继承不是为了扩展 class 具有更多字段。继承是为了扩展 class' 功能,因此子项可以在父项可以使用的任何地方使用。
    如果您想在 class 中添加新字段,只需在其字段中添加一个新的 class,如下所示:
class results {  // no need for inheritance
    ...
    Sports sports;

    results(int rno, String name, int marks[], int points) {
        sports = new Sports(rno, name, points);  // initialize the field
        this.mark = marks;

    }

    void display() {
        ...
        System.out.println("Student Name: " + sports.stud_name);  // you reach it's fields like this
    }
}
  • 您还应该将不同的 class 定义放在不同的 .java 文件中,并研究可见性修饰符的使用