有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java erroractual和formal参数列表的长度不同

我已经编写了以下Java程序。但是我不断得到一个错误,说我的构造函数的实际参数和形式参数长度不同。我不明白问题是什么。有人能告诉我我的程序出了什么问题以及我如何调试它吗

class Student 
{
 String name;
 Student(String name)
 {
  System.out.println("\nThe name of the student is:"+name);
 }
}
class Exam extends Student 
{
 int m1, m2;
 Exam(int m1, int m2)
 {
  System.out.println("\nThe marks obtained in first subject is:"+m1);
  System.out.println("\nThe marks obtained in second subject is:"+m2);
 }
}
class Result extends Exam 
{
 int totalmarks;
 int compute(int m1, int m2)
 {
  totalmarks=m1+m2;
  return(totalmarks);
 }
}
public class StudentTest 
{
 public static void main(String[] args)
 {
  Student s = new Student("rose");
  Exam e = new Exam(20,20);
  Result r = new Result();
  System.out.println("\nThe total marks obtained is:"+r.compute(20,20));
 }
}

共 (3) 个答案

  1. # 1 楼答案

    在学生和考试中定义非参数化构造函数

    在学生课堂上:

    Student(){
        //Give your implementation
    }
    

    在考试课上:

    Exam(){
        //Give your implementation
    }
    
  2. # 2 楼答案

    要解决问题,应删除不必要的继承:

    // remove extends Student
    class Exam {
        // class code here
    } 
    
    // remove extends Exam
    class Result {
        // class code here
    }
    

    考虑到您的类,我不认为有理由Exam扩展StudentResult扩展Exam

    extends看作是一种“是一种”关系。如果可以说Exam是一个{},并且Result是一个{},那么应该扩展。在这种情况下,这毫无意义

    当一个类扩展了另一个类,并且调用了子类构造函数时,它需要做的第一件事就是调用超类构造函数。如果您自己不调用它,它将被隐式调用。问题是它试图调用默认构造函数,但只有在您不创建自己的构造函数时,才会创建默认构造函数

    所以当你这样做的时候:

    new Exam(20, 20)
    

    它确实:

    Exam(int m1, int m2) {
        super(); // implicit call to Student default constructor
        System.out.println("\nThe marks obtained in first subject is:"+m1);
        System.out.println("\nThe marks obtained in second subject is:"+m2);
    }
    

    它正在尝试调用默认的无参数Student()构造函数。但是由于您创建了Student(String name),默认值不存在。这就是为什么你会出错

  3. # 3 楼答案

    你的问题是你的等级制度。构造函数执行期间的第一步是运行父类的默认构造函数

    考试扩展了Student,但Student没有默认构造函数。加一个

    更好的是,重新思考你的逻辑。延长学生考试时间毫无意义。 考试由学生参加。你是说考试就是学生