j0nny:
Belo detalhe, nunca tinha pensado nisso.
Mas há casos em que a superclasse ainda não esteja ‘pronta’ no momento em que a subclasse está ‘pronta’?
Sim, isso sempre ocorre. A construção ocorre da super em direção as subclasses.
O java até tenta contornar os problemas, o que gera comportamentos estranhos. Por exemplo, se o método sobrescrito usa um atributo da subclasse, esse atributo não vai estar inicializado. Aí o java o inicializa imediatamente. Quando ele chega no construtor da subclasse, esse atributo é inicializado novamente. Se for um atributo simples, como um tipo primitivo, isso tem poucas chances de dar problema. Agora, um objeto pode ser criado duas vezes, e a referência anterior ser excluída. E isso pode gerar problemas.
Um caso típico é quando alguém tem a brilhante idéia (como eu tive e um rapaz num tópico que ajudei há muito tempo também) de, por exemplo, delegar para a subclasse a construção de um painel num JFrame. Aí ele faz algo assim:
public MeuJFrame() {
initialize();
add(painelFilho());
}
E o método painelFilho é criado na subclasse. Nesse caso, o que ocorre é que esse add vai adicionar um painel, e quando o construtor do filho rodar ele vai ser recriado, deixando o filho com a referência para outro painel. Note que o painel que está sendo exibido na tela, não é o mesmo que estará no atributo do filho. E como resultado, você terá aquela deliciosa sensação de que todos os seus sets não funcionam nos componentes desse painel.