当前位置: 首页 > news >正文

Java final 关键字

一、基本概念

1. 什么是 final?

  • final 是 Java 中的关键字,表示“不可变”。
  • 可用于修饰类、方法、变量(包括局部变量、成员变量、参数)。
  • 强调不变性(immutability),提升代码的安全性和性能。

二、final 的不同使用方式

1. 修饰变量(常量)

✅ 特点:
  • 如果是基本类型,则值不能改变。
  • 如果是引用类型,则引用地址不能改变,但对象内部状态可以变化
final int MAX_AGE = 100;
// MAX_AGE = 200; // 编译错误!final List<String> names = new ArrayList<>();
names.add("Alice"); // 合法:对象内容可变
// names = new ArrayList<>(); // 错误:引用地址不可变
⚠️ 注意:
  • final 变量必须在声明时或构造器中初始化(非 static)。
  • static final 常量需在声明时或静态代码块中初始化。
public class Constants {public static final double PI = 3.14159;
}

2. 修饰方法

✅ 特点:
  • 方法不能被子类重写(override)。
  • 提升程序安全性,防止意外修改行为。
class Animal {public final void speak() {System.out.println("Animal speaks");}
}class Dog extends Animal {// public void speak() {} // 编译错误!
}
📌 应用场景:
  • 不希望子类修改的方法逻辑。
  • 提高性能(JVM 可以对 final 方法进行内联优化)。

3. 修饰类

✅ 特点:
  • 类不能被继承。
  • 所有方法默认都是 final 的(即使没有显式声明)。
final class MathUtils {// ...
}// class MyMath extends MathUtils { } // 编译错误!
📌 应用场景:
  • 构建不可变类(如 String)。
  • 确保类的实现不被篡改,增强安全性。

三、final 与线程安全

✅ final 在多线程中的作用:

  • 保证 final 变量的可见性:多个线程访问 final 变量时,不会看到“部分构造”的状态。
  • 避免重排序问题:JVM 会确保 final 变量的初始化顺序正确,避免指令重排导致的并发问题。
public class FinalFieldExample {final int x;public FinalFieldExample(int x) {this.x = x;}// x 的值在线程间可见且不可变
}

四、final 和设计模式

模式使用 final 的原因
单例模式final 变量确保实例唯一且线程安全
工厂方法模式final 方法防止被重写破坏创建逻辑
不可变类(Immutable Class)final 类 + final 字段,构建完全不可变对象

示例:不可变类

public final class Person {private final String name;private final int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() { return name; }public int getAge() { return age; }
}

五、常见面试题整理

Q1:final、finally、finalize 有什么区别?

关键字含义
final修饰符,表示不可变
finally异常处理中始终执行的代码块
finalize()对象被回收前调用的方法(已过时)

Q2:为什么 String 被设计为 final?

防止被继承和修改,确保字符串池的安全性、哈希缓存、类加载机制等关键特性。


Q3:final 和 static 一起使用的意义?

表示一个静态常量,属于类而非实例,通常用于全局配置、数学常量等。

public static final String DEFAULT_ENCODING = "UTF-8";

Q4:final 修饰的对象真的不可变吗?

❗不是绝对不可变。如果是引用类型,对象本身的内容仍可变,只是引用不能变。

final StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 允许修改内容
// sb = new StringBuilder(); // 错误:引用不可变

Q5:final 方法能被重载吗?能被覆盖吗?

  • ✅ 可以被重载(overload)
  • ❌ 不能被覆盖(override)

六、最佳实践

实践建议说明
尽量将不需要修改的变量设为 final提高可读性和安全性
对于工具类使用 final class防止被继承,增强封装性
对于公共 API 中的方法使用 final防止子类破坏预期行为
在多线程环境中合理使用 final保证可见性和顺序一致性
构建不可变对象时使用 final 成员变量有助于线程安全和缓存机制

七、扩展阅读

  • 《Effective Java》第 3 版 – 第 15 条:使类和成员尽可能不可变
  • Java Language Specification (JLS) 关于 final 的定义
  • Java 内存模型(JMM)中 final 的语义规范

📌 总结一句话:

final 是 Java 中实现不变性、提高代码安全性与性能的重要关键字,掌握其使用能够写出更健壮、清晰、高效的代码。

http://www.dtcms.com/a/278926.html

相关文章:

  • iOS APP 上架流程:跨平台上架方案的协作实践记录
  • STM32F1_Hal库学习UART
  • 【脚本系列】如何使用 Python 脚本对同一文件夹中表头相同的 Excel 文件进行合并
  • 设计模式--工厂模式
  • SSE(Server-Sent Events)和 MQTT(Message Queuing Telemetry Transport)
  • 多线程--单例模式and工厂模式
  • 研究人员利用提示注入漏洞绕过Meta的Llama防火墙防护
  • 隐藏源IP的核心方案与高防实践
  • 缺乏项目进度验收标准,如何建立明确标准
  • 基于STM32的智能抽水灌溉系统设计(蓝牙版)
  • 几种上传ipa到app store的工具
  • C#/.NET/.NET Core技术前沿周刊 | 第 46 期(2025年7.7-7.13)
  • 当前(2024-07-14)视频插帧(VFI)方向的 SOTA 基本被三篇顶会工作占据,按“精度-速度-感知质量”三条线总结如下,供你快速定位最新范式
  • 文本生成视频的主要开源模型
  • Redis客户端编程
  • python之Scikit-learn章节
  • 【日常技能】excel的vlookup 匹配#N/A
  • 《大数据技术原理与应用》实验报告二 熟悉常用的HDFS操作
  • 【王树森推荐系统】聚类召回
  • git 访问 github
  • 多用户图书管理系统
  • 张艺兴探班RED女团一周年舞台,见证21岁的梦想落地生根
  • sqli-labs靶场通关笔记:第11-16关 POST请求注入
  • 文献查找任务及其方法
  • 车载诊断框架 --- 车载诊断GuideLine
  • 【t检验】用奶茶店排队案例解释
  • urlencode、html实体编码、unicode
  • ChatDev 简易指导文档
  • Spring Boot Cucumber 测试报告嵌入方法
  • gitlab-ci.yml