Construção e Inicialização de objetos

Supondo o seguinte caso:

import java.util.Date;

public class Employee {
    private String name;
    private double salary = 15000.00;
    private Date birthDate;
    
    public Employee(String n, Date DoB) {
        name = n;
        birthDate = DoB;
    }
    
    public Employee(String n) {
        this(n, null);
    }
}

public class Manager extends Employee {
    private String departament;
    
    public Manager(String n, String d) {
        super(n);
        departament = d;
    }
}

Utilizando um new Manager(“Giuliani Sanches”, “Development”) ocorreria o seguinte:

  1. Alocação de memória para o objeto manager como um todo;
  2. Inicialização de todas as variáveis de instância;
    (…)

Justamente no ponto de inicializar as variáveis de instância me surgiu a dúvida:

a) Somente as variáveis de instância da classe Manager seriam iniciadas nesse momento e as variáveis de instância da classe Employee seriam inicializadas no momento da chamada do super ou
b) Tanto as variáveis de instância de Manager como as em Employee seriam inicializadas ?

Como vc testaria as suas hipóteses?

Com o netbeans aberto, criaria as duas classes além de uma terceira para inicializar o objeto. Colocaria um breakpoint no momento do new Manager, usaria o step into e com o mouse ia acompanhando o valor das variáveis.
Foi exatamente isso que acabei de fazer e a impressão que tive é que é no momento do super que as variáveis de instancia da Employee foram inicializadas :slight_smile:

[quote=khaoz]Justamente no ponto de inicializar as variáveis de instância me surgiu a dúvida:

a) Somente as variáveis de instância da classe Manager seriam iniciadas nesse momento e as variáveis de instância da classe Employee seriam inicializadas no momento da chamada do super ou
b) Tanto as variáveis de instância de Manager como as em Employee seriam inicializadas ?[/quote]
De uma maneira geral um construtor é chamado e imediatamente chama o construtor da superclasse ou algum construtor sobrecarregado, até que um dos construtores sobrecarregados chame o construtor da superclasse, em algum momento chegando ao construtor de Object, finalizando esse processo de chamadas. Nesse ponto todas as variáveis de instância já foram inicializadas com seus valores padrão. Agora os construtores começarão a serem executados na ordem inversa às chamadas dos construtores, no seu exemplo executa o código do construtor de Object depois de Employee que recebe uma String e um Date depois Employee que recebe uma String até finalizar executando o código do construtor de Manager que recebe duas Strings. Sempre antes da execução do(s) construtor(es) de uma classe as variáveis de instância que tem atribuição de valores explícitos como em private double salary = 15000.00; receberão esses valores, mas até esse momento elas já teriam sido inicializadas com seus valores padrão.