A d = new A().aob = new A();
В Java оператор присваивания является ассоциативным справа, т. Е. Он оценивается справа налево. Но они также входят в группу операторов с наименьшим приоритетом.
Итак, второй новый оператор (справа от второго равенства) вычисляется первым, и мы получаем новый объект A; скажем, ' a '. Теперь у нас есть:
new A().aob = a;
Хитрость в том, чтобы распознать приоритет оператора. Посмотрите здесь: http://pages.cs.wisc.edu/~willb/cs302/spring-07/java-operator-precedence.pdf
Оператор 'new' и символ '.' Операторы вызова метода имеют тот же приоритет, но их ассоциативное качество меняется на обратное: «новый» является правоассоциативным, а «.» является левоассоциативным.
Таким образом, компилятор сначала применяет новый оператор к «правому операнду», который здесь «A ()» (до того, как следующий операнд вступит в действие). Давайте назовем новый объект b ; и имеем:
A d = b.aob = a;
Теперь компилятору нужно применить '.' оператор первый (так как «.» имеет более высокий приоритет, чем оператор «=»). Давайте назовем объект, на который ссылается b.aob, c :
A d = c = a;
Наконец, все, что осталось, это операторы присваивания, и они ассоциативны справа (оцениваются справа налево). Итак, a назначается сначала c (b.aob), а затем c назначается d .