Java 基础第二章:标识符和变量,新手最容易翻车的 8 个瞬间
Java 基础第二章:标识符和变量,新手最容易翻车的 8 个瞬间
写在前面
上一篇我们历经九九八十一难,终于把 JDK 装好、环境变量配通,敲出了人生第一个 Hello, Java!。
然后我就膨胀了。心想:写代码不过如此嘛。
直到翻开教材第二章"标识符与变量",我发现自己连"起名字"都不会。报错一条接一条,红得刺眼,每一行都像在嘲笑我。
这篇就把我在标识符和变量上摔过的跟头都记下来,给后来的新手当个避坑指南。
坑 1:名字以数字开头
写变量的第一反应:变量嘛,随便起。于是:
int 1num = 5; // 报错!
编译器:"Syntax error on token '1num', delete this token"
规则很简单:标识符只能以字母、下划线 _、美元符 $ 开头,数字不能开头。
顺便记全这条规则:
- 只能由字母、数字、
_、$组成; - 不能以数字开头;
- 不能是 Java 关键字(
class、public、int这些); - 大小写敏感(
Name和name是两个不同的东西); - 不能用空格和其他乱七八糟的符号。
坑 2:拿关键字当变量名
知道了不能数字开头之后,我又开始放飞:
int class = 1; // 报错!
int public = 2; // 报错!
关键字是 Java 语言自己保留的词,你起什么名字都不能跟它重名。
常见的关键字有:class、public、static、void、int、double、if、else、for、while、return、new、true、false、null……
记不全没关系,报错的时候编译器会告诉你。重点是养成习惯:命名时避开这些词,比如想表达"班级",别用 class,用 className。
坑 3:名字里带空格
这个坑属于"看着就像错的但还是手滑了":
int my num = 5; // 报错!
标识符是一个整体,里面不能有空格。想让名字分两段,用驼峰:myNum。
坑 4:大小写搞混
int Name = 5;
System.out.println(name); // 报错!找不到变量 name
Java 是严格区分大小写的。Name、name、NAME 是三个完全不同的变量。
新手最容易犯:声明的时候写的是 userName,用的时候敲成了 username,然后盯着报错看了十分钟。
应对方法:变量名统一用小驼峰(
myName、userAge),声明和使用时复制粘贴,不要手敲。
坑 5:用中文起名(能跑,但别这么做)
有段时间我觉得英文变量名太费脑子,直接上中文:
int 年龄 = 18;
System.out.println(年龄);
你猜怎么着?能编译,能运行。 Java 的标识符是支持 Unicode 的,中文完全合法。
但为什么不建议?想想这些场景:
- 团队协作时别人看着别扭;
- 编码格式一乱就是乱码;
- 面试官看到会直接扣印象分;
- 网上搜资料都对不上。
练习阶段偶尔写着玩可以,正式代码还是老老实实用英文。 怕英文不好?就那几个词:age、name、count、price,够用了。
坑 6:变量没初始化就用
这是第二章里我最冤枉的一个坑:
int num;
System.out.println(num); // 报错!
报错信息:"variable num might not have been initialized"
翻译成人话:你只声明了变量(告诉 Java"有个叫 num 的整数"),但没给它赋值就用,Java 不知道它是多少,不敢让你用。
解决办法:声明的时候就顺手初始化。
int num = 0; // 推荐
int num2; num2 = 10; // 也行
注意:这是局部变量(写在方法里的)才这么严格。成员变量(类的属性)会有默认值,比如 int 默认 0、double 默认 0.0、boolean 默认 false。但新手阶段,一律声明即初始化,最稳。
坑 7:变量重复声明
"咦,我是不是没声明?再声明一次保险。"
int num = 5;
int num = 10; // 报错!Duplicate local variable num
同一个作用域里,同一个名字只能声明一次。想改值?直接赋值就行,别带类型:
int num = 5;
num = 10; // 正确:这是赋值,不是声明
坑 8:作用域搞不清
这是新手最容易懵的一个概念。看这段代码:
public static void main(String[] args) {
int num = 5;
if (num > 0) {
int result = num * 2;
}
System.out.println(result); // 报错!找不到 result
}
为什么报错?因为 result 是在 if 的大括号 {} 里面声明的,它的作用域只限于那一对花括号内。一出了大括号,它就不存在了。
记住:花括号就是变量的"活动范围",出了门就失效。
想在外面用,就把变量声明在更外层:
int result = 0;
if (num > 0) {
result = num * 2; // 外面声明,里面赋值
}
System.out.println(result); // 可以了
坑 9:类型装不下,精度悄悄丢
变量是有类型的,int 装整数,double 装小数。但新手常踩两个隐蔽的坑:
坑 9.1:整数溢出
int max = 2147483647; // int 的最大值
System.out.println(max + 1); // 输出:-2147483648?!
没错,加 1 直接变成负数了。int 能装的范围是 -2147483648 到 2147483647,超了就"绕回去",这叫溢出。它不报错,但结果完全错。
坑 9.2:整数除法没有小数
System.out.println(5 / 2); // 输出:2,不是 2.5!
两个整数相除,结果还是整数,小数部分直接丢掉(不是四舍五入,是直接砍掉)。
想要小数,至少让一边是小数:
System.out.println(5 / 2.0); // 输出:2.5
System.out.println(5.0 / 2); // 输出:2.5
坑 10:类型转换不当
小类型转大类型(int → long → double)是自动的,没问题:
int a = 100;
long b = a; // 可以,自动转换
double c = b; // 可以
但大类型转小类型,直接报错:
double d = 3.14;
int a = d; // 报错!精度可能丢失
这时候需要强制转换,但要清楚代价:
int a = (int) 3.99; // 结果是 3,小数被砍掉
强制转换就是把大东西硬塞进小盒子,塞不下的部分会丢,用之前要想清楚。
附:速查版
标识符命名规则(背下来):
| 要求 | 示例 |
|---|---|
字母、数字、_、$ 组成 |
userName、_temp |
| 不能数字开头 | 1name |
| 不能是关键字 | class |
| 不能有空格 | my num |
| 大小写敏感 | Name ≠ name |
| 类名大驼峰、变量名小驼峰 | HelloWorld、userAge |
变量使用三问(写代码前自问):
- 声明了吗?(先声明,再使用)
- 初始化了吗?(声明即赋值)
- 在作用域里吗?(出了花括号就不存在)
最后说两句
学到这里你会发现,Java 报错虽然看着吓人,但绝大多数错误信息已经把答案告诉你了——"duplicate variable"就是重复了,"might not have been initialized"就是没初始化。新手要做的,是先看报错的第一行,再找行号,最后去翻译关键词。
标识符和变量是 Java 的地基,翻车不可怕,翻一次记住一次,后面写多了自然就顺了。
下一篇,我们聊聊运算符和流程控制——那又是另一片雷区。敬请期待。
如果这篇文章对你有帮助,欢迎收藏转发;有补充的坑,欢迎评论区留言,我帮你一起加进去。
浙公网安备 33010602011771号