The difference is that there is an implicit casting in the ++ operator from int to byte, whereas, you would have to do that explicitly in case if you use b = b + 1
b = b + 1; // Will not compile. Cannot cast from int to byte
You need an explicit cast:
b = (byte) (b + 1);
Whereas b++ will work fine. The ++ operator automatically casts the value b + 1, which is an int to a byte.
This is clearly listed in JLS - §15.26.2 Compound Assignment Operators : -
A compound assignment expression of the form E1 op= E2 is equivalent
to E1 = (T) ((E1) op (E2)), where T is the type of E1, except that E1
is evaluated only once
Please note that operation b + 1 will give you a result of type int. So, that's why you need an explicit cast in your second assignment.