Java 中的上下文关键字

13 2025年5月 | 阅读 3 分钟

上下文关键字以前称为受限标识符受限关键字。上下文关键字的识别取决于它们在语法语法中的位置。

这些是为代码提供特定含义的关键字。它们不像 abstract、new、final、try、import 等那样是保留关键字。

ASCII字符组成的字符序列被保留用作关键字,不能用作标识符。另外 12 个字符序列,也由 ASCII 字符组成,根据它们出现的上下文,可能被解释为关键字。

因此,保留关键字和上下文关键字是两回事。

保留关键字

Java 中有以下保留关键字:

abstractcontinuefornewswitch
assertdefaultifpackagesynchronized
booleandogotoprivatethis
breakdoubleimplementsprotectedthrow
byteelseimportpublicthrows
caseenuminstanceofreturntransient
catchextends intshorttry
charfinalinterfacestaticvoid
classfinallylongstrictfpvolatile
constfloatnativesuperwhile
_ (下划线)

上下文关键字

以下是 Java 中的上下文关键字:

  • exports opens to var
  • module provides transitive with
  • open requires uses yield

如果上下文关键字的任何部分可以与前面的或后面的字符组合形成一个不同的标记,那么匹配上下文关键字的字符序列就不会被视为关键字。

因此,字符序列openmodule被解释为单个标识符,而不是两个上下文关键字,即使它出现在ModuleDeclaration的开头。如果要使用两个关键字,它们必须用空格或注释分隔。

我们有意对实现如何消除歧义保持模糊。上述注释足以清楚地表明这是一个实现选择,而不是我们将明确指定的。尽管如此,随着语言的发展,设计者在某些上下文中引入新的上下文关键字时,需要小心其对实现的影响。

各种字符序列有时会被错误地认为是关键字。

  • truefalse不是关键字,而是布尔字面量
  • null不是关键字,而是null 字面量

名称的含义取决于其使用的上下文。确定名称含义需要三个步骤:

  • 首先,上下文使名称在语法上属于七个类别之一:ModuleName、PackageName、TypeName、ExpressionName、MethodName、PackageOrTypeName 或 AmbiguousName。
    TypeName 和 MethodName 的表达能力不如其他五类,因为它们分别由 TypeIdentifier 和 UnqualifiedMethodIdentifier 表示。
  • 其次,最初根据其上下文被归类为 AmbiguousName 或 PackageOrTypeName 的名称将被重新归类为 PackageName、TypeName 或 ExpressionName。
  • 第三,由此产生的类别将决定名称的最终含义(如果名称没有含义,则会导致编译时错误)。

上下文的使用有助于最大限度地减少不同种类实体之间的名称冲突。如果遵循 6.1 中描述的命名约定,则此类冲突将很少见。尽管如此,随着不同程序员或不同组织开发的类型的演变,可能会无意中出现冲突。例如,类型、方法和字段可能具有相同的名称。方法和具有相同名称的字段总是可以区分开的,因为使用的上下文总是会告诉我们是否打算使用方法。

仅在特定语言结构中充当关键字的标识符。与关键字的区别在于,上下文关键字可以在代码的其他部分用作标识符。某些上下文关键字(如partialwhere)在两个或多个上下文中具有特殊含义。