from the JLS 4.12.4:
"We call a variable, of primitive type or type String, that is final and initialized with a compile-time constant expression (�15.28) a constant variable."
Note that if you leave off the initializer (= 1) you have a blank final, which is different.
final byte b = 1;
b is now a constant expression with a value known at compile time.
so, at 1 in the second example, it's exactly the same as putting "c = 1;"
at 4, you have a type mismatch error because of c.
but consider:
In this case, both c and b are known compile time constants.