This is the java operator precedence (Operators at the same level have the same priority).
HIGHEST
---------------------------------------------------------------------
++(postfix) | --(postfix) | | | |
++(prefix) | --(prefix) | ~ | ! |+(unary) | -(unary)
* | / | % | | |
+ | - | | | |
>> | >>> | << | | |
> | >= | < | <= | instanceof|
== | != | | | |
& | | | | |
^ | | | | |
| | | | | |
&& | | | | |
|| | | | | |
?: | | | | |
-> | | | | |
= | op= | | | |
---------------------------------------------------------------------
LOWEST
Parentheses raise the precedence of the operations that are inside them. And then the expression is evaluated from left to right.
So here are the steps for your case:
1. (b1 && b2) (let's say the result is res)
2. res || b3
Let's say:
I:
b1, b2 and b3 = true
1. (true && true) = true
2. true || true = true
3. if(true)
II:
b1=false, b2=true, b3=true
1. (false && true) = false
2. if(false)
Since this result is false, the evaluation is shortcuited here.
III:
b1=true, b2=true, b3=false
1. (true && true) = true
2. true || false = true
3. if(true)