我在尝试为第二个类创建构造函数时收到该错误。我是否需要为第二类使用与第一类相同的参数?
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;}
}
答案 0 :(得分:0)
每个扩展类首先调用超级构造函数。在Person类中,您只定义了一个非默认构造函数,因此没有默认构造函数。
在Person
中提供默认构造函数(不带任何参数的构造函数)或使用super(name, gender, phone)
显式调用超级构造函数
答案 1 :(得分:0)
编译时,编译器会添加super()
作为childs构造函数的第一行,搜索父非arg构造函数。
由于你的父类已经有一个使用params,所以在编译时不会创建默认的没有arg构造函数。
两种解决方案:
添加super(string,string,int)
,为其提供正确的参数作为childs构造函数的第一行
创建一个不带参数的Person()
构造函数,以便super()
在编译时找到要调用的内容。
答案 2 :(得分:0)
如果一个类扩展了另一个类,它必须调用该扩展类的构造函数。
由于您为Person
指定了构造函数,因此需要在Student
和Lecturer
中将其作为第一个语句调用:
protected Student(String s, int sn, String n, String g, int p)
{
super(n, g, p);
subject = s;
sNumber = sn;
}
之前您可能没有看到此错误,因为编译器会自动添加super();
作为第一个语句。由于此构造函数不存在(您指定了自己的构造函数),因此无效。
如果你没有调用超类的构造函数,你就不会初始化它。