конструктор подкласса в Java - PullRequest
4 голосов
/ 06 марта 2012

При компиляции этой программы я получаю сообщение об ошибке -

class Person {
  Person(int a) { }
 }
 class Employee extends Person {
    Employee(int b) { }
 }
 public class A1{
    public static void main(String[] args){ }
 }

Ошибка - не удается найти конструктор (). Почему определение Person () необходимо?

Ответы [ 6 ]

25 голосов
/ 06 марта 2012

При создании Employee вы одновременно создаете Person.Чтобы убедиться, что Person правильно построен, компилятор добавляет неявный вызов к super() в конструкторе Employee:

 class Employee extends Person {
     Employee(int id) {
         super();          // implicitly added by the compiler.
     }
 }

Поскольку Person не имеет конструктора без аргументов, этоне удается.

Вы решаете это либо

  • , добавляя явный вызов super, например:

     class Employee extends Person {
         Employee(int id) {
             super(id);
         }
     }
    
  • или путем добавления конструктора без аргументов в Person:

    class Person {
        Person() {
        }
    
        Person(int a) {
        }
    }
    

Обычно конструктор без аргументов также неявно добавляется компилятором.Как отмечает Биньямин Шарец в комментариях, это только в том случае, если конструктор вообще не указан.В вашем случае вы указали конструктор Person, поэтому неявный конструктор не создается.

2 голосов
/ 06 марта 2012

Конструктор для Employee не знает, как создать суперкласс, Person.Без вашего явного указания он по умолчанию попытается использовать конструктор без аргументов суперкласса, который не существует.Отсюда и ошибка.

Исправление:

class Employee extends person {
    public Employee(int id) {
        super(id);
    }
}
1 голос
/ 06 марта 2012

Выше приведен верный ответ, некоторые дополнения: вы можете напрямую вызвать super (int n), чтобы избежать неявного добавления super () здесь:

class Employee extends Person {
    Employee(int id) { super(int id);}
}
  1. Если вы не пишете конструктор, компилятор неявно добавляет по умолчанию (без параметров) в ваш класс.
  2. Если вы напишите какой-либо конструктор - компилятор не добавит конструктор по умолчанию.

PS: извините за мои письма. Английский не мой родной язык.

1 голос
/ 06 марта 2012

Java предоставляет вам конструктор по умолчанию, который не принимает параметров.Конструктор также не имеет тела, поэтому он выглядит примерно так: public Person() {}.В тот момент, когда вы определяете свой собственный конструктор, ваш конструктор (ы) заменяет конструктор по умолчанию, поэтому в вашем случае Person(int nm){} заменяет Person() { }.Ваш вызов пытается неявно вызвать Person() { }, и поскольку этот конструктор больше не существует, код завершается ошибкой.Взгляните на этот предыдущий вопрос SO для получения дополнительной информации.

1 голос
/ 06 марта 2012

Java на самом деле рассматривает этот код как:

class Person {
  Person(int nm) { }
 }
 class Employee extends Person {
    Employee(int id) {
        super();
    }
 }
 public class EmployeeTest1 {
    public static void main(String[] args){ }
 }

Так как нет конструктора Person (), это не удастся.Вместо этого попробуйте:

class Person {
  Person(int nm) { }
 }
 class Employee extends Person {
    Employee(int id) {
        super(id);
    }
 }
 public class EmployeeTest1 {
    public static void main(String[] args){ }
 }
0 голосов
/ 12 декабря 2018

Это не на 100% связано с вашей проблемой.Но это также связано с конструкторами Java.Допустим, у вашего класса Person нет конструктора по умолчанию, а параметры конструктора не являются примитивными типами данных.Это объекты.

Но если вы хотите создать подкласс с конструктором по умолчанию, вот решение.И имейте в виду, вам не разрешено менять суперкласс.

Я создал другой класс с именем contact.

class Contact{
    private String name;
    private int number;

    public Contact(String name, int number) {
        this.name = name;
        this.number = number;
    }
}

Тогда вот код.

//Super Class   -  "Can't change the code"
class Person {
    Person(Contact contact) { }
}

//Sub Class
class Employee extends Person {
    private static Contact c;

    static {
        c = new Contact("Anna",10);
    }

    Employee() {
        super(c);
    }
}

Вы должны статической переменной класса Contact, чтобы сохранить экземпляр объекта для передачи в конструктор суперкласса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...