Наследование Java - конструкторы - PullRequest
11 голосов
/ 06 июня 2011

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

class A {
    public A(int x) {   }
}

class B extends A {
    public B(int x ) {   }
}

обязательно ли вызывать конструктор класса A в конструкторе класса B (super (x)). В книге говорится, что это не обязательно, потому что они имеют точное количество и тип параметров. Но когда я пытаюсь это сделать в компиляторе Java, выдается следующая ошибка:

конструктор А в классе А не может быть применяется к данным типам; требуется: int найдено: без аргументов причина: фактические и формальные списки аргументов отличаются по длине

Ответы [ 5 ]

17 голосов
/ 06 июня 2011

Компилятор автоматически вставляет super() в начале.

Однако, даже аргументы конструкторов, super() (без аргументов) добавляются, что вызывает конструктор default суперкласса. А у вас его нет, отсюда и ошибка.

Вы должны указать super(x) (чтобы вызвать A(x)) или определить конструктор без аргументов.

Кстати, компилятор Eclipse выдает гораздо лучшее сообщение об ошибке:

Неявный супер-конструктор A () не определен. Должен явно вызывать другой конструктор

4 голосов
/ 06 июня 2011

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

Но когда у вас есть конструктор с аргументами, при создании конструктора с параметрами в B вам нужно передать super() параметр для A

пример:

class A {
    public A(int x) {   }
  }

  class B extends A {
    public B(int x ) 
    {
       super(x); // need to specify the parameter for class A
       //... 
    }
  }
4 голосов
/ 06 июня 2011

Похоже, что компилятор пытается создать вызов конструктора по умолчанию для суперклассов с super(), который недоступен:

required: int
found:    no arguments

Но вернемся к вашей книге: я никогда не слышал оправило, в котором вы можете пропустить оператор super в конструкторе, если фактический конструктор имеет тот же список параметров, что и конструктор в прямом суперклассе.Только вызов конструктора суперкласса по умолчанию добавляется неявно (super()), но для этого требуется, чтобы суперкласс имел конструктор по умолчанию.

В отличие от того, что написано в вашей книге (или вв отличие от вашего понимания написанного текста), вот предложение из спецификации языка:

Если тело конструктора не начинается с явного вызова конструктора, и объявленный конструктор не является частью изначальногоclass Object, то тело конструктора неявно предполагает, что компилятор начинает с вызова конструктора суперкласса «super ();» , вызова конструктора его прямого суперкласса, который не принимает аргументов.

1 голос
/ 06 июня 2011

Это происходит, когда у вас нет конструктора по умолчанию, и вы создаете экземпляр со стандартным.Потому что если у вас есть какой-либо Parameterized конструктор, то компилятор не вставит для вас конструктор по умолчанию, вместо этого вы должны определить.

0 голосов
/ 06 июня 2011

В случае Java необходимо вызвать конструктор суперкласса. Поэтому всякий раз, когда вы генерируете конструктор подкласса, конструктор суперкласса самостоятельно создается в IDE.

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

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