Java 基础第二章:标识符和变量,新手最容易翻车的 8 个瞬间

Java 基础第二章:标识符和变量,新手最容易翻车的 8 个瞬间

写在前面

上一篇我们历经九九八十一难,终于把 JDK 装好、环境变量配通,敲出了人生第一个 Hello, Java!

然后我就膨胀了。心想:写代码不过如此嘛。

直到翻开教材第二章"标识符与变量",我发现自己连"起名字"都不会。报错一条接一条,红得刺眼,每一行都像在嘲笑我。

这篇就把我在标识符和变量上摔过的跟头都记下来,给后来的新手当个避坑指南。


坑 1:名字以数字开头

写变量的第一反应:变量嘛,随便起。于是:

int 1num = 5;   // 报错!

编译器:"Syntax error on token '1num', delete this token"

规则很简单:标识符只能以字母、下划线 _、美元符 $ 开头,数字不能开头。

顺便记全这条规则:

  • 只能由字母、数字、_$ 组成;
  • 不能以数字开头
  • 不能是 Java 关键字(classpublicint 这些);
  • 大小写敏感(Namename 是两个不同的东西);
  • 不能用空格和其他乱七八糟的符号。

坑 2:拿关键字当变量名

知道了不能数字开头之后,我又开始放飞:

int class = 1;    // 报错!
int public = 2;   // 报错!

关键字是 Java 语言自己保留的词,你起什么名字都不能跟它重名

常见的关键字有:classpublicstaticvoidintdoubleifelseforwhilereturnnewtruefalsenull……

记不全没关系,报错的时候编译器会告诉你。重点是养成习惯:命名时避开这些词,比如想表达"班级",别用 class,用 className

坑 3:名字里带空格

这个坑属于"看着就像错的但还是手滑了":

int my num = 5;   // 报错!

标识符是一个整体,里面不能有空格。想让名字分两段,用驼峰:myNum

坑 4:大小写搞混

int Name = 5;
System.out.println(name);   // 报错!找不到变量 name

Java 是严格区分大小写的。NamenameNAME 是三个完全不同的变量。

新手最容易犯:声明的时候写的是 userName,用的时候敲成了 username,然后盯着报错看了十分钟。

应对方法:变量名统一用小驼峰(myNameuserAge),声明和使用时复制粘贴,不要手敲。

坑 5:用中文起名(能跑,但别这么做)

有段时间我觉得英文变量名太费脑子,直接上中文:

int 年龄 = 18;
System.out.println(年龄);

你猜怎么着?能编译,能运行。 Java 的标识符是支持 Unicode 的,中文完全合法。

但为什么不建议?想想这些场景:

  • 团队协作时别人看着别扭;
  • 编码格式一乱就是乱码;
  • 面试官看到会直接扣印象分;
  • 网上搜资料都对不上。

练习阶段偶尔写着玩可以,正式代码还是老老实实用英文。 怕英文不好?就那几个词:agenamecountprice,够用了。

坑 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:类型转换不当

小类型转大类型(intlongdouble)是自动的,没问题:

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
大小写敏感 Namename
类名大驼峰、变量名小驼峰 HelloWorlduserAge

变量使用三问(写代码前自问):

  1. 声明了吗?(先声明,再使用)
  2. 初始化了吗?(声明即赋值)
  3. 在作用域里吗?(出了花括号就不存在)

最后说两句

学到这里你会发现,Java 报错虽然看着吓人,但绝大多数错误信息已经把答案告诉你了——"duplicate variable"就是重复了,"might not have been initialized"就是没初始化。新手要做的,是先看报错的第一行,再找行号,最后去翻译关键词

标识符和变量是 Java 的地基,翻车不可怕,翻一次记住一次,后面写多了自然就顺了。

下一篇,我们聊聊运算符和流程控制——那又是另一片雷区。敬请期待。

如果这篇文章对你有帮助,欢迎收藏转发;有补充的坑,欢迎评论区留言,我帮你一起加进去。

posted @ 2026-09-13 14:15  码途小记  阅读(9)  评论(0)    收藏  举报