文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

农行一 面:说说 final,finally,finalize 的区别

2024-11-29 18:06

关注

final

final是一个保留关键字,用于修饰类、方法和变量。在 Java 中,final 关键字的主要作用是限制,并且确保某些行为不会被改变。主要表现如下:

下面给出几个 final的使用示例:

final变量:用于创建常量,在定义时必须初始化,减少错误和提高易读性:

final double PI = 3.14159;

final方法:确保方法的一致性和安全性,避免被子类篡改:

public final void display() {
    System.out.println("This is a final method.");
}

final类:类被声明为 final,意味着这个类不能被继承。这确保了类的实现不能被其他类修改或扩展。

public final class Constants {
    public static final String APP_NAME = "FinalDemoApp";
}

finally

finally 是 Java 中的一个关键字,主要用于异常处理结构中。它通常与 try 和 catch 块联用,是异常处理机制中一个非常重要的部分。finally 的执行是几乎保证的,无论是否发生异常,即便在 try 块中有 return、break 或者 continue 语句,finally 块仍然会执行。但有极少数情况下可能不会执行,例如:

使用场景

在实际处理异常时,finally 块用于保证一些重要的清理操作,例如关闭资源,释放锁等,通常用于处理以下 3种场景:

(1) 资源管理

在编程实践中,资源(如文件、数据库连接、网络连接等)的管理非常重要。finally 块可以用来确保这些资源在使用后被正确关闭、释放,避免资源泄漏。如下示例代码:

FileInputStream fileInput = null;
try {
    fileInput = new FileInputStream("example.txt");
    // 处理文件
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fileInput != null) {
        try {
            fileInput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2) 恢复状态

在异常处理过程中,系统可能会因为异常而处于一种不一致的状态。finally 块可以用来清理或者恢复这种状态,例如重置修改过的变量。如下示例代码:

Lock lock = new ReentrantLock();
try {
    lock.lock();
    // 执行一些可能抛出异常的操作
} finally {
    lock.unlock(); // 确保锁总是会被释放
}

(3) 清除事务

在事务处理中,无论事务是否成功,finally 块可以用来保证事务的闭合或清理等后续操作。例如在数据库事务中,确保连接关闭。如下示例代码:

Connection conn = null;
try {
    conn = DriverManager.getConnection(DB_URL, USER, PASS);
    conn.setAutoCommit(false);
    // 执行多步数据库操作,可能抛出异常
    conn.commit(); // 提交事务
} catch (SQLException e) {
    if (conn != null) {
        try {
            conn.rollback(); // 回滚事务
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    e.printStackTrace();
} finally {
    try {
        if (conn != null) conn.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

finalize

finalize() 是 JavaObject 类的一个方法,它允许对象在被垃圾收集器回收之前执行清理操作。尽管在早期的 Java 版本中,finalize() 方法被设计用于释放对象所持有的非 Java 语言的资源,例如关闭文件或网络连接,但是在现代 Java 开发中,finalize() 已不再被推荐使用,其原因主要在于它的许多不确定性和低效性。Oracle 已建议开发者使用其他方式进行资源管理,尤其是在 Java 9 及以后版本中,finalize() 已被标记为过时(deprecated)。

1.finalize() 的基本原理

(1) 垃圾回收机制:

(2) 生命周期:

2.使用 finalize() 的问题

不确定性:Java 的垃圾回收器无法保证 finalize() 方法会在对象死亡后立即执行。执行时间实际上是由 JVM 的垃圾收集来决定,这可能导致延迟清理和资源延迟释放。

使用示例:

public class MyClass {
  @Override
  protected void finalize() throws Throwable {
    // 执行一些清理操作
  }
}

三者对比

控制级别:

用途:

总结

本文我们详细地分析了final、finally和finalize以及它们之间的对比,实际上它们之间没有什么直接关联,只是单词的前 5个字符相同,所以在很多面试题中,经常把它们放在一起进行对比。对于这 3个关键字或者方法的建议是:

来源:猿java内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯