【Java】变量、常量(final)--语言根基(一)

张开发
2026/4/13 16:16:56 15 分钟阅读

分享文章

【Java】变量、常量(final)--语言根基(一)
【Java】变量、常量final--语言根基一变量、常量final—— 基础语法一、变量1. 变量分类按作用域与生命周期2. 变量命名规范3. 变量声明示例二、常量1. 常量实现方法2. 常量命名规范3. 常量声明示例4. final 关键字的正确使用三、避坑指南1. final 引用对象的修改2. 浮点数比较3. 整数溢出4. 常量修改反射攻击变量、常量final—— 基础语法变量是内存中一个命名的存储单元用于保存程序运行时可变化的数据。常量是值不可变的变量一旦赋值后不能被修改。一、变量1. 变量分类按作用域与生命周期类型声明位置生命周期默认值局部变量方法、构造器、代码块内从声明到方法返回无默认值必须手动初始化实例变量类中、方法外非static随对象创建到GC回收有默认值类变量类中、方法外static类加载到 JVM 退出有默认值2. 变量命名规范类型命名风格示例局部变量camelCase简短但清晰userName,itemCount实例变量camelCase通常加this区分private int age;方法内用this.age类变量camelCase通常加类名访问Student.schoolName布尔变量is/has/can开头isActive,hasPermission集合变量复数或List/Map后缀userList,nameToAgeMap3. 变量声明示例// 一行声明一个变量 int studentCount 0; String userName null; // 声明时立即初始化局部变量 int retryTimes 3; // 使用 varJava 10仅在类型明显时 var list new ArrayListString(); var id 123L; // 布尔变量使用正向命名 boolean isValid true;二、常量1. 常量实现方法方式关键字可变性适用场景字面常量无不可变100hello变量 finalfinal基本类型值不可变引用类型引用不可变对象内容可变固定值、配置参数类常量static final全局唯一且不可变全局配置、数字常量编译时常量static final 字面量编译器替换内联性能优化场景补充说明// 编译时常量 public static final int MAX_SIZE 100; // 值直接内联到使用处 // 非编译时常量运行时常量 public static final String NAME new String(hello); // 不会内联2. 常量命名规范类型命名规范示例说明简单常量全大写 下划线分隔MAX_CONNECTIONS最常用枚举常量全大写 下划线Color.RED,Status.PENDING类型安全常量组公共前缀DEFAULT_,MAX_,MIN_便于查找多词常量下划线分隔SESSION_TIMEOUT_SECONDS清晰表达3. 常量声明示例// 推荐专用常量类私有构造器 final public final class SystemConstants { private SystemConstants() {} // 防止实例化 public static final int PAGE_SIZE_DEFAULT 20; public static final int MAX_RETRY 3; public static final String DATE_PATTERN yyyy-MM-dd; } // 推荐接口常量不推荐已被认为反模式 // 接口中的字段自动 public static final public interface HttpStatus { int OK 200; int NOT_FOUND 404; } // 最佳使用枚举替代常量组 public enum OrderStatus { PENDING, PROCESSING, COMPLETED, CANCELLED }接口常量反模式不推荐——补充原因接口本应用于定义行为契约而非数据存储。实现接口的类会污染命名空间。违反了接口隔离原则。后续若需要修改常量值可能破坏二进制兼容性。4. final 关键字的正确使用位置使用示例final变量值不可变基本类型/引用不可变final int id 10;final引用引用不可变但对象内容可变final ListString list new ArrayList(); list.add(a);final参数参数值不可修改public void set(final int value) { ... }空白final声明时不赋值构造器中赋值private final String name;三、避坑指南1. final 引用对象的修改final ListString list new ArrayList(); list.add(hello); // 允许对象内容可变 list new ArrayList(); // 编译错误引用不可变2. 浮点数比较// 错误 double d 0.1 0.2; if (d 0.3) { ... } // false精度问题 // 正确 if (Math.abs(d - 0.3) 1e-6) { ... }3. 整数溢出int max Integer.MAX_VALUE; max max 1; // 溢出为负数不报错 // 使用 long 或 Math.addExact()4. 常量修改反射攻击// 可以通过反射修改 final 字段不推荐 Field field Constant.class.getDeclaredField(MAX_SIZE); field.setAccessible(true); field.setInt(null, 999); // 改变常量值解决使用不可变类、枚举或安全策略限制反射。

更多文章