Точнее, x | = y фактически вычисляется как x = x | (У).
Вот интересный пример того, почему это важно.
int c = 2;
c %= c++ * ++c;
Интересным следствием здесь является то, что это будет записано как
c = c % (c++ * ++c);
Спецификации Java говорят нам, что JVM сначала увидит исходный c и сохранит его, все, что предшествует ему, не окажет на него никакого влияния, поэтому c ++ & ++ c фактически не повлияет на результат вычисления. Это всегда будет с = 2%, что равно 2:)