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

时间:2014-05-27 12:45:15

标签: java inheritance

我有两个子类:员工,学生 他们属于超级人物。

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


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. }

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

6 个答案:

答案 0 :(得分:8)

由于您的超级类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
}

答案 1 :(得分:1)

在您的子类的构造函数中添加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构造函数。只有在类中没有定义构造函数时,它才会添加默认的no-arg构造函数。

答案 2 :(得分:1)

试试这个:

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

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

答案 3 :(得分:1)

要构建Student的实例,您需要先执行必要的操作才能构建Person。只有一种方法可以构造Person - 两个arg构造函数。这意味着您必须更改Student,如:

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

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

答案 4 :(得分:0)

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

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

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

同样适用于员工

答案 5 :(得分:0)

对于构造函数没有param你应该有两个构造函数,比如

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

Student()
{
 //task.
}

}

也适用于其他类