【问题标题】:Which declarations are valid?哪些声明是有效的?
【发布时间】:2019-10-08 08:54:23
【问题描述】:

选择三个正确答案(有效声明)。

(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”

【问题讨论】:

  • Java 允许在源代码中使用 unicode 字符:stackoverflow.com/questions/4448180/…
  • 为什么 (c) 和 (d) 对您不起作用?你得到什么错误?
  • Java 将 \u0061 转换为字符 a,这使得 (c) 有效。由于它作为变量名是允许和可能的,所以在类型名中也是允许和可能的,所以ch\u0061r 就是char,这使得 (d) 也有效。
  • "not working for me" 不是很有帮助(例如 you 是否转换 Unicode 序列?)如果使用(标准)Java 编译器,这必须工作,是其中之一编译器必须执行的第一个操作。见:Java Language Specification 3.3. Unicode Escapes
  • 这是一个已知错误(15 年!):IDEABKL-89IDEA-65898

标签: java intellij-idea unicode ide scjp


【解决方案1】:

编译器可以识别 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. Identifiers

标识符是 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】:

    \u0061 表示a。您可以使用\u0061 代替a,因此:

    char \u0061 = 'a';
    

    一样
    char a = 'a';
    

    ch\u0061r a = 'a';
    

    一样
    char a = 'a';
    

    【讨论】:

      猜你喜欢
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多