类中的java构造函数不能应用于给定的类型

我有2个子类:Staff,Student他们属于超类Person。

这是我老师给出的代码(任务):


public class Person { private String name; private int yearOfBirth; /** * Create a person with given name and age. */ Person(String name, int yearOfBirth) { this.name = name; this.yearOfBirth = yearOfBirth; } } 

 class Student extends Person { private String SID; // student ID number /** * Create a student with no parameters. */ Student() { //task. } } 

 public class Staff extends Person { private String roomNumber; /** * Construct a staff member with field values and no pamaeters. */ public Staff() { //task } } 

我不知道我可以键入什么来创建没有参数的对象。 它总是出现如下错误:构造函数类Person中的Person不能应用于给定的类型; required:java.lang.String,int;

我在网上查了解有两种解决问题的方法:

  1. 在超类中添加一个默认值:Person()//不带参数。 在子类Student中:

    Student() { Person astudent = new Student() //I guess. }

  2. 在子类中添加一个super(): Student() { super("xxx")//I guess. } Student() { super("xxx")//I guess. }

我不知道该怎么办。 我是学习BlueJ的先驱。 希望有人能帮助我。 非常感谢你。

由于您的超类Person没有默认构造函数,因此在子类( StudentStaff )中,必须将超类构造函数作为第一个语句调用。

您应该像这样定义子类构造函数:

 Student() { super("a_string_value", an_int_value);// You have to pass String and int values to super class } 

 Staff() { super("a_string_value", an_int_value); // You have to pass String and int values to super class } 

尝试这个:

 Student(String name, int yearOfBirth) { super(name, yearOfBirth); // task... } 

原因:您的超类没有默认构造函数。 所以你必须在子类构造函数的第一个位置调用super()

要构建Student实例,您需要首先执行构造Person所需的操作。 只有一种方法来构造Person – two-arg构造函数。 这意味着您必须更改Student

 public Student() { super("someName", 1950); //first values came to my mind } 

虽然你应该知道,如果被视为PersonStudent行为应该与Person完全一样,即有年龄和姓名。 所以实际上我建议更改Student构造函数以包含名称和年龄。

添加super(NAME_IN_STRING_TYPE,YEAR_OF_BIRTH_IN_INT_TYPE); 作为你的子类的构造函数中的第一个语句

学生建设者

 Student() { super("name", 1970); // String,int arguments passed //task. } 

员工建设者

 Staff() { super("name", 1970); // String,int arguments passed //task. } 

这是必需的,因为基类中没有默认的no-arg构造函数。 您必须在基类中显式定义无参数构造函数,或者需要指示编译器调用基类的自定义构造函数。

注意:如果编译器具有用户定义的构造函数,则不会在类中添加默认的no-arg构造函数。 只有在类中没有定义构造函数时,它才会添加默认的no-arg构造函数。

构造函数要做的第一件事就是调用超类的构造函数(带有相同的参数)。 Person没有无参数构造函数,因此,您必须使用以下两种方法之一更改代码:

 Student(String name, int yearOfBirth) { //task. } 

要么

 Student() { super("", 0); //task. } 

工作人员也一样

对于构造函数没有参数,你应该有两个构造函数

 public class Student { Student(String name , int dateOfBirth) { super(name,dateOfBirth) } Student() { //task. } } 

其他class级也一样