Тип char в Java ведет себя несколько странно? - PullRequest
3 голосов
/ 04 ноября 2011

Давайте рассмотрим следующие простые выражения в Java.

char c='A';
int i=c+1;

System.out.println("i = "+i);

Это совершенно верно в Java и возвращает 66 , соответствующее значение символа (Unicode) для c + 1,


String temp="";
temp+=c;
System.out.println("temp = "+temp);

Это слишком допустимо в Java, и переменная типа String temp автоматически принимает c типа char и выдает temp = A на консоли.


Все следующие операторы также удивительно действительны в Java!

Integer intType=new Integer(c);
System.out.println("temp = "+intType);

Double  doubleType=new Double(c);
System.out.println("temp = "+doubleType);

Float floatType=new Float(c);
System.out.println("temp = "+floatType);

BigDecimal decimalType=new BigDecimal(c);
System.out.println("temp = "+decimalType);

Несмотря на то, что c является типом char, он может быть предоставлен без ошибок в соответствующих конструкторах иВсе вышеперечисленные утверждения считаются действительными.Они выдают следующие выходные данные соответственно.

temp = 65
temp = 65.0
temp = 65.0
temp = 65

В таком случае, каково внутреннее поведение типа char , доступного в Java?

Ответы [ 3 ]

8 голосов
/ 04 ноября 2011

Char - это примитивный числовой целочисленный тип, и как таковой подчиняется всем правилам этих зверей, включая преобразования и повышение по службе.Вы можете прочитать об этом, и JLS является одним из лучших источников для этого: Конверсии и рекламные акции .В частности, прочитайте краткий бит «5.1.2 Расширяющее примитивное преобразование».

0 голосов
/ 04 ноября 2011

Примитивы char и byte являются взаимозаменяемыми (что относится к значениям таблицы Unicode) - так что да, переменные char могут рассматриваться как числа, так же, как byte.

Edit: В дополнение к комментарию Henery ниже, вы, конечно, правы, Java использует unicode для представления содержимого символов (оригинальный текст обновлен, чтобы отразить это) - но, как мы знаем, первые 127 символов ASCII и Unicode более или менее соответствуюти поэтому любые манипуляции, выполняемые в диапазоне символов 0..127, будут одинаковыми как для ASCII, так и для Юникода, а это означает, что преобразование между ними тривиально.

Старожилы срединас, вероятно, учили и помнят большую часть таблицы ASCII, а не таблицы Unicode, и, действительно, я все еще держу лист с кроваткой ASCII на своем столе для быстрого реферала.Да, и +1 за комментарий Хенери, за то, что он заставил меня уточнить, что я написал.

0 голосов
/ 04 ноября 2011

char - это что-то вроде 16-битного int. Вы можете объединять целые числа в Strings. Это сокращение для Character.toString (c).

Вы можете использовать объект Персонажа, если хотите избежать такой путаницы.

...