2012-06-16 7 views
0

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

parent(int a); 
parent(int a,int b); 

и два ребенка конструкторы

child(int c); 
child(int c,int d); 

Я должен был бы иметь детей (Int а) на самом деле быть в виде двух конструкторах

child(int a, int c) 
{ 
super(a) 

c = this.c; 
} 

и

child (int a, int b, int c) 
{ 
super(a,b) 

c = this.c; 
} 

и иметь ребенка (INT C, INT D) на самом деле есть два конструктора

child(int a, int c, int d) 
{ 
super(a); 

c = this.c; 
d = this.d; 
} 

или мог я пройти

child(int a,int b, int c, int d) 
{ 
super(a,b); 

c = this.c; 
d = this.d; 
} 

}

ответ

2

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

Если родительский объект не представляет конструктор по умолчанию (тот, который не требует какого-либо параметра), вам необходимо явно вызывать его из ваших подклассов.

Ничто не запрещает вам иметь общий конструктор, как вы прокомментировали в случае child(int a, int b, int c, int d), и вызвать конструктор родительского класса, лежащий super(a,b).

Если у вас есть некоторые конструкторы родительского класса, это не означает, что вам нужно «распространять» их на подклассах.

Существует хороший текст относительно цепочки конструктора here.

+0

Если я явно вызываю родительский конструктор, используя super i, я должен передать все его аргументы в конструкторах под классов? –

+0

@ChrisOkyen вам нужно получить его откуда-то, например: если ваш родительский класс требует '(int a, int b)', и вам нужен еще один параметр для вашего подкласса, вы можете написать один конструктор в вашем подклассе, например '(int a, int b, String c) {super (a, b); this.c = c;} '. Другой способ - сгенерировать это значение (если это имеет смысл ...), предположим, что параметр a всегда один и тот же для этого конкретного подкласса, поэтому вы можете сделать что-то вроде '(int b, String c) {super (3, b) ; this.c = c;} ' –

+0

Спасибо, это просто кажется очень повторяющимся, чтобы перегружать методы. –

0

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

Смежные вопросы