Fala aí Adauto tudo bem?
Então vamos entender o que acontece nesse código,
No método main instanciamos a classe E
e chama-mos o método X
passando o valor 32
.
Ao executar esse código o compilador vai verificar se na classe E
existe um método X
como na classe E
não existe esse método ele irá procurar super
classe de E
. Que nesse caso é a classe D
. (Então na classe E
não faz absolutamente nada.)
A classe D
sobre escreve o método X
mas na sua implementação ele somente chama o método X
da sua super classe (super.x(i)
). Que nesse caso é a classe C
.
( Ou seja a classe D
também não faz nada só repassa a responsabilidade.)
A classe C
por sua vez também sobre escreve o método X
e a sua implementação ela imprime no console a string b
, e delega para a sua super classe a chamada do método X
( super.x(i)
). Nesse caso a super classe da classe C
é a classe B
. ( A classe C imprime no console a letra 'b' e repassa sua responsabilidade para sua super classe.)
A classe B
tem o método X
e na implementação ele faz o seguinte:
if( ++i < 0 ) return;
x(-1);
System.out.println("c");
quando chega nesse momento o que ocorre é o seguinte,
no if
ele incrementa a variavel i
e verifica se o valor após o incremento é menor que zero.
Como passamos o valor 32
no momento do if
será incrementado par 33
e verificado se esse resultado é menor que 0, como nesse caso não é ele passa para a próxima instrução. Que é x(-1)
quando o compilador chega nesse ponto ele irá executar o método X
da classe que instanciamos, que no caso é a classe E
e aí vai repetir todo o processo passando por todas as super classes até chegar na classe B
novamente.
Quando chegar na classe B
pela segunda vez o valor de i
vai estar valendo -1
, ao passar pelo if
novamente vai ser incrementado e o valor de i
vai passar a ser 0
se verificado novamente se 0 é menor que 0 e como não é vai chamar novamente X
passando o valor -1
. E com isso entra em loop infinito e nunca imprime a string c
.
Cada chamada ao método X
(inclusive cada vez que é repassado a responsabilidade para classe superior) é adicionado à pilha de execução em algum momento ela ultrapassa o limite dessa pilha e gera o erro StackOverflowError
.
Se útil marque como solucionado. ;)