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?
publicclassPrincipal{privateinta;publicvoidx(){intb;System.out.println(a);System.out.println(b);//Erro: The local variable b may not have been initialized}}
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.
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.