2016-09-10 3 views
1
class Time 
{ 
    public static void main (String args[]) 
    { 
     Son obj = new Son(); 
    } 
} 
class Father   // Super Class 
{ 
    Father(int x, int y)   // parameterized constructor 
    { 
     int a = x; 
     int b = y; 
     System.out.println("Super Class Constructor a = "+a); 
     System.out.println("Super Class Constructor b = "+b); 
    } 
    Father(int z)   // parameterized constructor 
    { 
     int d = z; 
     System.out.println("Super Class Constructor d = "+d); 
    } 
} 
class Son extends Father // Sub Class 
{ 
    Son()     // default constructor 
    { 
     super(100); 
     super(10, 20);  // Problem is here 

     int c = 200; 
     System.out.println("Sub Class Constructor c = "+c); 
    } 
} 

Мой вопрос в том, можно ли использовать несколько супер() в конструкторе подкласса, поскольку я хочу инициализировать два суперклассифицированных конструктора Parameterized. Если это невозможно, то как я могу это сделать?Несколько супер() для перегрузки суперкласса класса

+0

Короткий ответ - нет. В последнем предложении, где вы спрашиваете «как я могу это сделать», что вы на самом деле хотите сделать? Конструкторы 'Father' очень странные, поскольку они устанавливают локальные переменные, но не используют их. –

+1

Построить только 1 конструктор Отца (int x, int y, int z) { } –

+0

@DavidWallace Я просто пытался использовать два супер() в одном конструкторе. Это не разрешено в Java, мы не можем использовать два супер() в одном конструкторе, потому что super() должен быть первым выражением. спасибо – Raj

ответ

0

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

В вашем примере у вас нет полей в Father, поэтому любой из ваших конструкторов должен быть достаточно хорош для этого. если вы довольны конструкторами, которые у вас есть, но по-прежнему хотят получить от обоих, есть несколько вариантов. Во-первых, вы можете добавить конструктор с тремя аргументами Father(int x, int y, int z), как указано в комментарии Nghia Do. Вам не нужно удалять два других конструктора, если вы предпочитаете иметь все три. Во-вторых, вы можете поместить вызов метода вместо второго супервызов и написать метод в Father, чтобы распечатать сообщение и выполнить другую работу. Для повторного использования кода вы должны иметь конструктор с двумя аргументами, который будет использовать тот же метод, а не дублировать код.

Подумайте, что произойдет, если бы у вас был класс с двумя конструкторами, и вам нужно было позвонить обоим - если это было разрешено. Это было бы сложной ошибкой, ожидающей своего появления. Всегда был бы риск, что кто-то забыл позвонить обоим. У вас будет какой-то полупостроенный объект, и никто не узнает, когда что-то пойдет не так, когда вы его используете. И когда это произошло, было бы совершенно очевидно, что это произошло из-за забытого второго вызова конструктора. Как я уже сказал, вы этого не хотите. Правило, что Java всегда вызывает ровно один супер-конструктор, является хорошим.

1

Ваш код просто неправильный. Конструктор в Java должен всегда вызывать точно один суперкласс-конструктор. Нет такой вещи, как запись super() дважды в один и тот же конструктор.

Другими словами: very Первый оператор в конструкторе - это вызов конструктора суперкласса. Если вы не поместите туда такой вызов, компилятор вставляет вызов super() за обложки.

В этом смысле: когда вы новичок, а компилятор дает сообщение об ошибке; вещь, чтобы сделать: обратиться к хорошей книге или online resource.

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