byte right =0xf; // 00001111
System.out.println(Integer.toBinaryString(right)); // 00001111
right = (byte)(right << 4);
System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000
why right is equal to 11111111111111111111111111110000? I explicitly cast it to byte = 8 bits.
I'm excpecting for an output: 11110000.

If you hadn't cast to byte, all would be well.
There are no shift operators defined for byte, so the value is first promoted to int - which is fine, and still 0000[...]1111.
You then shift left 4 bits, giving 0000[...]111000.
You then cast to byte, giving a byte of 11110000.
You then call Integer.toBinaryString, which takes an int parameter. That means the byte 1111000 is convert to int - at which point it's sign-extended to 11111111111111111111111111110000 (as per JLS 5.1.2), which is then printed.
Options:
byte, so you don't end up with a conversion back to int. (e.g. use int shifted = right << 4; and then pass shifted into Integer.toBinaryString.) right & 0xff to apply a bit-mask so you can only have the bottom 8 bits set.Either of those prints 11110000 instead.
See more on this question at Stackoverflow