定义:
在Java中,常量是一种不可变的变量,是程序运行期间,固定不变的量。在Java中,通过final关键字声明,一旦赋值不可修改。
语法格式为:
final 数据类型 常量名 = 初始值;
例如:
final int MAX_VALUE = 100; // 整型常量
final double PI = 3.14159; // 浮点型常量
final char CHARACTER = 'A'; // 字符型常量
final String GREETING = "Hello"; // 字符串常量
final String EMPTY = null; // 空常量
final boolean FLAG = true; // 布尔常量
分类:
常量分为四类:字面常量、命名常量、编译时常量、运行时常量。
1.字面常量:
定义:
字面常量是直接写在代码里的固定值,无名称,不可修改,可用于初始化final变量。
例如:
final int MAX_VALUE = 100; // 100是字面常量
final double PI = 3.14159; // 3.14159是字面常量
final char CHARACTER = 'A'; // A是字面常量
final String GREETING = "Hello"; // Hello是字面常量
final String EMPTY = null; // null是字面常量
final boolean FLAG = true; // true是字面常量
分类 :
类别 | 示例 | 备注 |
整型常量 | 123(十进制)、0b1010/0B1010(二进制表示十进制的10)、017(八进制表示十进制的15)、0x1F/0X1F(十六进制表示十进制的31) |
①不带小数点的数字(整数) ②支持不同进制 |
浮点数常量 | 3.14、3.14F、7.022e23 |
①带小数点的,数字(小数) ②支持常规写法和科学计数法 ③默认类型为double,若声明float类型,需加后缀F或f |
字符常量 | 'A'、'a'、'1'、'\n'(换行)、'\t'(制表符)、'\\'(反斜杠)、'\''(单引号)、'\uXXXX'(Unicode编码,如'\u0041'表示'A') |
①由英文符号''(单引号)括起来的单个字符 ②支持转义字符 |
字符串常量 | "123"、"hello"、"哈哈哈" |
①由英文符号""(双引号)括起来的字符串 ②支持转义字符(同上) |
布尔常量 | true、false | 有且只有两个,分别是true和false |
空常量 | null | 表示空引用,不指向任何对象 |
注意:
①与Java中数据类型区分:Java中,字符串、整型、浮点型、字符型、布尔型,称作数据类型。
②浮点精度问题:浮点数字面常量可能会存在精度损失。
③注意字符与字符串的区分(如'A'和"A")。
2.命名常量:
通过final关键字声明的有名称的不可变变量。
例如:
final int MAX_VALUE = 100; // MAX_VALUE是命名常量
final double PI = 3.14159; // PI是命名常量
final char CHARACTER = 'A'; // CHARACTER是命名常量
final String GREETING = "Hello"; // GREETING是命名常量
final String EMPTY = null; // EMPTY是命名常量
final boolean FLAG = true; // FLAG是命名常量
3.编译时常量:
定义:在编译时即可确定的常量。
必须满足的条件:
(1)使用final声明
(2)类型为基本类型或者字符串类型(String)
(3)初始值为字面常量或其他编译时常量。
4.运行时常量:
定义:在运行时才能确定的常量。
例如:
//生成一个随机数
final int RANDOM = new Random().nextInt(); // 运行时赋值
//输出当前日期时间
final String TIME = LocalDateTime.now().toString(); // 运行时动态生成
注意:在IDEA上运行时,用打印语句输出,否则控制台不显示结果。
命名规范:
(1)字母全大写,单词之间用下划线_分割(如:MAX_VALUE)。
(2)表达意思要清晰,避免无意义名称。
内存管理:
1.编译时常量:
①编译时常量会被编译器直接优化为字面值。
例如:
final int MAX = 100;
int value = MAX * 2; // 编译后等价于 int value = 200;
②字符串常量存储在字符串常量池中,相同值的字符串会共享内存。
2.运行时常量:
运行时常量存储在堆内存或栈内存中,无法被编译器优化。
使用场景:
1.避免“魔法数字”:
通常用常量代替代码中的硬编码值,从而提高代码的可读性和可维护性。
例如:
// 不推荐
if (value > 100) { ... }
// 推荐
final int MAX_VALUE = 100;
if (value > MAX_VALUE) { ... }
2.配置参数:
将程序中固定的值(如文件路径、时间等)声明为常量。
3.替代枚举:
在某些简单的场景,常量可以替代枚举(enum)。
博客均为博主自行学习总结,如有纰漏,请各位大佬指正!