我是Java的新手,我正在设法继承。
错误是no suitable constructor found for ClassUser(no arguments)
出现在public ClassAdmin(String data)
上,但我没有找到对我有帮助的解决方案。
这是我的ClassUser
的摘要:
public class ClassUser {
public String id;
public String password;
public String name;
public String address;
public String contact;
public String role;
public ClassUser(String id, String password, String name, String address, String contact, String role){
this.id = id;
this.password = password;
this.name = name;
this.address = address;
this.contact = contact;
this.role = role;
}
public ClassUser(String data){
String[] dataArray = data.split(",");
this.id = dataArray[0];
this.password = dataArray[1];
this.name = dataArray[2];
this.address = dataArray[3];
this.contact = dataArray[4];
this.role = dataArray[5];
}
这是我的ClassAdmin
的摘要:
public class ClassAdmin extends ClassUser{
public String email;
public ClassAdmin(String id, String password, String name, String contact,
String email)
{
super(id+password+name+contact);
this.email = email;
}
public ClassAdmin(String data){ //problem
String[] dataArray = data.split(",");
this.id = dataArray[0];
this.password = dataArray[1];
this.name = dataArray[2];
this.contact = dataArray[3];
this.email = dataArray[4];
}
答案 0 :(得分:1)
您需要将晚饭构造函数调用为:
public class ClassAdmin extends ClassUser {
public String email;
public ClassAdmin(String id, String password, String name, String contact,
String email) {
super(id + password + name + contact);
this.email = email;
}
public ClassAdmin(String data) { //problem
super(data);
String[] dataArray = data.split(",");
this.id = dataArray[0];
this.password = dataArray[1];
this.name = dataArray[2];
this.contact = dataArray[3];
this.email = dataArray[4];
}
}
答案 1 :(得分:0)
您没有在第二个super()
构造函数中显式调用ClassAdmin
,因此编译器添加了super()
调用而没有任何参数。您没有无参数的ClassUser
构造函数,因此会出现错误。
添加明确的super
通话
public ClassAdmin(String data) {
super(data.split(",")[0] + data.split(",")[1] + data.split(",")[2] + data.split(",")[3]);
//...
}
或者使用私有的ClassAdmin
构造函数来避免重复使用data.split(",")
(尽管仍然有两次使用)
public ClassAdmin(String data) {
this(data.split(","));
//...
}
private ClassAdmin(String[] dataArray) {
super(dataArray[0] + dataArray[1] + dataArray[2] + dataArray[3]);
}
或创建无参数的ClassUser
构造函数
public ClassUser() { }
答案 2 :(得分:0)
您还需要将父构造器super(data);
的调用添加到public ClassAdmin(String data)
构造器中。
因为如果不调用父构造函数,则无法创建子对象。首先,需要创建父对象。而且只有在子对象实例化之后才能执行。
该错误的主要原因是,如果您未明确提供超类构造函数的调用,则Java编译器将尝试查找不带参数的默认超类构造函数,并且在您的情况下,将不带默认的不带参数ClassUser
类中的构造函数。
您可以通过两种方式进行修复:
通过将默认构造函数添加到ClassUser
:
public ClassUser() {
//some additional logic
}
通过添加对超类构造函数的调用:
public ClassAdmin(String data) {
super(data);
String[] dataArray = data.split(",");
this.id = dataArray[0];
this.password = dataArray[1];
this.name = dataArray[2];
this.contact = dataArray[3];
this.email = dataArray[4];
}
这取决于您的实现,但是请注意,在调用超类构造函数之后,您将覆盖ClassAdmin
构造函数中的某些属性。
答案 3 :(得分:0)
由于default constructor
中不存在ClassUser
,而是存在参数化构造函数,因此在扩展ClassUser
时应调用
ClassUser(data)
或
ClassUser(String id, String password, String name, String address, String contact, String role)
使用super
super- java docs
super(data)
或
super(id, password, name, address, contact, role)
答案 4 :(得分:0)
这是它的工作方式。创建子类的实例时,还需要实例化父/超级类的成员变量。如果您在Super类中具有默认构造函数,则这些成员变量将被初始化为其默认值。如果没有默认构造函数,则必须调用参数化构造函数以对其进行初始化。这就是为什么您需要在 ClassAdmin 构造函数中调用 super(date)的原因。
此外,您不必在 ClassAdmnin 构造函数中初始化超类成员变量,例如id,password,name等。在此构造函数中添加super(data)调用后,父类的成员变量将在父类构造函数本身中初始化。
此外,当您基于索引从数组中获取值而无需检查数组大小时,当前代码将引发NullPointerException。如果您看到 ClassAdmin 的第一个构造函数,则在发送给Super类构造函数的字符串中没有逗号(,)。您可以像 super(id +“,” + password +“,” + name +“,” + contact)
一样附加它
public ClassAdmin(String data){
super(data); // Add this line and it should fix the problem.
String[] dataArray = data.split(",");
this.id = dataArray[0];
this.password = dataArray[1];
this.name = dataArray[2];
this.contact = dataArray[3];
this.email = dataArray[4];
}