проблема наследования Java - необходимо создать пустой конструктор в классе отца - PullRequest
1 голос
/ 18 августа 2010

Я программирую на NetBeans Ubuntu Java стандартного проекта (подготовка к тестированию). когда я создаю AccountStudent.java, я получаю сообщение об ошибке.

Account.java

public abstract class Account {
 protected double _sum;
 protected String _owner;
 protected static int accountCounter=0;

 public Account(String owner){
     this._sum=0;
     this._owner=owner;
     accountCounter++;
 }
}

AccountStudent.java - ошибка: не удается найти символ: конструктор Account ()

public class AccountStudent extends Account{

}

Исправление проблемы - добавьте пустой конструктор учетной записи:

Account.java

public abstract class Account {
 protected double _sum;
 protected String _owner;
 protected static int accountCounter=0;

 public Account(){

 }

 public Account(String owner){
     this._sum=0;
     this._owner=owner;
     accountCounter++;
 }
}

Зачем мне создавать пустой конструктор Account, если он уже существует, потому что он наследует класс Object?

Спасибо

Ответы [ 4 ]

8 голосов
/ 18 августа 2010

Зачем мне создавать пустой конструктор Аккаунт, если он уже существует, потому что он наследовать объект класса?

Конструкторы не наследуются. Если у класса нет явного конструктора, компилятор автоматически добавляет конструктор по умолчанию без аргументов, который ничего не делает, кроме вызова конструктора без аргументов суперкласса. В вашем случае это не работает для AccountStudent, потому что Account не имеет конструктора без аргументов. Добавление это один из способов решить эту проблему. Другой вариант - добавить к AccountStudent конструктор, который вызывает существующий конструктор Account, например:

public class AccountStudent extends Account{
    public AccountStudent(String owner){
        super(owner);
    }
}
3 голосов
/ 18 августа 2010

Каждый класс в Java должен иметь конструктор, если вы его не определите, компилятор сделает это за вас и создаст конструктор по умолчанию (тот, у которого нет параметров). Если вы сами создаете конструктор, то компилятору не нужно его создавать.

Так что, даже если он наследует от Object, это не значит, что он будет иметь конструктор по умолчанию.

Когда вы создаете экземпляр AccountStudent, вам необходимо вызвать родительский конструктор. По умолчанию, если вы не укажете родительский конструктор для вызова, он вызовет конструктор по умолчанию. Если вы хотите явно вызвать родительский конструктор, вы сделаете это с super().

Существует три способа избежать ошибки:

Вызовите родительский конструктор с параметром, который вы получите от дочернего конструктора:

public class AccountStudent extends Account{
    public AccountStudent(String owner){
        super(String owner);
    }

}

Вызовите родительский конструктор с параметром, который вы создаете сами:

public class AccountStudent extends Account{
    public AccountStudent(){
        super("Student");
    }

}

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

1 голос
/ 14 января 2014

Объект расширенного класса содержит переменные состояния (поля), которые наследуются от суперкласса, а также от переменных состояния, определенных локально в классе. Построить объект расширенного класс, вы должны правильно инициализировать оба набора переменных состояния. конструктор расширенного класса может иметь дело с его собственным состоянием, но только суперкласс знает, как правильно инициализировать свое состояние так, чтобы его Контракт соблюдается. Конструкторы расширенного класса должны делегировать построение наследуемого состояния неявно или явно вызов конструктора суперкласса.

Язык программирования Java ™, четвертое издание Кен Арнольд, Джеймс Гослинг, Дэвид Холмс

1 голос
/ 18 августа 2010

JLS 8.8.9 Конструктор по умолчанию

Если класс не содержит объявлений конструктора, автоматически предоставляется конструктор по умолчанию, который не принимает параметров. Если объявленный класс является первичным классом Object, тогда конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию не принимает параметров и просто вызывает конструктор суперкласса без аргументов.

В этом случае класс AccountStudent не имеет конструктора, поэтому компилятор добавляет конструктор по умолчанию для вас, а также добавляет вызов конструктора суперкласса. Таким образом, ваш детский класс выглядит так:

    class AccountStudent extends Account{
      AccountStudent() {
      super();
     }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...