olha para entender isso: você poe assim, todas minhas variaveis locais ou seja declarda dentro de um método ou de um bloco, ela pertence a uma pilha, que pilha é essa? uma pilha de chamadas.. que apos a conclusão de cada chamada, essas variaveis sao destruidas. exemplo:
class Pilha{
void massa(){
int z=10;
pizza();
}
void pizza(){}
public static void main(String[]arg){
Pilha p = new Pilha();
p.massa();
}
}
vamos observar o codigo agora, você tem essa pilha: main-->massa-->pizza. certo? um metodo chamado o outro.. qdo pizza concluir sua tarefa, ele volta para o metodo chamador quem é? massa, ai ele conclui a sua tarefa e volta para quem? Main e a variavel de massa é local ne? entao ela foi destruida apos o metodo ter concluido e agora o metodo está em main que terminou sua execucao e seu programa parou de rodar.. simples ne? então por isso que é uma variavel de pilha, pois ela está em uma pilha de chamadas.
E heap? heap é um local aonde está as variaveis de instancia? mais para vc saber o que é heap tem q se lembrar que variaveis de instancia pertence a um objeto, entao no heap eu posso ter varios objetos que referencia aquela variavel de instancia porem com valores distintos. Todo e qualquer objeto que vc dar new ele vai para o heap.. lembre-se que em array vc dar new.. entao ele é um objeto apesar de vc fazer isso
ele nao é um tipo primitivo.. ele armazena elementos de tipos primitivos... mais no fundo é um objeto...
Para o exame você souber diferenciar a existencia de uma variavel local e uma variavel de instancia tá de bom tamanho.. a parte teórica nao cai.. mais vc precisa saber para identificar os erros de compilação q tem muita questao desse tipo que nem compila. Ex.: Acessar uma variavel local, fora do seu escopo..
espero ter ajudado...
P.S.: O GUJ ta legal no novo layout e funcionalidades.. Parabéns! aos responsáveis :D