Java 基础知识整理:字面量、常量与变量的区别
在 Java 程序设计中,理解 字面量(literal)、变量(variable) 与 常量(constant) 的区别,以及字面量的默认类型和后缀规则,是掌握数据类型使用的基础。
1. 基本概念与默认规则
-
字面量(Literal)
字面量是源代码中直接写出的固定值。
常见示例如下:123
(整数字面量,默认类型int
)3.14
(浮点字面量,默认类型double
)'A'
(字符字面量,类型char
)"hello"
(字符串字面量,类型String
)true
/false
(布尔字面量,类型boolean
)null
(空引用字面量,可赋给任意引用类型)
编译器在解析字面量时会自动确定其默认类型。
-
变量(Variable)
变量是程序运行时的命名存储单元。它有明确的类型和作用域,值可以改变(除非使用
final
修饰)。
常见形式包括:- 局部变量(local variable)
- 实例字段(instance field)
- 静态字段(static field)
-
常量(Constant)
在 Java 中,常量一般通过
final
或static final
定义。根据初始化方式,可以分为两类:-
编译期常量(compile-time constant)
- 由
static final
修饰 - 基本类型或
String
- 初始化表达式在编译阶段即可确定
- 编译器会进行常量折叠优化
- 例如:
static final int SIZE = 10;
- 由
-
运行时常量(runtime constant)
-
使用
final
修饰 -
值在运行时计算,赋值后不可再更改,但并非编译期常量
-
例如:
final int VALUE = new Random().nextInt(100);
-
-
2. 字面量后缀的必要性
-
浮点字面量与
f
/F
-
原因:Java 默认将小数字面量解析为
double
(64 位)。若直接赋给float
(32 位),属于缩小转换(narrowing conversion),编译器不允许隐式执行,以避免精度丢失。 -
解决方案:
- 显式加后缀:
3.14f
- 或强制类型转换:
float f = (float) 3.14;
- 显式加后缀:
-
建议:一般优先使用
double
;在内存敏感或与底层接口兼容时,再使用float
。
-
-
整数字面量与
L
-
原因:整数字面量默认是
int
(32 位,范围约 ±2.1×10^9)。当超出int
范围时,必须显式标注为long
。 -
示例:
long l1 = 1000; // 在 int 范围内,可直接赋值 long l2 = 3000000000L; // 超出 int,必须加 L
-
建议:始终使用大写
L
,避免与数字1
混淆。
-
3. byte
与 short
的特殊情况
-
整数字面量默认是
int
,但若数值在byte
(-128~127)或short
(-32768~32767)的取值范围内,且是编译期常量,编译器会允许隐式赋值:byte b = 100; // OK,编译器检查到范围内 short s = 20000; // OK
-
若赋值来源是变量(运行时才确定),则需要强制转换:
int x = 100; // byte b = x; // 编译错误 byte b = (byte) x; // 必须显式强转
原因:编译器只对编译期常量进行范围折叠与校验,运行时变量则不做推断。
4. 常见错误与建议
-
错误示例
float f = 3.14;
→ 应写作3.14f
或(float) 3.14
long l = 3000000000;
→ 应写作3000000000L
-
建议
- 浮点计算优先使用
double
。 - 仅在内存或接口要求时使用
float
。 - 整数字面量超出
int
时显式加L
,并推荐大写L
。 - 可使用下划线增强可读性:
3_000_000_000L
。
- 浮点计算优先使用
5. 总结
- 字面量有默认类型:整数 → int;小数 → double。
float
与long
需要通过后缀f
/L
明确指定。byte
与short
在编译期常量范围内可直接赋值;运行时变量赋值需强制转换。final
表示变量不可重新赋值,但并不等同于“对象不可变”。
通过正确理解字面量的默认规则和后缀机制,可以避免常见的编译错误,并编写出更清晰、安全的 Java 代码。