隐式超级构造函数Person()未定义。必须显式调用另一个构造函数

时间:2015-10-25 21:49:08

标签: java class object

我在尝试为第二个类创建构造函数时收到该错误。我是否需要为第二类使用与第一类相同的参数?

class Person {
    private String name;
    private String gender;
    private int phone;

    protected Person(String n, String g, int p)
            {name = n; gender = g; phone = p;} 
    public String toString(){return name +" "+gender+" "+phone;}
}


class Student extends Person { 
      private String subject;
      private int sNumber; 
      protected Student(String s, int sn){subject = s; sNumber = sn;} 
}


class Lecturer extends Person { 
  private String Department;
  private int staffNo;
  public Lecturer(String d, int stfNo){Department = d; staffNo = stfNo;}   
}   

3 个答案:

答案 0 :(得分:0)

每个扩展类首先调用超级构造函数。在Person类中,您只定义了一个非默认构造函数,因此没有默认构造函数。

Person中提供默认构造函数(不带任何参数的构造函数)或使用super(name, gender, phone)显式调用超级构造函数

答案 1 :(得分:0)

编译时,编译器会添加super()作为childs构造函数的第一行,搜索父非arg构造函数。

由于你的父类已经有一个使用params,所以在编译时不会创建默认的没有arg构造函数。

两种解决方案:

  1. 添加super(string,string,int),为其提供正确的参数作为childs构造函数的第一行

  2. 创建一个不带参数的Person()构造函数,以便super()在编译时找到要调用的内容。

答案 2 :(得分:0)

如果一个类扩展了另一个类,它必须调用该扩展类的构造函数。

由于您为Person指定了构造函数,因此需要在StudentLecturer中将其作为第一个语句调用:

protected Student(String s, int sn, String n, String g, int p)
{
    super(n, g, p);
    subject = s;
    sNumber = sn;
}

之前您可能没有看到此错误,因为编译器会自动添加super();作为第一个语句。由于此构造函数不存在(您指定了自己的构造函数),因此无效。

如果你没有调用超类的构造函数,你就不会初始化它。