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

【final、finally和 finalize的区别】

final、finally和 finalize的区别

  • final关键字在不同场景下的应用
    • final应用于类
    • final应用于方法
    • final应用于变量
      • 成员变量
      • 静态变量(类常量)
      • 局部变量
    • final应用于参数
    • final应用于对象

特性final​​ (关键字)​​finally​​ (关键字)finalize()​​ (方法)
实现方式​修饰类、方法或变量​​与 try-catch块配合使用在类中重写 Object的 finalize()方法
核心作用​​限制继承、重写或修改​​确保代码块必然执行(如资源释放对象被垃圾回收前的清理操作(已废弃)
执行时机​编译时检查运行时在 try-catch后执行不确定(由GC触发,不保证一定执行)
是否可控制​​开发者显式声明开发者显式编写由JVM自动调用
现代替代方案​​无(仍是重要关键字)无(仍是异常处理核心)try-with-resources或 AutoCloseable接口
​​线程安全​​被 final修饰的变量是线程安全的(不可变)与线程无关不保证线程安全(可能被多线程环境下的GC调用)

final关键字在不同场景下的应用

final应用于类

作用​​:禁止其他类继承该类
​​特点​​:

  • 该类不能被任何其他类继承(不能有子类)
  • 类中所有方法隐式为 final(不能被子类重写)
  • 常用于设计​​不可变类​​或​​工具类​

典型应用​​:

  • JDK中的String、Integer等包装类都是final类
  • 工具类如Arrays、Collections等

final应用于方法

作用​​:禁止子类重写该方法
​​特点​​:

  • 子类不能重写(override)该方法
  • 但可以被继承和调用
  • 常用于​​防止核心算法被修改​

典型应用​​:
模板方法模式中的固定步骤
安全相关的方法(如加密算法)

final应用于变量

成员变量

​​特点​​:

  • 必须在声明时或构造函数中初始化
  • 初始化后不能被修改
  • 如果是引用类型,引用不可变(对象内容可能可变)
class Circle {private final double radius;  // final成员变量public Circle(double r) {this.radius = r;  // 构造函数中初始化}// 编译错误:不能在普通方法中修改final变量// public void setRadius(double r) { this.radius = r; }
}

静态变量(类常量)

规范​​:

  • 命名全大写,单词间用下划线连接
  • 基本类型直接作为常量使用
  • 引用类型应使用不可变对象
    public static final int MAX_RETRY_COUNT = 3;// 最大重试次数public static final Duration DEFAULT_TIMEOUT = Duration.ofSeconds(30);// 默认超时时间public static final List<String> SUPPORTED_LANGUAGES =Collections.unmodifiableList(Arrays.asList("EN", "ZH", "JP"));//  Java 提供了 Collections.unmodifiableList()方法,使集合变成 ​​只读​​

局部变量

​​特点​​:

  • 一旦赋值后不能被修改
  • 可以延迟初始化(不需要声明时立即赋值)
public class Example {// 成员变量(实例变量)int num1;       // 默认 0static int num2; // 默认 0public void method() {// 局部变量(必须手动初始化)int num3;num3 = 10;System.out.println(num3);  // 正确// int num4;// System.out.println(num4); // 错误:num4 未初始化}
}

final应用于参数

作用​​:

  • 防止参数在方法内被意外修改
  • 明确表达参数不应改变的意图
public class Main {public static void main(String[] args) {printName("Bob");  // 输出:Name: Bob}public static void printName(final String name) {// name = "Alice";  // ❌ 编译错误:不能修改 final 参数System.out.println("Name: " + name);}
}

final应用于对象

  • final只保证引用不变,不保证对象内容不变
public class FinalObjectDemo {public static void main(String[] args) {// 创建final对象引用final Person person = new Person("Alice", 25);// 可以修改对象内部状态person.setAge(26);  // ✅ 允许System.out.println(person);  // 输出: Person[name=Alice, age=26]// person = new Person("Bob", 30);  // ❌ 编译错误:不能修改final引用}
}
http://www.dtcms.com/a/523668.html

相关文章:

  • JVM直接内存和堆内存比例如何设置?
  • Spring Boot 启动时,JVM 是如何工作的?
  • 个性化网站建设开发李沧建网站公司
  • 益品康丰集团:以科技重塑康养未来,让健康触手可及
  • 华为Watch GT 6:运动与科技的完美融合
  • 微算法科技(NASDAQ MLGO)开发基于区块链的差分优化联邦增量学习算法,提高机器学习的性能与安全性
  • 《水龙吟》开播即热 李家豪化身“阳光侠客”点亮玄侠江湖
  • Linux基础 -- UBI模块之 leb_read_sanity_check函数说明
  • 深入解析 Transformer 模型:以 ChatGPT 为例从词嵌入到输出预测的大语言模型核心工作机制
  • 破局延时任务(上):为什么选择Spring Boot + DelayQueue来自研分布式延时队列组件?
  • 云手机是一种应用软件吗?
  • 工业无线通信突破!SG-Lora-TCP 模块,7 公里无线替代 TCP 布线
  • 网站建设 服务内容 费用上海有几个区最好
  • 现代前端状态管理深度剖析:从单一数据源到分布式状态
  • UART 串口协议详解与 STM32 实战实现
  • 【CMakeLists.txt】QtSvg 头文件包含配置详解
  • 调用Zlib库接口压缩、解压缩(C++源码)
  • flume的log4j日志无输出排查
  • 一个域名可以做两个网站吗天津人事考试网
  • whisper 模型处理音频办法与启示
  • linux rt任务调度器
  • 金融智能体技术解读:十大应用场景与AI Agent架构设计思路
  • 永磁同步电机(PMSM)在MATLAB中的高级调参策略与实践
  • 李宏毅机器学习笔记31
  • 【timecode】两种不同的时间码格式:“`00:00:00`” 和 “`00:00:00:00`”
  • 个人网站 不用备案深圳建设网站和公众号
  • npm 安装 canvas 报错 node-gyp ERR! 的解决方法(Windows 系统)
  • 编辑器汇总:Neovim、Helix、Vim、LazyVim、Kakoune、nb、Lite XL
  • 如何开发一个自己的包并发布到npm
  • 商城型网站的概念企业信息平台登录