не может ссылаться на roomNumber до вызова конструктора супертипа

я создал два класса Standard и Family, которые расширяют абстрактный класс Room, при компиляции класса Standard я встречаюсь с ошибкой «не могу ссылаться на roomNumber до вызова конструктора супертипа», но я не могу понять, почему, любая помощь будет оценена по достоинству.

Room

public abstract class Room
{
    public int roomNumber;
    public String roomType;
    public boolean ensuite;
    public boolean available;

public Room(int roomNumber, boolean enSuite)
   {
       this.roomNumber = roomNumber;
       ensuite = enSuite;
       available = false;
   }
}

Standard

public class Standard extends Room
{
    private int roomNumber;
    private int childCap;
    private int adultCap;



public Standard(int theNumber, int kidsCap, int adultsCap)
   {
       super(theNumber, roomNumber);
       childCap = childsCap;
       adultCap = AdultsCap;
   }
}

person Darren Burgess    schedule 18.11.2011    source источник
comment
Почему вы переобъявили roomNumber в классе Standard? я думаю в этом проблема   -  person kol    schedule 18.11.2011
comment
PS у этого есть ряд проблем, которые вы, возможно, захотите исправить. Стандартный конструктор имеет две ошибки компиляции. Вы передаете roomNumber вместо enSuite в качестве параметра — они даже не одного типа. Ваш оператор ensuite = enSuite сбивает с толку из-за того, что имена отличаются всего лишь одним регистром букв, использование общедоступных полей - это нет-нет, и, наконец, скрытие общедоступного поля с частным в подклассе обязательно вызовет путаницу!   -  person Sean Owen    schedule 18.11.2011
comment
Спасибо, ребята, потребовалось некоторое время, но я понял, что вы имели в виду, и я решил проблему.   -  person Darren Burgess    schedule 18.11.2011


Ответы (3)


super(theNumber, roomNumber);

при вызове суперконструктора это должно быть первое, что вы делаете. вы пытаетесь отправить приватное поле roomNumber в качестве параметра.

на заметку, конструктор Room принимает целое и логическое значение, в то время как вы отправляете два целых числа.

public Room(int roomNumber, boolean enSuite)

person yurib    schedule 18.11.2011

  super(theNumber, roomNumber);//both are int

Когда вы пишете это, компилятор будет искать суперконструктор с двумя int parameter, но такого конструктора нет. Ваш конструктор имеет один int и один Boolean.

public Room(int roomNumber, boolean enSuite)

В Java если родительский конструктор не может выполнить вызов из-за какого-либо условия, компилятор должен показать это как ошибку.

Из JLS-8.8.7.1< /а>

Оператор явного вызова конструктора в теле конструктора не может ссылаться ни на какие переменные экземпляра, методы экземпляра или внутренние классы, объявленные в этом классе или любом суперклассе, или использовать this или super в любом выражении; в противном случае возникает ошибка времени компиляции. Поэтому измените параметр конструктора или создайте новый...

person Sumit Singh    schedule 18.11.2011

вы ссылаетесь на roomNumber в стандарте, который обрабатывается JVM только после того, как конструктор Room() завершит обработку. Переменные уровня класса обрабатываются и инициализируются JVM только после успешного завершения конструкторов всех суперклассов. Итак, ваша цепочка вызовов выглядит примерно так:

Standard() -> Room() -> [инициализировать переменные-члены Room] -> Возврат из Room() -> [инициализировать переменные-члены Standard]

Таким образом, вы не можете передать roomNumber в Room, потому что на самом деле он еще не существует.

person mcfinnigan    schedule 18.11.2011