2014-11-24 2 views
-1
class Abc 
{ 
    public Abc() 
    { 
     System.out.println("constructor A"); 
    } 
} 

class Bb extends Abc 
{ 
    public Bb() 
    { 
     super(); // Calls Abc() 
     System.out.println("constructor B"); 
    } 
} 

public class X 
{ 
    public static void main(String args[]) 
    { 
     Bb b = new Bb(); 
    } 
} 

Ответ:В чем причина результата этого кода?

Constructor A 
Constructor B 

Может кто-нибудь сказать причину этого?

+1

"рассуждение" это просто нормальное поведение Java конструкторы. Например: http://java67.blogspot.com.au/2012/12/how-constructor-chaining-works-in-java.html –

ответ

1

Когда конструктор производного класса называется, он должен сначала построить его суперкласс. Если это не делается явно (путем указания super с аргументами или без них), это делается неявно, с конструктором no-arguments. Другими словами, ваш код эквивалентен:

class Abc { 
    public Abc() { 
     System.out.println("constructor A"); 
    } 
} 

class Bb extends Abc { 
    public Bb() { 
     super(); // Calls Abc() 
     System.out.println("constructor B"); 
    } 
} 

public class X { 
    public static void main(String args[]) { 
     Bb b = new Bb(); 
    } 
} 

После того, как выражается таким образом, легко понять, почему "constructor A" печатается, а затем "constructor B".

+0

Большое спасибо за его объяснение – Abhilash

3

Конструктор подкласса (Bb в вашем случае) должен вызвать конструктор суперкласса (Abc в вашем случае) перед выполнением собственного конструктора.

Этот код:

public Bb() { 
     System.out.println("constructor B"); 
    } 

эквивалентно:

public Bb() { 
     super(); // calls the super-class constructor 
     System.out.println("constructor B"); 
    } 
+0

Что делать, если я не хочу вызывать конструктор 'Abc' из' Bb' конструктор? – Junaid

+1

@Junaid У вас нет выбора. Некоторый конструктор суперкласса всегда будет вызываться, а если компилятор его не найдет, ваш код не будет компилироваться. – Eran

+1

@Junaid Это имеет смысл, поскольку подкласс содержит все члены его суперкласса, и поэтому он должен инициализировать их (посредством вызова конструктора суперкласса). – Eran

0

С супер() вызывается конструктор без аргументов суперкласса. С супер (список параметров) вызывается конструктор суперкласса с соответствующим списком параметров.

Теперь, если вы просмотрите свой код, вы получите ответ.

Refer this link for more explanation

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