Alocação de memória das variáveis locais

Eu estava pensando aqui, que quando apenas declaramos uma var. local por exemplo do tipo int sem atribuir um valor, a JVM não reserva de fato um espaço na memória… Ela só irá reservar realmente se existir um valor inicial?
exemplo:


void method(){
    int i; // como a JVM irá alocar espaço na memória se não possui um valor inicial? 

}

Sei que o int reserva um espaço de 4 bytes na memória, porém eu entendo que memória livre seriam os bits todos representados como 0, ou seja, em decimal representaria 0… Então pq devemos inicializar as variáveis locais explicitamente?

Sei que minha dúvida é boba, mas eu estou começando e surgem diversas dúvidas.
obrigado

Existem 2 coisas: alocação e inicialização.

Alocação é quando o computador reserva um determinado espaço de memória, e torna-o acessível ao programador. Nas linguagens o endereço dessa área de memória é representado por um nome (que é a variável).
Inicialização é quando você atribui algum valor a essa área de memória pela primeira vez.

Você pode alocar os 4 bytes sem zerar o seu valor.
Nesse caso, o valor inicial seria o que quer que a memória contenha, o que normalmente representa um valor maluco qualquer.

Isso só não é permitido em Java, por dois motivos:
a) É sujeito a erros: se o compilador não te avisar, você só vai perceber que seu programa está usando uma variável inválida durante a execução… pior que isso, o erro pode só ocorrer esporadicamente, pois as vezes você poderia acabar alocando uma posição de memória zerada.
b) É inseguro: permite que o programador reserve grandes quantidades de memória e a analise, de modo a tentar descobrir senhas ou dados de outras aplicações.

Em outras linguagens, como o C, é possível usar uma variável sem inicializa-la.

[quote=ViniGodoy]Existem 2 coisas: alocação e inicialização.

Alocação é quando o computador reserva um determinado espaço de memória, e torna-o acessível ao programador. Nas linguagens o endereço dessa área de memória é representado por um nome (que é a variável).
Inicialização é quando você atribui algum valor a essa área de memória pela primeira vez.

Você pode alocar os 4 bytes sem zerar o seu valor.
Nesse caso, o valor inicial seria o que quer que a memória contenha, o que normalmente representa um valor maluco qualquer.

Isso só não é permitido em Java, por dois motivos:
a) É sujeito a erros: se o compilador não te avisar, você só vai perceber que seu programa está usando uma variável inválida durante a execução… pior que isso, o erro pode só ocorrer esporadicamente, pois as vezes você poderia acabar alocando uma posição de memória zerada.
b) É inseguro: permite que o programador reserve grandes quantidades de memória e a analise, de modo a tentar descobrir senhas ou dados de outras aplicações.

Em outras linguagens, como o C, é possível usar uma variável sem inicializa-la.[/quote]

ViniGodoy, obrigado mesmo pela explicação, agora consegui entender. 8)

Boa noite,

Esse foi um tópico que achei bem próximo à minha dúvida. É o seguinte: quero saber como são alocadas as variáveis locais aos métodos. Dou um “new” em um objeto e ele tem variáveis globais e locais (que são as variáveis de dentro dos métodos). As variáveis locais, elas são alocadas na memória no momento em que o objeto é construído (quando dou o new) ou elas são alocadas quando o métodos onde estão definidas é invocado? Nesse último caso, elas seriam desalocadas no momento em que o método termina.

Basicamente é isso. Quero saber se as variáveis locais são alocadas na memória quando o objeto é criado e vivem durante todo o tempo de vida deles ou se sao alocadas e desalocadas com a chamada e término de seus metodos.

Um objeto só é criado com new. E só é deletado quando não houver mais referências para ele. Assim, se você fizer um new dentro de um método, numa variável que só existe dentro do método, esse objeto será excluído ao final do método.

Porém, se você criar um objeto num método, e atribuí-lo a uma variável que vai sobreviver a execução do método (como por exemplo, uma propriedade da classe), o objeto não será excluído.

Não confunda o objeto com a variável que aponta para o objeto. Um único objeto pode ser apontado por duas variáveis, por exemplo:

[code]public void Exemplo {
private Integer umObjeto = null;

public void criar() {
     Integer variavel = new Integer();
     Integer variavel2 = new Integer();
     // Faz qualquer coisa com as variáveis
     umObjeto = variavel2; //Um objeto e variável 2 apontam para O MESMO objeto
}

}
[/code]

Nesse exemplo, o objeto armazenado em variavel será excluído (pois essa variável só existe dentro do método e ninguém mais apontará para ele quando ela for destruída). Mas o objeto criado pela variavel2 não será excluído, pois ele também está sendo apontado pela variável umObjeto, que existe independente da execução do método.