Отбрасывание с байта на символ сложнее, потому что байт является подписанным типом и charunsigned. Обычно можно преобразовать из одного интегрального типа в более широкий, сохранив числовое значение, но невозможно, чтобы представляло отрицательное байтовое значение как символ. Следовательно, преобразование из байта в charis не рассматривается как расширение примитивного преобразования [JLS 5.1.2], а расширение и сужение примитивного преобразования [JLS 5.1.4]: байт преобразуется в int и int в char.
Расширение знака выполняется, если тип исходного значения подписан; нулевое расширение, если оно является символом char, независимо от типа, к которому он относится .
Поскольку байт является подписанным типом, расширение знака возникает при преобразовании байтового значения -1 в символ. Полученный charvalue имеет все 16 бит, поэтому он равен 2 приращениям к мощности 16-1 или 65535. Листинг из charto int также является расширением примитива , поэтому правило говорит нам, что выполняется расширение нуля, а не расширение знака.
В результате значение int составляет 65535, что и печатается программой.
уже ответили подробно http://stackoverflow.com/questions/24635977/why-does-intcharbyte-2-produce-65534-in-java – Ramanlfc