找不到适合ClassUser的合适构造函数(无参数)

时间:2018-11-22 11:45:01

标签: java inheritance netbeans

我是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];
}

5 个答案:

答案 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];
}