Apesar de parecer estranho, tenho que concordar com a explicação…
In an array access, the expression to the left of the brackets appears to be fully evaluated
before any part of the expression within the brackets is evaluated.
expression a[(a=b)[3]], the expression a is fully evaluated before the expression (a=b)[3];
this means that the original value of a is fetched and remembered while the expression
(a=b)[3] is evaluated. This array referenced by the original value of a is then subscripted by
a value that is element 3 of another array (possibly the same array) that was referenced by
b and is now also referenced by a. So, it's actually a[0] = 1.
Note that, if evaluation of the expression to the left of the brackets completes abruptly, no
part of the expression within the brackets will appear to have been evaluated.
Na execução do println, ele recupera o objeto A (referência) e só então vai executar as istruçõe de dentro do Array a[].
Imagine que a linha diga isso ao compilador:
Escreva na Tela algum valor que está no Objeto que a variável “a” referencia. Mas a posição que deve ser exibida é a posição “3”. Mas antes disso ainda mude a referência da variável “a” para “b”.
Antes da variável “a” mudar a referência para “b”, a referência do objeto “a” já foi passada para o println que é daí que o cara pega os valores…