2013-03-21 4 views
4

Почему значение id = 0, когда конструктор суперкласса вызывается внутри конструктора производного класса? Когда создается дочерний объект, когда память выделена в кучу объекта? После запуска конструктора базового класса или раньше?Переопределенная функция в конструкторе дочернего класса (JAVA)

class Parent{ 
     int id = 10; 
     Parent(){ 
      meth(); 
     } 
     void meth(){ 
      System.out.println("Parent :"+ id); 
     } 
    } 
    class Child extends Parent{ 
     int id = 5; 
     Child(){ 
      meth(); 
     } 
     void meth(){ 
      System.out.println("Child :"+ id); 
     } 
    } 
    public class OverRidingEg { 

     public static void main(String[] args) { 
      // TODO Auto-generated method stub 
      Child a= new Child(); 

     } 

    } 
+0

Я не вижу никакого вызова 'super()' ... Как называется родительский конструктор? – LaGrandMere

+2

@LaGrandMere каждый конструктор подкласса по умолчанию no-args будет иметь implicly super(), если родительский класс имеет аргументы по умолчанию no-args. – PermGenError

+0

@PermGenError: каждый конструктор подкласса будет иметь такой неявный вызов, даже те, которые содержат аргументы. –

ответ

5

Сначала выполняется конструктор суперкласса. Поэтому, когда вызывается переопределенный метод, дочерний конструктор еще не выполнен, поэтому поле id в подклассе по-прежнему имеет значение по умолчанию.

Вот почему вызов переопределяемых методов из конструктора - это плохая практика, помеченная такими инструментами, как PMD: инварианты объектов не выполняются при вызове такого метода.

+0

Когда идентификатор подкласса инициализируется значением по умолчанию (0)? – theIronGiant

+1

Сразу после выделения памяти перед вызовом конструкторов. См. Http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 –

+0

большое спасибо. что очищает все. – theIronGiant

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