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

Java 中的 final关键字详解

在 Java 中,final 是一个非常常用且功能强大的关键字。它可以用于修饰类、方法、变量等,表示“最终的”、“不可改变的”。通过使用 final,我们可以增强程序的安全性、稳定性和可读性。


1. final 可以修饰的内容

修饰内容是否支持 final
方法
变量
局部变量
参数
构造器

2. final 的作用

使用 final 的主要目的是:

  • 防止继承或重写:确保类或方法的行为不被修改;
  • 保证线程安全:常量一旦初始化就不可变;
  • 提高性能:JVM 对 final 成员有优化;
  • 设计不可变对象(Immutable Object):如 String、包装类等。

3. 使用示例

3.1 final 修饰类 —— 不可被继承

public final class FinalClass {// ...
}// 编译错误:无法继承 final 类
// public class SubClass extends FinalClass { }

⚠️ 常见例子:java.lang.Stringfinal 类,不能被继承。


3.2 final 修饰方法 —— 不可被重写

public class Parent {public final void sayHello() {System.out.println("Hello");}
}public class Child extends Parent {// 编译错误:不能重写 final 方法// public void sayHello() { ... }
}

✅ 用途:

  • 防止子类修改父类逻辑;
  • 提高安全性与性能(JVM 可以内联调用)。

3.3 final 修饰变量 —— 常量,不可再赋值

① 修饰基本类型变量
public class Example {public static void main(String[] args) {final int MAX = 100;// MAX = 200; // 编译错误:不能再赋值}
}
② 修饰引用类型变量
public class Example {public static void main(String[] args) {final StringBuilder sb = new StringBuilder("Hello");sb.append(" World"); // ✅ 允许修改对象内容// sb = new StringBuilder(); // ❌ 不允许重新赋值}
}

⚠️ 注意:

  • final 修饰引用类型时,对象本身不可变(即不能再指向新对象),但对象内部状态可以变化。
  • 若想完全不可变,需结合 Collections.unmodifiableList() 等工具类。

3.4 final 修饰局部变量和参数

public void method(final int value) {// value = 10; // 编译错误:参数是 final 的
}public void anotherMethod() {final String msg;msg = "Final"; // 第一次赋值 OK// msg = "Again"; // 再次赋值会报错
}

✅ 用途:

  • 在匿名内部类中访问外部方法的局部变量时,必须是 final 或等效不可变的。

4. final 的注意事项

注意点说明
必须显式赋值final 变量要么在声明时赋值,要么在构造函数中赋值
不影响多线程可见性final 字段在并发环境下具有“初始化安全性”,但不是线程同步机制
不能与 abstract 共存finalabstract 是对立的概念
static 搭配使用常见public static final int MAX = 100; 表示静态常量

5. 常见应用场景

定义常量

public class Constants {public static final String APP_NAME = "MyApp";public static final int MAX_RETRY = 3;
}

封装不可变对象

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; }
}

防止子类破坏逻辑

public class Base {public final void init() {// 初始化逻辑,不允许被覆盖}
}

6. 总结对比表

修饰项是否可继承是否可修改是否可重写
final class--
final method-
final variable❌(基本类型)
✅(引用类型内容)
-

7. 推荐搭配使用

组合说明
static final定义全局常量,如配置信息、固定值
final + private封装字段,防止外部修改
final + immutable objects创建真正不可变的对象
http://www.xdnf.cn/news/709165.html

相关文章:

  • (四) 本地YARN集群的部署
  • 2022 RoboCom 世界机器人开发者大赛(睿抗 caip) -高职组(国赛)解题报告 | 科学家
  • 从微积分到集合论(1630-1910)(历史简介)——第3章——数学分析的出现及其基础性进展(1780-1880)(I.Grattan-Guinness)
  • 基于React和TypeScript的金融市场模拟器开发与模式分析
  • 关于智能体接入后端,在Apifox能够传参数给智能体的测试
  • 【科研绘图系列】R语言绘制GO term 富集分析图(enrichment barplot)
  • 西门子嵌入式学习笔记---(1)裸机和调度器开发
  • 人工智能赋能基础教育个性化学习的理论建构与实践探索
  • Opencv实用操作6 开运算 闭运算 梯度运算 礼帽 黑帽
  • [VMM]分享一个用SystemC编写的页表管理程序
  • GCN图神经网络的光伏功率预测
  • 德思特新闻 | 德思特与es:saar正式建立合作伙伴关系
  • 2025.05.28-华为暑期实习第一题-100分
  • 基于本地知识库的政务问答智能体
  • IDEA项目推送到远程仓库
  • 如何让 Git 停止跟踪文件?停止后又如何恢复跟踪?
  • node_modules包下载不下来
  • OpenCv高阶(二十)——dlib脸部轮廓绘制
  • LeetCode 3373.连接两棵树后最大目标节点数目 II:脑筋急转弯+广度优先搜索(黑白染色法)
  • React Native 实现抖音式图片滑动切换浏览组件-媲美抖音体验的滑动式流畅预览组件
  • [特殊字符] NAT映射类型详解:从基础原理到应用场景全解析
  • Python训练营打卡Day39
  • Arduino 编码器
  • LVDS系列14:Xilinx Ultrascale系可编程输入延迟(四)
  • HTML5 Canvas 星空战机游戏开发全解析
  • ASP.NET MVC添加视图示例
  • JAVA:Kafka 消息可靠性详解与实践样例
  • Android第十一次面试多线程篇
  • nginx源码下载和测试
  • mkdir: cannot create directory ‘gitlab-stu’: No space left on device