ehn,... in case you are still confused, I suggest you go and study the K&B book for
SCJP 1.4, there is very good explanation of how byte, char, short, int, long, float, double are constructed, then you will understand how "implicit" casting during assignement is permitted.
Basically, it depends on number of bits every data type is holding. In your example, byte is 8-bit, data range is -127 ~ 128, so 1 (literally a int value) is within the range, so it can be assigned to byte type.
Your float question can be answered in the book too, 1.0 (literrally a double value) should be a double type, so if you want to assign it to a float type,
you should add "f" or "F" at the end of the value. --> 1.0f
If you want to be more amused, int 1 can be assigned to byte variable only like what you've written, if you try this:
int i = 1;
byte b = i; //compile error
In this case you should cast explicitly. byte b = (int) i;
regards,