Vc deve se lembrar que uma linha de programa se transforma geralmente em várias instruções em um nivel mais baixo, por exemplo a sua linha :
System.out.println(“b=false >” +(b=false));
ficaria assim em um assembly fictício :
1 mov b , false
2 mov tmp , new String
3 add tmp , b
4 push tmp
5 invoke System.out.println
( mistura de x86 com assembly de JVM heheh !! mas eh soh para dar um ideia )
veja que sua variável booleana ‘b’ foi carregada com ‘false’ antes de ser concatenada à String temporaria e a mesma passada como argumento ao metodo de impressão.
Isso por que vc envolveu com parenteses a expressão b = false, assim
o compilador sabe que deve resolver a mesma antes de mais nada.