Static apenas uma pergunta

6 respostas
deyvid

Por favor corrijame se estiver errado

public class Teste {
   static int X = 1;

   public static void main(String[] args) {
   }

  static {X = 10;}
}

Funciona assim:

  1. Quando a classe Teste é carregada a variável X vai receber 1;
  2. Após todos os super da classe, a variável X vai recever 10;

Isto está correto?

6 Respostas

romarcio

Não, as variáveis e métodos staticos são inicializados com a classe, não com a instância da classe. No caso o construtor é chamado com uma instância da classe, então antes do construtor ser chamado o x será igual a 10;

As variáveis e métodos staticos, são executados na ordem que são criados, de cima para baixo.

maior_abandonado
executa esse teste:
import java.util.List;

public class Filho extends Pai{

	static{
		System.out.println("bloco static filho");
	}
	
	{
		System.out.println("bloco filho");
	}

	public Filho(){
		System.out.println("construtor filho");
	}
	
	public static void main(String args[]){
		System.out.println("main antes");
		Filho f = new Filho();
		System.out.println("main depois");
	}

}

class Pai{
	static{
		System.out.println("bloco static pai");
	}
	
	{
		System.out.println("bloco pai");
	}

	public Pai(){
		System.out.println("construtor pai");
	}
	
}
deyvid

A questão é sobre um variável estatica e um bloco estatico e o que acontece após o super

Creio que não tenho como ser mais claro

Mas desde já agradeço

romarcio

deyvid:
A questão é sobre um variável estatica e um bloco estatico e o que acontece após o super

Creio que não tenho como ser mais claro

Mas desde já agradeço

Isso eu já respondi pra ti, nada acontece. As variáveis estáticas e métodos estáticos são inicializados com a classe e não com a instância da classe. São sempre a primeira coisa a ser inicializada na construção da classe. Depois dos static’s, é que vai ser feita a chamada de um construtor por uma instância e nessa chamada será executado o super.

O exemplo postado pelo maior_abandonado é muito bom, mas além de static ele também colocou o que chamamos de bloco de instância(se não me engano) e esse bloco de instância é que será executado após um super.

maior_abandonado

deyvid:
A questão é sobre um variável estatica e um bloco estatico e o que acontece após o super

Creio que não tenho como ser mais claro

Mas desde já agradeço

eu sei, o exemplo que fiz foi para mostrar que os construtores são as ultimas coisas a executar neste exemplo…

inclusive se você tirar o main, primeiro carrega o conteúdo estático de ambas as classes depois da a exceção falando da falta do main (ao tentar executar a classe filho).

diegohsi
Exemplo
class Pai{
	static int s = 1;
	Pai(){ System.out.println("Construtor Pai"); }
	static { System.out.println("Bloco Statico da Classe Pai"); }
}

public class Filho extends Pai{
	static { System.out.println("Bloco Statico da Classe Filho");}
	public static void main(String[] args) {
		new Pai();
	}
}

1. Quando vc der um new independente de ser em Pai ou em Filho, irá chamar o o contrutor da superClasse até a classe Objetc.
2. Antes de chamar á proxima linha após o super, todos os blocos static da super classe são chamados depois passado para as classes filhas até chegar a classe que chamou o primeiro contrutor.
3. Lembrando que se vc tiver um bloco estatico após o outro irá chamar na sequencia e depois passar pra proxima classe.
4. as variaveis static são carregadas antes de qualquer coisa são carregadas junto com a classe.

Sou novo por aqui, perdoe-me se estiver falando algo errado.

Criado 27 de outubro de 2010
Ultima resposta 28 de out. de 2010
Respostas 6
Participantes 4