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://test.idctop.com/article/477466.html

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

相关推荐

  • i快速重置密码的方法是什么?,忘记密码怎么办?

    重置密码入口在哪?三步完成i重置密码全流程当你忘记i重置密码的登录凭据时,最快的解决方案是直接访问官方重置入口,通过绑定手机号或邮箱验证身份,全程约需3至5分钟,这套流程适用于绝大多数主流平台,无论你是忘记Apple ID密码还是其他含“i”前缀的服务账号,核心操作路径基本一致,重置密码前必须确认的验证条件在点……

    2026年8月17日
    800
  • IP地址网络地址有哪些类型?,网络地址和ip地址有何区别?

    IP地址由网络位和主机位组成,网络地址是主机位全0的地址,用于标识一个网络,而网络地址类型主要分为A、B、C、D、E类,以及私有地址和公网地址等,它们决定了网络的规模和使用场景,IP地址和网络地址的区别是什么?很多人在接触网络基础时,最常问的就是“IP地址和网络地址的区别”,IP地址是设备在网络中的唯一标识,它……

    AI资讯 2026年8月9日
    600
  • iis没有默认网站怎么办?,iis怎么修改绑定域名?

    IIS找不到默认网站或需要修改已绑定的域名,核心解决路径是:先检查IIS管理器中“网站”节点下的状态,若无默认站点需手动创建或还原,然后通过“绑定”功能直接修改或替换域名,最后重启服务生效,默认站点消失?先排查这几种情况很多人在打开IIS管理器时,发现“默认网站”不见了,第一反应是重装IIS,默认站点丢失通常不……

    2026年8月21日
    400
  • 怎么看服务器端和客户端?服务器端和客户端区别是什么

    服务器端负责数据存储、业务逻辑处理和高并发请求响应,而客户端负责用户交互界面展示和数据请求发起,两者通过标准网络协议进行高效通信,理解这一架构不仅是技术人员的必修课,也是普通用户优化网络体验的关键,在2026年的数字化环境中,随着边缘计算的普及和云原生技术的深化,这种“前后端分离”的架构变得更加复杂且重要,我们……

    2026年7月8日
    13200
  • 服务器除尘多少钱一次?清洗服务器硬件需要多少钱

    服务器除尘价格并非固定值,通常根据设备规模、污染程度及地域差异,单台小型服务器清洗费用在200-500元,大型数据中心集群清洗则需按机架或PDU点位进行整体报价,整体预算需预留15%-20%的应急调整空间,服务器作为数据中心的“心脏”,其散热效率直接决定了业务连续性,灰尘堆积不仅是物理脏污,更是导致硬件过热、短……

    2026年7月6日
    22400
  • icp网站授权函_管理ICP备案信息

    ICP网站授权函是网站主办者授权第三方代为办理ICP备案信息管理工作的法律文件,正确使用授权函能确保备案信息真实有效,避免网站被注销备案或处罚,无论你是个人站长还是企业运维,只要涉及ICP备案信息变更、代理备案或主体转移,授权函都是绕不开的环节,下文将详细说明授权函的办理方法、备案信息管理流程以及常见问题的处理……

    2026年8月14日
    1300
  • 服务器蓝屏频繁出现是什么原因,怎么解决?

    服务器蓝屏并非无解难题,通过系统化排查和应急处理,大部分情况可在30分钟内恢复业务,服务器蓝屏原因有哪些?硬件与系统层的常见诱因服务器蓝屏的根本原因集中在硬件故障、驱动冲突或系统文件损坏,掌握这些诱因能帮你快速缩小排查范围,避免盲目操作,内存故障:蓝屏的头号凶手内存错误是服务器蓝屏最常见的触发点,当内存条存在物……

    2026年7月20日
    1200
  • 大模型的世界模型是什么?大模型的世界模型原理

    大模型的世界模型(World Model)本质上是赋予AI“物理直觉”与“因果推理”能力的底层架构,它让机器不再只是预测下一个字,而是能模拟现实世界的运行规律,从而在自动驾驶、机器人控制及复杂决策场景中实现从“感知”到“行动”的闭环,过去几年,人工智能的爆发主要集中在生成式内容上,比如写代码、画图片或者写文章……

    2026年6月20日
    2400
  • Image控件的基础知识有哪些?,怎么使用?

    Image控件是GUI开发中用于显示图像的基础组件,掌握其核心用法和属性设置能显著提升界面设计效率,尤其在C#和Python等平台中应用广泛,多数开发者能在半小时内上手,Image控件基础概念什么是Image控件Image控件是一种用户界面元素,专门用于显示图像文件,它支持多种格式,包括PNG、JPEG、GIF……

    2026年8月12日
    300
  • 发充值到账短信的公司到底怎么选,哪家好?

    对于需要发送充值到账短信的企业,直接对接专业短信服务商(如阿里云短信、腾讯云云通信、云片等)是成本最低且效率最高的方案,这些公司提供专属通道和接口,确保充值后用户能在几秒内收到通知,充值到账短信的核心需求:为什么必须找专业公司充值到账短信是用户完成付款后的第一道信任凭证,无论是话费充值、游戏点券、会员续费还是生……

    2026年7月28日
    500

发表回复

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

评论列表(1条)

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

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