2016-01-22 3 views

ответ

0

a.charAt(0) является характер, поэтому он знает, что нужно напечатать a в первой строке.

Во второй строке индекс всегда является числом, поэтому Java автоматически преобразует значение char в его числовую копию.

Это не безопасное преобразование, поскольку конкретное числовое значение a может отличаться в зависимости от вашей кодировки.

+0

Спасибо. Это помогло. Да, это будет отличаться для Unicode и ASCII. – Raj

2

char преобразуется в int с использованием расширяющего преобразования. Это описано в this section about unary numeric promotion из спецификации языка Java, а именно:

В противном случае, если операнд имеет компиляции типа byte, short или char, это способствует к значению типа int по расширяющему примитивному преобразования (§5.1.2).

+0

Спасибо. Это помогло – Raj

1

Java автоматически отбрасывает char к int, когда ИНТ будет использоваться.

Это вполне допустимо Java код:

public static void main(String[] args) { 
    int field1 = 'a'; 
    System.out.println(field1); 
} 
+0

Спасибо. Это помогло. – Raj

0

Существует overload of println that specifically takes a char. Это обрабатывает char s отдельно; без этой перегрузки, все равно будет оставаться перегрузка int, char будет повышаться до int, а перегрузка int будет печатать 97, что является кодовой точкой Юникода (строки ASCII для английских букв, цифр и общей пунктуации).

Однако в контексте индекса массива оно продвигается до int за JLS Section 15.10.3, "Array Access Expressions".

Условное выражение подвергается унарной цифровой рекламе (§5.6.1). Повышенный тип должен быть int или возникает ошибка времени компиляции.

Унарное числовое расширение что способствует char к int, так что он получает доступ b[97].

Это, как правило, лучше, чтобы избежать этого неявного расширения в char к int, чтобы избежать чего-то неожиданного, такого как доступа к b[97].

+0

Спасибо. Это помогло. Я полагаю, что явное литье типов лучше и проще следовать. – Raj

+0

Как вы можете задать вопрос по своему усмотрению, вы можете [принять ровно один ответ] (http://stackoverflow.com/help/someone-answers), который, по вашему мнению, помогает ты лучший. – rgettman

0

Это выведено компилятором. A char может использоваться вместо int. Контекст использования определяет, какой из них используется - эти типы предпочтительны, если есть двусмысленность. Однако, если бы только другой тип работал в контексте (b['a'], очевидно, был бы недопустимым, если бы не преобразование), этот тип выводится.

0

Для следующих:

System.out.println(a.charAt(0)); 

Java вызывает метод PrintStream.println(char x) поскольку вы передаете характер. Так что проблем нет.

Но следующее:

System.out.println(b[a.charAt(0)]); 

Еще раз a.charAt(0) возвращает символ «а», но на этот раз, так как вы пытаетесь получить элемент массива, он преобразует символ в int, так как вам нужен int для доступа к элементу массива.

+0

Спасибо. Это помогло. – Raj

Смежные вопросы