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 Xpassando 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. ;)