Prioridad de los operadores de Java

Me he confundido debido a lo que es cierto con respecto a la prioridad del operador en Java. Hace mucho tiempo leí en los tutoriales que AND tiene una prioridad mayor que OR, lo que se confirma con las respuestas proporcionadas en la pregunta . Sin embargo, actualmente estoy estudiando Java utilizando la “Guía de estudio de Sun Certified Programmer for Java 6”. Este libro contiene el siguiente ejemplo:

int y = 5; int x = 2; if ((x > 3) && (y < 2) | doStuff()) { System.out.println("true"); } 

Estoy copiando y citando la explicación de cómo el comstackdor maneja el código anterior:

If (x > 3) es true , y ya sea (y < 2) o el resultado de doStuff() es true , imprima "true" . Debido al cortocircuito && , la expresión se evalúa como si hubiera paréntesis alrededor (y < 2) | doStuff() (y < 2) | doStuff() . En otras palabras, se evalúa como una sola expresión antes de && y una sola expresión después de && .

Esto implica sin embargo que | tiene mayor precedencia que && . ¿Es eso debido al uso del “O no-cortocircuito” y en lugar del cortocircuito O? ¿Lo que es verdad?

Eso es porque está usando el | operador en lugar de || , que tiene una mayor prioridad. Aquí está la mesa.

Usa el || operador en su lugar y va a hacer lo que piensas.

Debido al cortocircuito &&, la expresión se evalúa como si hubiera paréntesis alrededor (y <2) | hacer cosas() ...

Esta statement es incorrecta, de hecho sin sentido. El hecho de que && sea un operador de cortocircuito no tiene nada que ver con la evaluación de (y <2) | doStuff (), y de hecho, eso solo podría compilarse si doStuff () devolviera un booleano. Lo que marca la diferencia (los paréntesis implícitos) es la precedencia de && relativa a |, que se define en JLS ## 15.22-23 como && siendo menor.