Como ocorre a criação de um objeto (Sequência de blocos estáticos, anônimos e carga de propriedades)

O exemplo abaixo ilustra a sequência de execução de blocos estáticos, anônimos e construtores em uma classe e sub-classe. Além disso ambas as classes possuem propriedades a serem carregadas.

 

public class InitializationTest {

public static void main(String[] args){

new Filha();

}

}

 

class Pai {

private int idade;

private String nome;

private Carteira carteira = new Carteira();

 

static{

System.out.println(“BLOCO ESTATICO: Pai”); // 1

}

{

System.out.println(“BLOCO ANONIMO: Pai”); // 6

}

public Pai() {

System.out.println(“CONSTRUTOR: Pai”); // 7

}

}

 

class Filha extends Pai {

private Brinquedo brinquedo = new Brinquedo();

 

static{

System.out.println(“BLOCO ESTATICO: Filha”); // 2

}

{

System.out.println(“BLOCO ANONIMO: Filha”); // 11

}

public Filha() {

System.out.println(“CONSTRUTOR: Filha”); // 12

}

}

 

class Carteira{

static{

System.out.println(“BLOCO ESTATICO: Carteira”); // 3

}

{

System.out.println(“BLOCO ANONIMO: Carteira”); // 4

}

public Carteira(){

System.out.println(“CONSTRUTOR: Carteira”); // 5

}

}

 

class Brinquedo {

static{

System.out.println(“BLOCO ESTATICO: Brinquedo”); // 8

}

{

System.out.println(“BLOCO ANONIMO: Brinquedo”); // 9

}

public Brinquedo(){

System.out.println(“CONSTRUTOR: Brinquedo”); // 10

}

}

 

 

 

Output:

 

BLOCO ESTATICO: Pai

BLOCO ESTATICO: Filha

BLOCO ESTATICO: Carteira

BLOCO ANONIMO: Carteira

CONSTRUTOR: Carteira

BLOCO ANONIMO: Pai

CONSTRUTOR: Pai

BLOCO ESTATICO: Brinquedo

BLOCO ANONIMO: Brinquedo

CONSTRUTOR: Brinquedo

BLOCO ANONIMO: Filha

CONSTRUTOR: Filha

 

Análise do resultado:

 

Ao se instanciar a classe filha como é visto na linha ‘new Filha()’…

 

BLOCO ESTATICO: Pai

BLOCO ESTATICO: Filha

(até aqui) Carrega-se na memória toda a hierarquia de herança (primeiro a superclasse depois a subclasse)

BLOCO ESTATICO: Carteira

BLOCO ANONIMO: Carteira

CONSTRUTOR: Carteira

(até aqui) Atribui-se as propriedades da superclasse (Pai)

BLOCO ANONIMO: Pai

(até aqui) Na execução do bloco anônimo já é possível a classe referenciar suas variáveis de instância. Veja acima, por exemplo que a variável de instância ‘Pai.carteira’ já foi atribuida.

CONSTRUTOR: Pai

(até aqui) Termina de construir a classe Pai.

class Pai {

private int i = 7; // 2º atribui propriedades

public Pai(){ // 4º executa o construtor

super();

// Neste momento podemos acessar as propriedades já atribuidas da classe Pai:

System.out.println(i); // por ex: i é uma variável de instância neste momento para o valor 7

// Repare que o construtor ainda não terminou…

}

// BLOCO ANÔNIMO: neste momento já podemos acessar a variável de instância ‘i’. O valor de i=7.

{System.out.println(i);} // 3º executa bloco anônimo

static{// neste momento não podemos acessar o campo i} // 1º carrega em memória a classe

}

BLOCO ESTATICO: Brinquedo

BLOCO ANONIMO: Brinquedo

CONSTRUTOR: Brinquedo

(até aqui) Atribui-se as propriedades da classe instanciada (Filha)

BLOCO ANONIMO: Filha

CONSTRUTOR: Filha

(até aqui) Termina de construir a classe instanciada

 

Anúncios
Esta entrada foi publicada em Java com as etiquetas , , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s