Java: Inicialização Variáveis

3 respostas
renamed

Pessoal.

Minha pergunta é bem iniciante e na verdade é mais uma curiosidade do que uma dúvida em si... então por favor tenham paciência =)

Alguém sabe porque o compilador atribui valores default para atributos mas não o faz para variáveis locais?

public class Principal {
	private int a;
	
	public void x(){
		int b;
		
		System.out.println(a);
		System.out.println(b); //Erro: The local variable b may not have been initialized
	}
		
}

Obg.

3 Respostas

B

Isso é uma escolha dos projetistas da linguagem. É que ao criar um objeto, a alocação de memória do Java efetua a limpeza da memória alocada, e nesse ponto isso é relativamente barato e elimina alguns problemas de segurança, mas no caso de variáveis locais a limpeza pode sair muito cara. Vou dar um exemplo bobo.

for (int i = 0; i < 10000000; ++i) {
    double d; // se fôssemos limpar a variável "d", teríamos de limpá-la inutilmente 10000000 vezes
    d = Math.abs (i); 
}
ViniGodoy

Esse artigo explica em detalhes:

A inicialização dos atributos ocorre porque, quando um objeto é criado, uma área de memória para ele é reservada no heap. Essa área, poderia estar sendo usada por qualquer processo, inclusive processos que contivessem, por exemplo, uma senha descriptografada. Por questões de segurança, a VM zera completamente a área reservada, antes de retorna-la. Daí, a inicialização padrão dos atributos “for free”.

É relativamente fácil fazer um programa em C que reserve uma grande área de memória, e analise em busca de informações úteis.

No caso do stack, não é necessário zerar atributos automaticamente. Também é muito fácil determinar se uma dada variável foi ou não iniciada de verdade.

A Sun poderia mesmo usar a mesma abordagem para variáveis locais. Creio que a razão para ela não ter feito isso foi meramente uma decisão de projeto, sem um motivo técnico mais forte. Pelo menos, nunca li nenhum artigo em que afirmassem nada nesse sentido. Existe realmente um ganho de performance em não inicializar diretamente, mas ele é muito pequeno para se justificar, e poderia ser evitado se o programador fizesse a inicialização direta da variável, ou com um mínimo de inteligência do compilador.

renamed

Obrigado bezier curve e ViniGodoy, achei o artigo show.

Criado 16 de dezembro de 2009
Ultima resposta 16 de dez. de 2009
Respostas 3
Participantes 3