now the value of c cannot be changed there after. and determined at the time of compilation itself. so byte b=c; is same as byte b=1; and no problem.
but
byte m2(final char c2) {return c2;} the argument may be anything . even it may exceed the range of byte. and cannot be converted into byte implicitly. so compilation error.