не может ссылаться на roomNumber до вызова конструктора супертипа - PullRequest
2 голосов
/ 18 ноября 2011

я создал два класса 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;
   }
}

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

super(theNumber, roomNumber);

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

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

public Room(int roomNumber, boolean enSuite)

4 голосов
/ 18 ноября 2011
  super(theNumber, roomNumber);//both are int

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

public Room(int roomNumber, boolean enSuite)

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

С JLS-8.8.7.1

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

3 голосов
/ 18 ноября 2011

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

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

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

...