【问题标题】:how to access fields of derived class from another derived class in multilevel inheritance如何在多级继承中从另一个派生类访问派生类的字段
【发布时间】: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


【解决方案1】:

错误本身很容易解决,只需将 super() 调用放在构造函数的开头,就像错误信息告诉的那样:

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

但是,您的代码中有很多异味,我建议您检查一下:

  • 干净的代码:遵循命名约定,类名以大写字母开头,如 Sport 或 Result,不要让它们成为复数
  • 了解 OOP 的概念,继承不是为了扩展具有更多字段的类。继承是为了扩展类的功能,因此子级可以在父级可以使用的任何地方使用。
    如果您想在类中添加新字段,只需在其字段中添加一个新类,如下所示:
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
    }
}
  • 您还应该将不同的类定义放在不同的 .java 文件中,并研究可见性修饰符的使用

【讨论】:

    猜你喜欢
    • 2012-03-05
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2014-03-07
    相关资源
    最近更新 更多