java标识符可使用字母(含unicode如中文)、下划线_、美元符$开头,后接字母、数字、_或$;不可用数字、空格、-、#、.、@、%等开头或中间;false、true、null为字面量,class等为关键字,均不可作标识符;大小写敏感;$和中文语法允许但工程不推荐。

Java标识符哪些字符能用、哪些绝对不能用
Java标识符必须以字母(a–z/A–Z,也支持中文、日文等Unicode字母)、下划线_或美元符$开头;后续字符可以是字母、数字0–9、_或$。数字不能开头,空格、连字符-、井号#、点号.、@、%等一律不合法。
常见错误现象:123abc(编译报错:illegal start of expression)、my-class(-不是允许字符)、hello world(含空格,直接语法错误)。
-
false、true、null看起来像普通单词,但它们是字面量(literal),属于语法保留项,不能当标识符用 -
class、public、static是关键字,哪怕加了下划线如class_name也合法(因为不是“等于”关键字),但class单独出现就非法 - 大小写敏感——
Count和count是两个完全不同的标识符,别以为只是风格差异,它们在JVM里就是不同符号
为什么int能当变量名的一部分,但不能单独用
因为Java只禁止「完全匹配」关键字或字面量的标识符,不禁止包含它们。所以 intValue、myInt 都合法,但 int 本身是关键字,单独作变量名会触发编译器拒绝。
使用场景:你在写工具类时可能想命名 stringToInt 或 intArray,没问题;但若图省事写 int i = 5; 里的 i 换成 int = 5;,就会报 error: not a statement。
立即学习“Java免费学习笔记(深入)”;
- 关键字检查发生在词法分析阶段,是全字匹配,不看上下文
-
goto和const虽未被使用,但仍是保留字,也不能用 - IDE(如IntelliJ)通常会高亮标出非法标识符,但别依赖它——有些拼写接近关键字的(如
defualt)不会报错,却容易引发逻辑混淆
包名、类名、变量名怎么起才不算“瞎起”
命名规则是底线,命名规范才是团队协作的实际门槛。不遵守规范不一定报错,但会让别人读你代码时多花三倍时间理解意图。
实操建议:
- 包名全小写,用点分隔:
com.example.utils(不是Com.Example.Utils,也不是comExampleUtils) - 类名/接口名用大驼峰:
HttpClientFactory(不是httpclientfactory或HTTPClientFactory) - 变量和方法名用小驼峰:
userName、calculateTotalPrice()(避免username或CalculateTotalPrice) - 常量全大写+下划线:
MAX_RETRY_COUNT(注意不是maxRetryCount,后者是普通变量风格)
容易踩的坑:有人把常量写成 private static final int MAX_RETRY = 3; ——看着没问题,但一旦项目接入Checkstyle或SonarQube,就会标红提醒:常量名应全大写并用下划线分隔。
用$和中文起名到底行不行
语法上允许,但工程中基本等于自找麻烦。
$ 在Java里主要由编译器自动生成(比如内部类编译后变成 Outer$Inner.class),人工用它命名(如 user$cache)会让其他开发者本能怀疑这是生成代码或反编译残留。
中文作为标识符虽被JVM支持(JLS明确允许Unicode字母),但存在实际风险:
- 部分老旧构建工具(如某些Ant配置、旧版Gradle插件)可能无法正确处理含中文的类路径
- Git diff 或代码审查工具偶尔对UTF-8边界处理异常,导致显示乱码或合并冲突误判
- 团队里有非中文母语成员时,可读性和搜索效率断崖下降(比如搜
用户名还是userName?)
真正需要表达含义时,宁可用英文组合:adminLoginToken 比 管理员登录令牌 更可靠——不是因为英文高级,而是因为它在所有环节都稳。











