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

相关推荐

  • 服务器客户端时钟不同步怎么解决?windows服务器时间同步设置

    服务器与客户端时钟不同步会导致数据错乱、认证失败及日志混乱,解决核心在于部署NTP协议并配置可信时间源,确保毫秒级同步精度,在分布式系统和互联网应用中,时间不仅仅是墙上的数字,它是所有逻辑判断的基石,想象一下,如果银行转账的时间戳比实际发生时间晚了10秒,或者日志记录的时间早于操作发生时间,整个系统的数据一致性……

    2026年7月7日
    10900
  • IE10浏览器登录不了怎么办,登录失败原因是什么?

    IE 10浏览器登录问题多由兼容性视图设置或安全策略引致,通过添加站点到兼容性视图列表并调整安全级别,即可恢复登录功能,IE 10浏览器登录不了怎么办遇到登录失败,先别急着卸载,多数情况下,问题出在IE 10对旧网站的兼容性上,具体表现为页面空白、提示“此网站需要更高版本”或控件无法加载,排查步骤:开启兼容性视……

    2026年8月20日
    900
  • 如何设置IDE硬盘跳线?,主从盘跳线怎么设置

    IDE硬盘跳线是决定硬盘主从身份的关键元件,正确设置才能让系统识别并正常启动,什么是IDE硬盘跳线IDE硬盘,也就是PATA硬盘,背后那一排裸露的针脚就是跳线接口,跳线帽套在不同位置,相当于告诉硬盘在通道里是主盘(Master)还是从盘(Slave),或者由数据线决定(Cable Select),这个设置关系到……

    2026年8月20日
    1200
  • 服务器变更地址有哪些步骤,更换服务器IP会影响GEO排名吗?

    服务器变更地址本质上是网络基础设施的迁移,只要操作得当并做好DNS平滑切换,对业务连续性和SEO排名的负面影响可以降至最低,核心在于缩短解析生效时间与确保数据同步一致性,服务器变更地址会影响SEO吗?在互联网运维领域,服务器IP地址的变动是企业成长过程中不可避免的操作,许多站长和运维人员最担心的莫过于“权重丢失……

    2026年7月12日
    14100
  • idea新建mysql数据库_新建MySQL数据连接

    在IntelliJ IDEA中新建MySQL数据库连接,只需通过Database工具窗口添加MySQL数据源,填写主机、端口、用户名密码,测试连接后即可管理数据库,并直接执行SQL创建新库,为什么要在IDEA中连接MySQL?对于Java开发者,IntelliJ IDEA不仅是写代码的编辑器,更是项目管理的核心……

    2026年8月19日
    1200
  • 服务器有哪些分类?服务器分类及区别

    服务器的分类方式多种多样,通常取决于具体的应用场景、硬件架构或部署方式,为了让你更清晰地理解,我们可以从以下几个主要维度对服务器进行分类:按物理形态分类(最常见)这是根据服务器机箱的外观和结构来划分的,也是数据中心中最直观的分类方式,机架式服务器 (Rack Server)特点:设计为标准机架宽度(通常为19英……

    2026年7月10日
    20800
  • idataparameter是什么,怎么用?

    idataparameter _是一个专门从半结构化文本中提取、清洗和映射数据参数的轻量级命令行组件,它的核心价值在于把混乱的原始日志或JSON片段变为可直接引用的标准参数,省去手写正则和重复解析的麻烦,idataparameter是什么?先解决哪个痛点先聊一下它到底治什么病,做过数据清洗或接口调试的人都有体会……

    2026年8月20日
    500
  • 大模型推理显存怎么算?大模型推理显存占用公式详解

    大模型推理的显存占用主要由模型权重、KV缓存和激活值三部分构成,其中KV缓存随序列长度线性增长,是长文本场景下显存爆炸的核心元凶,很多开发者在部署大模型时,常遇到“明明显存够大,却跑不起来”的尴尬局面,这通常是因为只计算了模型权重,而忽略了推理过程中的动态显存开销,理解显存占用的底层逻辑,不仅是优化性能的关键……

    2026年6月22日
    2300
  • ICP报备和商机报备的办理流程是什么?,需要准备哪些材料?

    ICP备案与商机报备联动办理,是渠道商与互联网企业确保合规并提升业务效率的关键做法,两者同步推进能有效降低时间成本与资源冲突,ICP备案与商机报备为何要同步不少渠道商和中小企业主在办理网站备案时,往往只盯着工信部审核流程,却忽略了公司内部的商机报备机制,这两件事放在一起做,能省去大量后续麻烦,场景描述:当渠道商……

    2026年8月8日
    1500
  • IIS虚拟主机端口如何设置?,安装IIS步骤是什么

    正确配置IIS虚拟主机端口的关键在于明确绑定关系,安装IIS则通过服务器管理器添加角色功能即可完成,IIS虚拟主机端口怎么设置?什么是IIS虚拟主机端口绑定在IIS中,虚拟主机通过绑定来关联请求与站点,绑定包含三个要素:IP地址、端口号、主机名,当你访问一个网站时,IIS会根据这三个信息的组合将请求路由到对应站……

    AI资讯 2026年8月9日
    1100

发表回复

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

评论列表(1条)

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

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