跳转到内容

Java常量

来自代码酷

模板:Note

Java常量[编辑 | 编辑源代码]

Java常量(Constant)是指在程序运行期间其值不可改变的标识符,通过final关键字实现。常量在内存中存储在方法区的运行时常量池,与变量有本质区别。

核心特性[编辑 | 编辑源代码]

  • 不可变性:初始化后值不可修改
  • 编译期优化:基本类型常量会被编译器直接替换为字面量
  • 命名规范:全大写字母+下划线分隔(如MAX_SPEED
  • 作用域:类常量、实例常量、局部常量

声明语法[编辑 | 编辑源代码]

使用final修饰符:

// 基本类型常量
final double PI = 3.1415926;

// 引用类型常量
final String COMPANY_NAME = "Oracle";

常量类型[编辑 | 编辑源代码]

Java常量分类
类型 示例 生命周期 类常量 static final int MAX_USERS = 100 类加载时初始化 实例常量 final String serialNumber 对象实例化时初始化 局部常量 final var timeout = 30 代码块执行时初始化

编译期常量[编辑 | 编辑源代码]

满足以下条件时,常量会在编译期被直接替换为字面值:

  1. 基本类型或String类型
  2. 使用字面量初始化
  3. 使用简单表达式(仅含常量)
// 编译期常量示例
final int HOURS_PER_DAY = 24;
final long MILLIS_PER_DAY = HOURS_PER_DAY * 60 * 60 * 1000L;

// 反编译后实际代码:
// long millisPerDay = 86400000L;

实际应用案例[编辑 | 编辑源代码]

配置参数[编辑 | 编辑源代码]

public class AppConfig {
    public static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";
    public static final int MAX_RETRIES = 3;
}

枚举替代方案[编辑 | 编辑源代码]

public class Direction {
    public static final int NORTH = 0;
    public static final int EAST = 1;
    public static final int SOUTH = 2;
    public static final int WEST = 3;
}

内存模型分析[编辑 | 编辑源代码]

classDiagram class ConstantPool { +String: "Hello World" +int: 100 +float: 3.14f } class ClassA { +final int MAX } class ClassB { +final String GREETING } ClassA --> ConstantPool : 引用 ClassB --> ConstantPool : 引用

高级用法[编辑 | 编辑源代码]

空白final[编辑 | 编辑源代码]

允许延迟初始化但必须确保唯一赋值:

class BlankFinal {
    final int value;
    
    BlankFinal(int val) {
        this.value = val; // 构造函数中初始化
    }
}

常量表达式[编辑 | 编辑源代码]

使用constantExpression进行复杂计算: F=95C+32(华氏度转换公式)

final double FAHRENHEIT_SCALE = 9.0 / 5.0;
final int FREEZING_POINT = 32;

double celsiusToFahrenheit(double c) {
    return c * FAHRENHEIT_SCALE + FREEZING_POINT;
}

最佳实践[编辑 | 编辑源代码]

  1. 优先使用enum代替整型常量
  2. 对于公共常量使用public static final
  3. 避免在接口中定义常量(应使用枚举或工具类)
  4. 常量对象应设计为不可变类

页面模块:Message box/ambox.css没有内容。

常见问题[编辑 | 编辑源代码]

Q: 常量与不可变对象的区别?[编辑 | 编辑源代码]

  • 常量是引用不可变(基本类型值不可变)
  • 不可变对象是实例状态不可变(如String

Q: 为什么常量命名要全大写?[编辑 | 编辑源代码]

这是Java语言规范(JLS §6.8)推荐的命名约定,提高代码可读性并区别于变量。

性能考量[编辑 | 编辑源代码]

常量折叠(Constant Folding)优化示例:

// 源代码
final int SIZE = 1024;
byte[] buffer = new byte[SIZE * 2];

// 编译后等价于
byte[] buffer = new byte[2048];

常量在JIT编译阶段可能被内联优化,减少运行时内存访问开销。