在Java中,关键字和保留字是两类具有特殊意义的标识符,它们被语言本身占用,不能作为变量名、方法名、类名等自定义标识符使用。理解它们的区别与用途,是掌握Java语法的第一步。
查看官网关键字和保留字:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html
1. 关键字(Keyword)
关键字是Java语言预定义的、具有特定语法功能的单词。它们全部为小写,编译器能够识别并赋予它们特殊含义。
Java关键字列表(按功能分类)
| 分类 | 关键字 | 说明 |
|---|---|---|
| 数据类型 | byte, short, int, long, float, double, char, boolean | 基本数据类型 |
| 引用类型 | class, interface, enum, record(Java 14+) | 定义类、接口、枚举、记录 |
| 流程控制 | if, else, switch, case, default, while, do, for, break, continue, return | 条件、循环、跳转 |
| 异常处理 | try, catch, finally, throw, throws | 异常捕获与声明 |
| 访问控制 | private, protected, public | 可见性修饰符 |
| 修饰符 | abstract, static, final, strictfp, native, synchronized, transient, volatile | 类、方法、变量修饰 |
| 类/实例相关 | new, this, super, instanceof | 对象创建、引用、类型检查 |
| 包相关 | package, import | 包管理与导入 |
| 断言 | assert | 断言调试(Java 1.4+) |
| 模块系统 | module, requires, exports, opens, uses, provides, with(Java 9+) | 模块化系统关键字 |
| 其他 | void, null(字面量),true, false(布尔字面量) | 特殊值占位 |
注意:
关键字一共50个。true,false,null不在其中,它们看起来像关键字,其实是字面量,表示特殊的布尔值和空值,但同样不能用作标识符。
字面量(Literal) 是直接在代码中表示固定值的符号。它们是程序中直接写出的数据,不需要通过变量或计算来获取。字面量直接对应某种数据类型的值,是程序中表示数据的“字面形式”。
2. 保留字(Reserved Word)
保留字是指当前Java版本尚未使用,但未来版本可能用作关键字的单词。目前Java中有两个保留字:
goto:在C/C++中用于无条件跳转,Java虽未实现,但保留以备将来使用。
const:在C/C++中定义常量,Java中使用final代替,但const仍被保留。
重要: 虽然
goto和const目前没有实际语法意义,但程序员仍不能将它们用作标识符,否则编译会报错。
3. 关键字的演变
随着Java版本的演进,陆续新增了一些关键字:
| 版本 | 新增关键字 |
|---|---|
| Java 1.2 | strictfp |
| Java 1.4 | assert |
| Java 5 | enum |
| Java 9 | module, requires, exports, opens, uses, provides, with, transitive |
| Java 14 | record(预览,Java 16正式) |
| Java 15 | sealed, permits(预览,Java 17正式) |
| Java 17 | sealed, permits(正式) |
注意:
record、sealed、permits等虽然在新版本中成为关键字,但在旧版本中可能允许用作标识符。为保持代码的向前兼容性,应避免使用这些潜在的关键字作为标识符。
4. 关键字与保留字的使用规则
-
绝对不能用作标识符:任何关键字、保留字、true、false、null都不能作为变量名、方法名、类名、包名等。
-
严格区分大小写:所有关键字均为小写,Public或CLASS都不是关键字,但为避免混淆,不应使用此类命名。
-
标识符命名规范:虽然允许使用$和_,但官方推荐使用字母、数字、下划线的组合,且以字母开头,避免与关键字混淆。
5. 常见误区
-
const和goto并不是“没用”:它们是保留字,不允许使用,即使你写int const = 10;也会编译失败。 -
true、false、null虽然可以出现在代码中,但不能被重定义,例如不能写String null = "abc";。 -
新版本关键字在旧版JDK中可能不是关键字,但为了跨版本兼容,建议始终避开这些名称。