01 /** A construção de um método recursivo em partes.
02 Parte 1: um método que "invoca a si mesmo".
03 O que acontece quando o programa abaixo é
04 executado?
05
06 A invocação e o retorno de métodos é implementada
07 na máquina virtual Java (JVM) com a ajuda da pilha de
08 execução. Nela são armazenados o endereço de retorno
09 e os parâmetros (cabe refletir sobre o tipo dos
10 parâmetros e conectar os conceitos).
11 Note que em java, quando executamos a JVM esta, sem
12 nossa intervenção direta, invoca o método main do
13 arquivo .class que passamos como argumento de linha de
14 comando.
15
16 Na execução de qualquer método (no exemplo usaremos
17 main), quando INVOCAMOS um método (que pode ser outro
18 ou pode ser o mesmo), antes de executar o código que
19 você escreveu, são escritos na pilha o endereço de memória
20 do próximo comando no método "invocador" (main), a que
21 chamamos endereço de retorno, e copiados
22 os valores que devem ser armazenados nos parâmetros. Então
23 passa-se a executar o método invocado.
24
25 Ainda antes de executar o código que você escreveu,
26 os parâmetros (mais precisamente as
27 variáveis locais ao método que têm os identificadores
28 que correspondem aos parâmetros no código-fonte)
29 são alocados e os
30 valores desempilhados e armazenados nessas variáveis.
31
32 Note que na pilha restou somente o endereço de retorno.
33 O código que você escreveu passa a ser executado e
34 quando atingir um return ou o fim do método, o endereço
35 de retorno é desempilhado e usado para voltar a executar
36 o método "invocador".
37
38 O que também é importante observar é que se invocamos
39 métodos que não "retornam", os endereços de retorno
40 acumulam na pilha de execução e esta tem tamanho
41 limitado. Quando ultrapassa-se esse limite ocorre um
42 "transbordamento de pilha" (chamado também estouro de
43 pilha), em inglês: stack overflow. Que é a exceção
44 informada na execução do programa abaixo.
45
46 */
47
48 public class MyClass {
49 public void soma () {
50 System.out.println ("somei");
51 soma();
52 }
53 public static void main(String args[]) {
54 MyClass m = new MyClass();
55 m.soma();
56 }
57 }
|
Nenhum comentário:
Postar um comentário