Funcionamento da Herança para os Construtores

Vimos que os construtores são invocados em tempo de execução quando o programador digita new para instanciar alguma classe, como no exemplo da classe carro acima. Mas, o que realmente acontece quando fazemos new Carro()?

Digamos que a classe Carro extends Veiculo e que Veiculo extends Object, como já vimos anteriormente, a palavra-chave extends é utilizada para determinar que uma classe herde de outra. Entraremos em mais detalhes sobre herança nos capítulos seguintes. Por agora, basta entender que Carro é uma subclasse de Veiculo e que Veículo é uma subclasse de Object. Exemplo:


Agora, o que o acontece quando invocamos new Carro()?

  1. O construtor de carro será invocado. Todo construtor invoca o construtor da sua superclasse com uma chamada implícita para super(), a menos que a classe invoque um construtor sobrecarregado da mesma classe (falaremos sobre isso depois).
  2. O construtor da classe Veiculo será chamado, que por sua vez chamará o construtor da classe Object.
  3. Como a classe Object é a última super classe de todas as classes, podemos concluir que a classe Veiculo extends Object mesmo que você não declare a chamada extends explicitamente. Chegando ao topo da pilha, o construtor da classe Object será executado primeiramente antes de todos os outros. Os seus atributos de instância serão inicializados e finalizamos o seu construtor.
  4. Fazendo o caminho de volta, então, é chamado o construtor da classe Veículo e os seus atributos de instância agora terão seus valores inicializados. Finalizamos o construtor da classe Veículo.
  5. E por fim, o construtor da classe Carro também será chamado e os valores de seus atributos de instancia serão inicializados. E finalizamos o construtor de Carro.

A figura a seguir demonstra como os construtores funcionam na pilha.

4. Object()
3. Veiculo chama superObject()
2. Carro chama super Veiculo()
1. main() chama new Carro()

O que faz o operador super?

  • Ele chamará o construtor da superclasse para que essa possa realizar as suas inicializações antes mesmo que todas as suas classes filhas.
  • Uma chamada para super() poderá ser sem parâmetros ou com parâmetros, dependendo dos argumentos especificados no construtor da superclasse.

Você não pode fazer uma chamada para um método de instância ou um atributo de instância, até que o construtor da sua superclasse tenha finalizado.

Versão 5.3 - Todos os Direitos reservados