Результат двоичной операции преобразуется в тип левой переменной ... и результат преобразования сохраняется в переменной.
Например:
charx=1, y = 2; x = x + y; // compile error: "possible loss of precision (found int, required char)" x = (char)(x + y); // explicit cast back to char; OK x += y; // compound operation-assignment; also OK
Один из способов узнать тип результата, в общем, это привести его к объекту и спросить, к какому классу он относится:
System.out.println(((Object)('a' + 'b')).getClass()); // outputs: class java.lang.Integer
Если вас интересует производительность, обратите внимание, что в байт-коде Java даже нет специальных инструкций для арифметики с меньшими типами данных. Например, для добавления есть инструкции iadd (для целых чисел), ladd (для длинных значений), fadd (для плавающих значений), dadd (для двойных значений), и это все. Для имитации x += y с меньшими типами компилятор будет использовать iadd, а затем обнулить верхние байты int с помощью инструкции типа i2c ("int to char"). Если в собственном процессоре есть специальные инструкции для 1-байтовых или 2-байтовых данных, виртуальная машина Java должна оптимизировать их во время выполнения.
Если вы хотите объединить символы в виде строки, а не интерпретировать их как числовой тип, есть много способов сделать это. Проще всего добавить пустую строку к выражению, потому что добавление символа и строки приводит к получению строки. Все эти выражения приводят к строке "ab":
'a' + "" + 'b'
"" + 'a' + 'b' (это работает, потому что "" + 'a' вычисляется первым; если бы "" было в конце, вместо этого вы получили бы "195")
new String(new char[] { 'a', 'b' })
new StringBuilder().append('a').append('b').toString()
String.format("%c%c", 'a', 'b')
Ответ 2
Двоичные арифметические операции над char и byte (и short) продвигаются к int -- JLS 5.6.2.
Ответ 3
Возможно, вы захотите изучить следующие выражения о char.
char c='A'; int i=c+1;
System.out.println("i = "+i);
Это совершенно допустимо в Java и возвращает 66 соответствующее значение символа (Unicode) из c+1.
Long longType=newLong(c); System.out.println("longType = "+longType);
Хотя c это тип char, он может быть предоставлен без ошибок в соответствующих конструкторах, и все приведенные выше инструкции обрабатываются как допустимые инструкции. Они выдают следующие выходные данные соответственно.
char является примитивным числовым целочисленным типом и как таковой подчиняется всем правилам этих чудовищ, включая преобразования и рекламные акции. Вы захотите прочитать об этом, и JLS - один из лучших источников для этого: Конверсии и рекламные акции. В частности, прочитайте короткий фрагмент "5.1.2 Расширяющее преобразование примитивов".
Ответ 4
Компилятор Java может интерпретировать его как любой из них.
Проверьте это, написав программу и поискав ошибки компилятора: