繁体   English   中英

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

[英]java constructor in class cannot be applied to given types

我有 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不能应用于给定类型; 必需:java.lang.String,int;

我在网上查了一下,有两种方法可以解决这个问题:

  1. 在超类中添加一个默认值: Person()//without parameter

    在子类学生中:

Student()
  {
  Person astudent = new Student() //I guess.
  }
  1. 在子类中添加一个 super():
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
}

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

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

或者

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

工作人员也是如此

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

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

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

尝试这个:

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

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

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

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

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

对于没有参数的构造函数,您应该有两个构造函数,例如

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

Student()
{
 //task.
}

}

其他班级也一样

如果您想在不传递参数的情况下创建子类的对象(即 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;
   }
   
   // additional constructor without parameter
   Person(){
      // add your code here
   }
}

现在下面的代码将正常工作而不会出现任何错误。

Staff stf = new Staff();
Student std = new Student();

学生不应该扩展人。 bcoz,如果我们为student创建obj,会自动调用person的构造函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM