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 修饰的变量被视为常量,命名规范要求全部大写(如 PIMAX_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

相关推荐

  • 如何设置iis网站子目录二级域名?,网站后台怎么设置?

    在IIS中为子目录设置二级域名,并配置独立后台,最核心的答案是:通过DNS解析将二级域名指向服务器IP,然后在IIS中对目标网站使用“URL重写”模块将二级域名的请求转发至子目录,同时把子目录程序的后台入口文件单独绑定,确保后台访问路径唯一且独立,为什么直接绑定子目录会失败?核心原理先说透很多朋友在IIS上折腾……

    2026年7月31日
    600
  • 分布式缓存服务真的好吗?分布式缓存服务优缺点详解

    分布式缓存服务不仅好,而且是构建高并发、低延迟现代应用架构的绝对刚需,它能显著提升系统响应速度并保护后端数据库,想象一下,你的网站像一家生意火爆的餐厅,如果每来一位顾客点菜,厨师都要亲自去遥远的农场现摘蔬菜、现杀鸡鸭,那排队等待的时间会让顾客绝望,分布式缓存服务就像是在餐厅门口设置了一个巨大的“半成品备货区……

    2026年7月3日
    12100
  • 什么是分布式存储原理,分布式存储有什么优缺点?

    分布式存储是通过网络将多台物理服务器的存储资源整合为一个逻辑整体,利用数据冗余和分布式管理机制,实现海量数据的高可用、高可靠以及近乎无限的水平扩展能力,分布式存储和集中式存储的区别是什么在探讨原理之前,必须理清分布式存储与传统集中式存储(如SAN、NAS)的本质差异,集中式存储依赖于高性能的中心控制器,所有数据……

    2026年7月14日
    2300
  • AI轩辕大模型是什么?2026年最新AI大模型排名

    AI轩辕大模型并非单一软件,而是百度基于文心一言底层技术演进的企业级智能中枢,旨在通过深度整合行业数据与私有知识库,为政企提供从内容生成到复杂决策辅助的一站式解决方案,在2026年的数字生态中,企业面临的挑战已从“是否使用AI”转向“如何安全、高效地定制AI”,通用大模型虽然强大,但在处理垂直领域专业问题时,往……

    2026年6月16日
    2710
  • 如何通过服务器控制客户端关机?远程批量关闭电脑方法

    服务器控制客户端关机通常通过SSH远程命令、企业级终端管理软件或组策略下发实现,核心在于建立稳定的远程连接通道并配置相应的权限认证,在IT运维和企业管理场景中,远程管理终端设备是日常操作的高频需求,想象一下,你坐在办公室,面对的是成百上千台分散在不同地点的电脑,如果每台机器都需要物理接触才能关闭,那将是一场灾难……

    2026年7月5日
    11200
  • 华为AI健康大模型能治什么病?华为健康大模型怎么用

    华为AI健康大模型通过深度融合医疗专业知识与多模态感知技术,实现了从被动记录向主动预测的健康管理跨越,其核心价值在于为个人提供精准、实时且可解释的健康干预方案,华为AI健康大模型如何重塑日常健康管理过去,我们依赖体检报告发现健康隐患,往往为时已晚,华为AI健康大模型正在改变这一局面,它不仅仅是一个数据存储库,更……

    2026年6月14日
    4900
  • 大模型部署API文档

    大模型部署API的核心在于通过标准化接口实现模型能力的云端调用,其本质是将复杂的推理过程封装为简单的HTTP请求,从而让开发者无需关心底层硬件资源即可快速集成AI功能,在2026年的技术语境下,大模型部署API已经不再是单纯的技术黑盒,而是企业数字化转型的基础设施,过去,企业需要自建庞大的GPU集群来运行开源模……

    2026年6月18日
    2200
  • ipv6冲突冲突检查是什么原因,怎么解决?

    IPv6地址冲突虽然不像IPv4那样常见,但一旦发生,会直接导致设备无法正常通信,甚至整个网段瘫痪,检查冲突的核心方法是利用系统日志和邻居缓存表,结合ping命令和IPv6特有的邻居发现协议(NDP)来定位,IPv6冲突为何会发生?常见原因IPv6地址冲突的根源比IPv4更隐蔽,因为IPv6地址空间巨大,人为配……

    2026年8月21日
    600
  • 服务器能修改客户端时间吗,如何解决服务器时间不同步问题?

    服务器无法直接修改客户端操作系统底层的系统时间,但可以通过NTP协议、API响应头或服务端逻辑校验,强制校准客户端显示时间或直接废弃客户端提交的时间戳,以确保业务逻辑的绝对一致性,为什么服务器时间与客户端时间不一致在分布式系统架构中,时间同步是保证业务逻辑正确运行的基石,开发者经常会遇到服务器时间与客户端时间存……

    2026年7月12日
    10900
  • it运维管理专家_运维管理

    IT运维管理专家不是某个职称证书,而是能把被动救火变成主动预防、能用数据说话替代经验拍板、能在故障发生前就把它摁灭的运维能力体系,当企业在数字化转型里走深,运维的复杂度早就超过了一个人、一套脚本能覆盖的边界,本文直接拆解运维管理专家的核心能力模型、工具选型逻辑、落地实操路径和成本预期,帮你把这件事看清楚,IT运……

    2026年8月17日
    200

发表回复

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

评论列表(1条)

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

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