Leandro,
O return
realmente para a execução do método B.x(-1)
. A vez que imprime "c" é a primeira chamada!
Vamos simular a execução:
```
A.main():
....executa new E()
........chama E.x(32)
........E.x(32):
............repassa para D.x(32)
............D.x(32):
................chama super.x(32), ou seja, C.x(32)
................C.x(32):
....................imprime "b"
....................chama super.x(32), ou seja, B.x(32)
....................B.x(32):
........................32 > 0 (continua)
........................chama this.x(-1), ou seja, D.x(-1)
........................D.x(-1):
............................chama super.x(-1), ou seja, C.x(-1)
............................C.x(-1):
................................imprime "b"
................................chama super.x(-1), ou seja, B.x(-1)
................................B.x(-1):
....................................-1 < 0 (retorna)
................................termina B.x(-1)
............................termina C.x(-1)
........................termina D.x(-1)
........................imprime "c"
....................termina B.x(32)
................termina C.x(32)
............termina D.x(32)
........termina E.x(32)
termina A#main
```