Какие декларации действительны? - PullRequest
5 голосов
/ 08 октября 2019

Выберите три правильных ответа (действительные декларации).

(a) char a = '\u0061';

(b) char 'a' = 'a';

(c) char \u0061 = 'a';

(d) ch\u0061r a = 'a';

(e) ch'a'r a = 'a';

Ответ : (a), (c) и (d)

Книга:

Руководство программиста по сертификации Java SCJP (третье издание)

Может кто-нибудь объяснить, пожалуйста, причину выбора(c) и (d), когда IDE ( IntelliJ IDEA ) показывает его красным, говоря:

Невозможно разрешить символ 'u0063'

As shown in IntelliJ IDEA

Ответы [ 2 ]

4 голосов
/ 08 октября 2019

Компилятор может распознавать экранирование Unicode и переводить их в UTF-16. ch\u0061r станет char, что является допустимым типом примитива. Это делает правильный вариант D.

3.3. Unicode Escapes

Компилятор для языка программирования Java («Java-компилятор») сначала распознает экранирование Unicode на своем входе, переводя символы ASCII \ u, за которыми следуют четыре шестнадцатеричных цифры, в кодовую единицу UTF-16(§3.1) для указанного шестнадцатеричного значения и передачи всех остальных символов без изменений.

\u0061 будет преобразовано в a, которая является допустимой буквой Java, которую можно использовать для формирования идентификатора,Это делает правильный вариант C.

3.8. Идентификаторы

Идентификатор представляет собой последовательность букв Java и цифр Java неограниченной длины, первая из которых должна быть буквой Java.

Identifier:
    IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
    JavaLetter {JavaLetterOrDigit}
JavaLetter:
    any Unicode character that is a "Java letter"
JavaLetterOrDigit:
    any Unicode character that is a "Java letter-or-digit"

«Буква Java» - этосимвол, для которого метод Character.isJavaIdentifierStart(int) возвращает true.

"Буква или цифра Java" - это символ, для которого метод Character.isJavaIdentifierPart(int) возвращает true.

«Java-буквы» включают прописные и строчные латинские буквы ASCII AZ (\u0041-\u005a) и az (\u0061-\u007a), а по историческим причинам - знак доллара ASCII ($ или \u0024) и подчеркивание (_ или \u005f). Знак доллара следует использовать только в механически сгенерированном исходном коде или редко для доступа к ранее существующим именам в устаревших системах. Подчеркивание может использоваться в идентификаторах, состоящих из двух или более символов, но его нельзя использовать в качестве односимвольного идентификатора, поскольку оно является ключевым словом.

2 голосов
/ 08 октября 2019

\u0061 означает a. Вы можете использовать \u0061 вместо a, поэтому:

char \u0061 = 'a';

совпадает с

char a = 'a';

, а

ch\u0061r a = 'a';

совпадает с

char a = 'a';
...