【问题标题】:java constructor in class cannot be applied to given types类中的java构造函数不能应用于给定类型
【发布时间】:2014-05-27 12:45:15
【问题描述】:

我有 2 个子类:职员、学生 它们属于超类 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 的初学者。 希望任何人都可以帮助我。非常感谢。

【问题讨论】:

  • 请求家庭作业帮助的问题必须包括您迄今为止为解决问题所做的工作的总结,以及您在解决问题时遇到的困难的描述。

标签: java inheritance


【解决方案1】:

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

【讨论】:

  • 对,但是为什么java编译器会这样呢?没有提供时创建空构造函数,为什么有参数时不创建?
【解决方案2】:

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

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

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

员工也是如此

【讨论】:

    【解决方案3】:

    在子类的构造函数中添加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.
    }
    

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

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          这样的构造函数
          public class Student {
          Student(String name , int dateOfBirth)
          {
           super(name,dateOfBirth)
          }
          
          Student()
          {
           //task.
          }
          
          }
          

          其他类也一样

          【讨论】:

            【解决方案7】:

            如果您想在不传递参数的情况下创建子类的对象(即 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();
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多