Не найдено подходящего конструктора для ClassUser (без аргументов) - PullRequest
0 голосов
/ 22 ноября 2018

Я новичок в 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 голосов
/ 22 ноября 2018

Вот как это работает.Когда вы создаете экземпляр дочернего класса, вам также необходимо создать экземпляр переменных-членов родительского / суперкласса.Если у вас есть конструктор по умолчанию в суперклассе, тогда эти переменные-члены инициализируются в их значения по умолчанию.Если у вас нет конструктора по умолчанию, вам придется вызвать параметризованный конструктор для их инициализации.Вот почему вам требуется вызов super (date) в вашем ClassAdmin конструкторе.

Также вам не нужно инициализировать переменные члена суперкласса, такие как id, пароль, имя и т. Д. В конструкторе ClassAdmnin .Как только вы добавите вызов super (data) в этот конструктор, переменные-члены родительского класса будут инициализированы в самом конструкторе родительского класса.

Более того, ваш текущий код будет выдавать исключение NullPointerException, когда вы получаете значение из массива на основепо индексу без проверки размера массива.Если вы видите первый конструктор ClassAdmin , то в строке, которую вы отправляете конструктору суперкласса, нет запятой (,).Вы можете добавить его как 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];
}
0 голосов
/ 22 ноября 2018

Вам нужно вызвать конструктор ужин в:

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];
    }
}
0 голосов
/ 22 ноября 2018

Вам также необходимо добавить вызовы родительского конструктора 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 конструкторе.

0 голосов
/ 22 ноября 2018

Поскольку в ClassUser нет default constructor, но присутствует параметризованный конструктор, поэтому при расширении ClassUser следует вызывать

ClassUser(data)

или

ClassUser(String id, String password, String name, String address, String contact, String role)

с помощьюsuper Супер-Java документы

super(data)

или

super(id, password, name, address, contact, role)
0 голосов
/ 22 ноября 2018

Вы не вызвали 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() { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...