1. 概述

当我们需要在代码中添加额外注释时,它们可以很有用。它们可以帮助我们更好地理解代码,特别是在执行复杂操作的方法中。

在这篇教程中,我们将探讨代码中可执行注释的情况,或者至少看起来像是可以执行的。

2. 注释

在深入之前,让我们回顾一下Java中的注释。它们是Java语法的一部分,有两种基本格式:

  • 单行注释
  • 多行注释

单行注释的文本从“//”字符到行尾表示:

// This is a single-line comment.

此外,多行注释(也称为多行注释)以“/”开始,以“/”结束,之间的内容被视为注释:

/* This is a
 * multiline
 * comment.
 */

3. 注释与Unicode

现在,我们从一个例子开始。以下代码会在标准输出中打印“Baeldung”:

// \u000d System.out.println("Baeldung");

由于行以“//”开头,这代表单行注释的开始,我们可能会认为“*System.out.println(“Baeldung”);*”语句也是注释的一部分。

然而,这并不准确。重要的是要了解Java并不允许注释执行

考虑到这一点,让我们详细分析这个例子,看看为什么代码会在控制台打印“Baeldung”。

3.1. Unicode转义序列

代码示例之所以不被视为注释,是因为我们在其前面使用了“\u000d”的Unicode转义序列。

所有Java程序都使用ASCII编码,但由于非拉丁字符,我们不能仅用ASCII代码表示。因此,Java允许在注释、标识符、关键字、字面值和分隔符中使用Unicode

为了在代码中使用所有非ASCII字符,我们需要通过Unicode转义序列嵌入它们。这些转义序列以反斜杠(“\”)开始,后面跟着字母“u”,然后是特定字符的四位十六进制代码。

遵循这一约定,换行符(CR)变为“\u000d”。

此外,Unicode转义序列会根据Java语言规范定义的词法转换进行编码。

接下来,让我们仔细看看Java如何进行词法转换。

3.2. 词法转换

在执行词法转换时,Unicode编码优先于其他任何编码,即使它在注释中也是如此。换句话说,Java首先会将所有Unicode转义序列编码,然后再进行其他转换。

简单来说,在转换过程中,Unicode转义被翻译成Unicode字符,然后上一步的结果再被翻译成ASCII码。

作为副作用,如果我们把无效的Unicode转义放在注释中,代码将无法编译。Java将任何以“\u”开头的内容视为Unicode转义。

得益于这种转换,我们可以使用Unicode转义序列来仅使用ASCII字符包含任何Unicode字符。这样,基于ASCII的程序和工具仍然可以处理使用Unicode编写的代码。

回到我们的例子。我们使用了Unicode转义序列“\u000d”,它代表换行符。

当编译我们的代码时,词法转换首先发生。因此,“\u000d”会被翻译成换行符。由于单行注释的结束是在行尾,所以注释后的代码将不再属于注释。

由于转换,我们的代码将出现在新的一行:

//
System.out.println("Baeldung");

3.3. Unicode与IDE

如今,我们经常使用IDE作为开发工具,并依赖它来检查代码中的可疑之处。然而,对于IDE和Unicode字符,取决于我们使用的IDE,它可能显示代码的方式不正确。它可能无法正确解析Unicode转义序列,从而导致代码高亮显示错误。

由于我们可以使用Unicode转义序列代替ASCII字符,这并没有阻止我们在代码的其他部分使用Unicode转义:

\u002f\u002f This is a comment
\u0053ystem.out.println("Baeldung");

在这里,我们用Unicode转义替换“//”和字母“S”。代码仍然会在控制台打印“Baeldung”。

4. 总结

在这篇教程中,我们学习了注释和Unicode转义序列是如何协同工作的。

总结起来,Java不允许执行注释。在代码中使用Unicode转义时,Java会在其他任何转换之前将它们转换为ASCII。

能够书写Unicode字符在我们需要在程序中使用无法用其他方式表示的非拉丁字符时很有用。虽然完全用Unicode转义编写整个代码库是合法的,但我们应该避免这样做,只在必要时使用。