final finally 和 finalize的区别

news/2024/5/17 19:02:58

final、finally和finalize都是Java中的关键字,但它们的含义和用途却不同。

  • final 表示不可变,用于修饰类、方法和变量。

  • finally 表示无论如何都会执行的代码块,用于清理资源和恢复现场。

  • finalize 是Object类的一个方法,用于在对象被垃圾收集器回收之前释放资源和清理工作。

1.final

final是Java语言的关键字,可以用来修饰类、方法、变量等,表示这些元素是不可变的,一旦被赋值之后就不能再进行修改。final的作用如下:

  • 用于修饰类,表示该类不能被继承。
  • 用于修饰方法,表示该方法不能被子类重写。
  • 用于修饰变量,表示该变量只能被赋值一次,且不能被重新赋值。
  • 用于修饰方法参数和局部变量,表示它们只能被赋值一次,且不能被重新赋值。

代码示例:

public final class MyClass { // 该类不能被继承
    public final int num = 100; // 变量只能被赋值一次,且不能被重新赋值

    public final void myMethod(final int arg) { // 参数只能被赋值一次,且不能被重新赋值
        final int localVar = 200; // 局部变量只能被赋值一次,且不能被重新赋值
        System.out.println(num + arg + localVar);
    }
}

2.finally

finally是Java语言的关键字,用于定义在try-catch块中的一个代码块,在任何情况下,无论是否发生异常,该代码块都会被执行。finally块经常用于清理资源和恢复现场。

代码示例:

FileInputStream fis = null;
try {
    fis = new FileInputStream("test.txt");
    // 处理fis
} catch (FileNotFoundException e) {
    // 处理文件不存在异常
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            // 处理关闭文件流异常
        }
    }
}

3.finalize

finalize是Java中一个Object类的protected方法,当一个对象即将被垃圾收集器回收时,会自动调用该对象的finalize()方法。子类可以重写该方法进行资源释放或类似的清理工作。但应该避免过度依赖该方法,因为不保证一定会执行,原因如下:

  • finalize()方法的执行时间不确定,它的调用是由JVM中某个优化算法所决定的,具体时间无法预测。

  • finalize()方法的调用依赖于垃圾回收器的工作机制,如果垃圾回收器没有运行或者没有回收相应的对象,那么finalize()方法也不会被调用。

  • finalize()方法的调用只有在对象被回收之前才会被执行,如果存在引用链或者存在其他原因导致对象没有被回收,那么finalize()方法就不会被调用。

  • 由于finalize()方法只会被执行一次,如果该方法由于某些原因抛出异常,那么这个对象的finalize()方法就不会再被调用,可能会造成资源泄漏等问题。

代码示例:

public class MyClass {
    @Override
    protected void finalize() throws Throwable {
        // 资源释放或清理工作
        super.finalize();
    }
}


http://www.niftyadmin.cn/n/409319.html

相关文章

【日志解析】【启发式】Drain:一种用于日志解析的深度解析树

Drain:An Online Log Parsing Approach with Fixed Depth Tree 文章目录 Drain:An Online Log Parsing Approach with Fixed Depth Tree1 论文出处2 背景2.1 背景介绍2.2 针对问题2.3 创新点 3 主要设计思路3.1 Drain整体结构3.2 具体步骤 4 实验设计5 个…

chatgpt赋能python:Python平铺图片的SEO优化

Python平铺图片的SEO优化 在网站设计中,图片是一个重要的元素。但是,使用大量的图片会导致网站加载速度变慢,从而影响用户的体验。为了解决这个问题,我们可以使用平铺图片,这样可以减小图片的大小,提高网站…

一、人像分割

开源PP-HumanSegl模型,提供了三个高质量的人像分割模型:有应用于服务端GPU部署的PP-HumanSegl模型,有适用于移动端的轻量PP-HumanSeg模型,还有能够在浏览器部署的超轻量模型PP-HumanSegs模型。 近期百度视频会议 上线了虚拟背景功能,支持在网页端视频会议时进行背景切…

Keras-3-实例2-多分类问题

1. 多分类问题: 1.1 路透社数据集加载 路透社数据集由路透社在1986年发布,包含46个不同的主题:某些主题样本较多,某些较少,但是训练集中每个主题都至少含有10个样本。 from keras.datasets import reuters(train_da…

【集群】LVS负载均衡群集(一)

文章目录 前言一、企业群集应用概述1. 群集的含义1.1 群集的特点1.2 扩展服务器的方式 2. 群集的类型2.1 负载均衡群集(Load Balance Cluster)2.2 高可用群集(High Availability Cluster)2.3 高性能运算群集(High Perf…

总结893

学习目标: 月目标:6月(线性代数强化9讲,背诵15篇短文,考研核心词过三遍) 周目标:线性代数强化3讲,英语背3篇文章并回诵,检测 每日必复习(5分钟)…

Rust每日一练(Leetday0024) 爬楼梯、简化路径、编辑距离

目录 70. 爬楼梯 Climbing Stairs 🌟 71. 简化路径 Simplify Path 🌟🌟 72. 编辑距离 Edit Distance 🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专…

Java程序执行流程

Java程序执行的整个过程可以分为三个阶段:编译、加载和运行 1.编译 Java程序的源代码需要经过编译器(例如javac)的编译,将其转换成字节码(即.class文件),这个过程称为编译。编译器会对源代码中…