final关键字到底有什么用?final关键字的作用和用法

在 Java 等编程语言中,final 关键字是一个非常重要的修饰符,它的主要作用是“不可变性”或“最终性”,根据使用场景的不同(修饰变量、方法、类),final 的具体含义和行为有所区别。

以下是 final 关键字在三个主要场景下的详细作用:

【每天一个技术点】final 关键字原来还有这么多用法
加载中
【每天一个技术点】final 关键字原来还有这么多用法

修饰变量(Variable)

当 final 修饰一个变量时,表示该变量一旦被赋值,其值(对于基本数据类型)或引用(对于引用数据类型)就不能再改变。

  • 基本数据类型(如 int, double, boolean):

    • 值不可更改。
    • 必须在声明时或构造函数中初始化,之后不能再赋值。
    • 示例:
      final int MAX_SIZE = 100;
      // MAX_SIZE = 200; // 编译错误:无法为最终变量 MAX_SIZE 分配值
  • 引用数据类型(如 Object, String, 自定义对象):

    • 引用地址不可更改:你不能让该变量指向另一个对象。
    • 可能可变:如果对象本身是可变的(如 ArrayList 或自定义类),你仍然可以修改对象内部的状态(调用其方法),但不能改变变量指向的对象实例。
    • final关键字到底有什么用?final关键字的作用和用法

    • 示例:
      final List<String> list = new ArrayList<>();
      list.add("Hello"); // 允许:修改对象内部状态
      // list = new ArrayList<>(); // 编译错误:无法重新赋值引用
  • 常量约定:

    • final static 修饰的变量被视为常量,命名规范要求全部大写(如 PI、MAX_VALUE)。

修饰方法(Method)

当 final 修饰一个方法时,表示该方法不能被重写(Override)。

  • 目的:

    • 防止子类改变该方法的行为,确保该方法在所有子类中保持一致。
    • 某些情况下,JVM 可以对 final 方法进行内联优化(inlining),提升执行效率(虽然现代 JVM 优化已很强大,这一点的实际意义有所减弱)。
  • 示例:

    class Parent {
        public final void display() {
            System.out.println("Parent method");
        }
    }
    class Child extends Parent {
        // @Override
        // public void display() { ... } // 编译错误:无法重写 Parent 中的 final 方法
    }

    final关键字到底有什么用?final关键字的作用和用法


修饰类(Class)

当 final 修饰一个类时,表示该类不能被继承(Extend)。

  • 目的:

    • 确保类的行为完全一致,防止子类通过继承修改或扩展类的行为。
    • 常用于设计安全关键或不可变的类。
  • 常见例子:

    • java.lang.String
    • java.lang.Math
    • java.lang.Integer 等包装类
  • 示例:

    final class MyFinalClass {
        // 类内容
    }
    // class SubClass extends MyFinalClass {} // 编译错误:无法从最终类 MyFinalClass 进行继承

总结对比表

final关键字到底有什么用?final关键字的作用和用法

修饰对象 含义 主要用途
变量 值/引用不可变 定义常量、防止意外修改、线程安全
方法 不可被重写 锁定行为、防止子类篡改、潜在性能优化
类 不可被继承 设计不可变类、安全控制、API 稳定性

补充说明:final 与线程安全

  • final 变量有助于线程安全,在 Java 内存模型中,final 字段的初始化保证在构造函数结束前完成,并且对其他线程可见,这避免了“发布逸出”(escape)问题。
  • 但注意:final 修饰引用类型时,只保证引用不变,不保证对象内部状态线程安全,如需完全线程安全,需结合 synchronized 或使用并发集合。

最佳实践建议

  1. 优先使用 final:除非你有明确的理由需要修改变量或重写方法,否则默认将变量、方法、类声明为 final,以提高代码的可读性和安全性。
  2. 常量命名规范:使用 public static final 定义常量,并采用全大写下划线命名法(如 MAX_RETRY_COUNT)。
  3. 谨慎使用 final 类:除非你确实希望禁止继承(如 String),否则不要随意将类声明为 final,以免限制扩展性。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/article/477466.html

赞 (0)
akamai免费cdn能用吗?akamai cdn免费申请教程
上一篇 2026年7月10日 01:38
poi复制excel报错怎么办?poi读取excel单元格内容
下一篇 2026年7月10日 01:39

相关推荐

  • 服务器代码到底是哪个文件夹里的文件,怎么看?

    服务器代码就是运行在服务器端的程序,具体是哪个文件取决于技术栈,比如PHP用index.php,Node.js用app.js;如果你在问“服务器代码是哪个”,通常指的是后端逻辑所在的核心文件,找到它你才能修改功能或排查问题,服务器代码是什么:核心概念解析服务器代码的定义与执行环境服务器代码(Server-sid……

    2026年7月15日
    2000
  • 如何查询实例IPv6域名?,IPv6域名怎么查

    ShowDnsName 是一个专注于IPv6查询的工具,通过它你可以快速获取实例的IPv6域名并验证解析记录,尤其适用于云服务器和容器环境的IPv6网络排查,ipv6查询工具ShowDnsName究竟是什么随着IPv6在全国范围内的规模部署,云服务商为每个实例自动分配IPv6地址和对应的域名已成为常态,比如阿里……

    2026年8月4日
    400
  • 服务器负载新技术有哪些应用场景,如何实现?

    服务器负载高不能只靠堆硬件,2026年更有效的思路是“先诊断后分流”,结合云原生负载均衡和弹性伸缩,从根源解决问题,服务器负载高怎么解决?先找准病因再下手很多运维朋友一碰到服务器负载飙升,第一反应就是升配置、加内存,但其实,这就像水管堵了不去疏通,反而拼命加大水压——治标不治本,解决负载高,得先搞清楚到底是哪里……

    2026年7月21日
    900
  • AI遥感大模型发布了?AI遥感大模型有哪些应用场景

    2026年AI遥感大模型已实现从“看图说话”到“精准量化”的跨越,能够以分钟级速度处理TB级影像数据,为农业估产、灾害预警及城市规划提供高置信度的决策依据,过去,我们看卫星图就像在迷雾中找路,靠的是专家的经验直觉,AI遥感大模型成了我们的“天眼”助手,它不仅看得清,还看得懂,这种技术变革不是简单的工具升级,而是……

    2026年6月14日
    2400
  • fis3引入js报错怎么办?fis3如何正确引入js文件

    Fis3引入JS的核心在于通过fis3.conf配置文件中的module、deps属性以及fis3-postpackager-simple打包插件,实现依赖的自动解析与合并,从而解决模块化开发中的加载顺序和冗余问题,在2026年的前端工程化语境下,虽然Vue、React等框架已占据主流,但在遗留系统维护、传统企……

    2026年7月10日
    19000
  • 多网卡云服务器双栈策略路由怎么配?,ipv6云服务器如何配置

    为多网卡Windows云服务器手动配置IPv4和IPv6策略路由,核心是通过管理路由表确保不同网卡的流量正确导向各自网关,避免网络中断,多网卡Windows云服务器策略路由配置指南默认路由冲突导致双栈异常当Windows云服务器挂载多块网卡时,系统默认只会为其中一块网卡生成默认路由(IPv4的0.0.0.0/0……

    2026年8月11日
    1200
  • 服务器租用日租怎么算?服务器租用日租一天多少钱

    服务器日租模式适合短期测试、突发流量应对及临时项目,其核心优势在于极致的成本灵活性与资源即时释放能力,无需承担长期闲置浪费的风险,在云计算普及的今天,传统的包年包月服务器租用模式正逐渐暴露出灵活性不足的短板,对于初创团队、独立开发者或需要应对短期高峰业务的企业而言,按需付费的日租模式成为了更理性的选择,这种模式……

    2026年7月3日
    14300
  • IPv6的FTP服务器地址是什么?,怎么设置

    IPv6的FTP服务器地址,核心区别在于必须用中括号[]将IPv6地址括起来,再紧跟端口号,例如[2001:db8::1]:21,否则标准FTP客户端无法正确解析,IPv6 FTP服务器地址格式与填写方法这是很多新手一开始就卡住的地方,IPv6地址本身包含冒号,和FTP地址中端口分隔符的冒号冲突,因此IETF标……

    2026年8月3日
    900
  • 大模型安全领域微调怎么做?大模型安全对齐微调技巧

    大模型安全领域微调的核心在于构建“数据清洗-指令对齐-红队测试”的闭环流程,通过注入高质量安全指令数据,使模型在保持通用能力的同时,具备识别并拒绝恶意请求的防御机制,在2026年的技术语境下,大模型微调已不再是简单的参数更新,而是一场关于数据质量与逻辑对齐的深度博弈,安全微调的目标并非让模型变得“笨拙”,而是赋……

    2026年6月17日
    4400
  • 发短信营销推广真的有效吗?短信群发平台哪家便宜

    短信营销推广的核心在于精准触达与合规转化,通过细分人群标签、优化发送时段及提供即时价值,能显著提升打开率与ROI,是2026年私域流量运营中不可替代的高效渠道,在数字化营销的浪潮中,许多企业误以为短视频和直播是唯一的救命稻草,却忽略了短信营销那近乎100%的触达率和极高的打开率,短信不再是简单的群发工具,而是连……

    2026年7月4日
    18000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

评论列表(1条)

  • 孙晓敏
    孙晓敏 2026年7月11日 16:52

    哎呀,final关键字啊,这玩意儿可真是个好东西!在Java里,它就像是个“保镖”,专门守护着那些不能随便变的东西。