Java中定义常量最推荐使用public static final修饰变量并全大写命名;它确保类级共享且不可修改,但final对引用类型仅限制引用不可变,不保证对象内容不可变。

在Java中定义常量,最常用且推荐的方式是使用 final 关键字修饰变量,并配合 static(用于类级别常量)和大写命名规范。它确保变量一旦赋值就不能再被修改,从而实现“常量”的语义。
final 修饰变量:基本常量定义
用 final 声明的变量只能被赋值一次,之后不可更改:
- 可以在声明时直接初始化:final int MAX_RETRY = 3;
- 也可以在构造方法中完成初始化(仅限实例变量);静态常量则需在静态代码块或声明处初始化
- 未初始化的 final 变量称为“空白 final”,必须确保在对象创建完成前被赋值,否则编译报错
static final:定义真正的类级常量
大多数场景下,我们希望常量属于类而非某个对象,因此习惯组合使用 static final:
- public static final String API_URL = "https://api.example.com";
- 加上 public 便于其他类访问;static 表示该值属于类本身,所有实例共享一份;final 保证不可变
- 按 Java 命名规范,常量名全部大写,单词间用下划线分隔(如 DEFAULT_TIMEOUT_MS)
final 修饰引用类型:注意“不可变”的边界
final 对引用类型的保护仅作用于“引用本身”,而非其所指向的对象内容:
立即学习“Java免费学习笔记(深入)”;
-
final List
NAMES = new ArrayList(); 是合法的,NAMES 引用不可再指向其他 List - 但可以执行 NAMES.add("Alice"); —— 因为 ArrayList 内容仍可变
- 若需内容也不可变,应搭配不可变集合工具类,如 List.of() 或 Collections.unmodifiableList()
其他常见用途与注意事项
final 不仅用于变量,还可修饰类和方法:
- final 类不能被继承(如 String、Integer)
- final 方法不能被子类重写,常用于防止行为被意外修改
- 局部变量加 final 在 Lambda 表达式中可被引用(Java 8+ 支持“有效 final”:即使没写 final,只要实际未修改,也可用于 Lambda)










