2016-02-11 2 views
2

мне интересно, что происходит здесь:Java абстрактный класс конструктор

У меня есть абстрактный суперкласс

public abstract class Superclass { 
    public Superclass() 
    { 
     doSth(); 
    } 
    public abstract void doSth(); 
} 

и подкласса

public class Subclass extends Superclass{ 
    private int x = 10; 
    public void doSth() 
    { 
     System.out.println("Value x="+this.x);   
    }  
} 

Когда я делаю

Subclass x= new Subclass(); 
x.doSth(); 

Я получаю:

Value x=0 
Value x=10 

Я не знаю, почему сначала я получаю x = 0 (почему бы не x = 10 с самого начала?), А затем x = 10?

ответ

7

Конструктор суперкласса выполняется перед выражением инициализатора isntance подкласса, поэтому x по-прежнему имеет значение по умолчанию 0 при первом вызове doSth(). Второй вызов x.doSth() занимает место после того, как экземпляр Subclass полностью инициализирован, поэтому x содержит 10.

Подробнее:

При вызове constrcutor из Subclass, сначала вызывает конструктор Superclass, который вызывает конструктор Object. Затем выполняется тело конструктора Superclass, поэтому выполняется doSth(). Только после выполнения конструктора Superclass выражения инициализации экземпляра Subclass (в вашем случае оцениваются присвоение x = 10;. Перед их вычислением x по-прежнему содержит значение по умолчанию - 0, которое является значением, которое вы видите напечатанным по первому вызову до doSth().