每日一道面试题之final、finally、finalize 有什么区别?

简介: 每日一道面试题之final、finally、finalize 有什么区别?

final:

final是Java中的关键字,用于修饰变量、方法或类,被final修饰的类表示该类不能被继承,被final修饰的变量表示该变量不能赋新的值,被final修饰的方法表示该方法不能被重写.


finally:

finally是Java中的关键字,用于定义在try-catch语句块中的一个代码块,无论是否发生异常都会执行finally代码块中的语句,常用于一些流的关闭。


finalize:

finalize是Java中Object类中的一个方法,用于在垃圾回收器回收对象之前执行一些清理操作,是一个对象的终结方法

如下所示为该方法的源码:

    protected void finalize() throws Throwable { }
}
/*Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.  A subclass overrides the finalize method to dispose of system resources or to perform other cleanup. 
The general contract of finalize is that it is invoked if and when the Java™ virtual machine has determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, except as a result of an action taken by the finalization of some other object or class which is ready to be finalized.  The finalize method may take any action, including making this object available again to other threads;  the usual purpose of finalize, however, is to perform cleanup actions before the object is irrevocably discarded.  For example, the finalize method for an object that represents an input/output connection might perform explicit I/O transactions to break the connection before the object is permanently discarded. 
The finalize method of class Object performs no special action;  it simply returns normally.  Subclasses of Object may override this definition. 
The Java programming language does not guarantee which thread will invoke the finalize method for any given object.  It is guaranteed, however, that the thread that invokes finalize will not be holding any user-visible synchronization locks when finalize is invoked.  If an uncaught exception is thrown by the finalize method, the exception is ignored and finalization of that object terminates. 
After the finalize method has been invoked for an object, no further action is taken until the Java virtual machine has again determined that there is no longer any means by which this object can be accessed by any thread that has not yet died, including possible actions by other objects or classes which are ready to be finalized, at which point the object may be discarded. 
The finalize method is never invoked more than once by a Java virtual machine for any given object. 
Any exception thrown by the finalize method causes the finalization of this object to be halted, but is otherwise ignored.*/'
/*当垃圾回收确定不再有对对象的引用时,由垃圾回收器对对象调用。子类覆盖finalize方法以处置系统资源或执行其他清理。
finalize的一般约定是,当Java虚拟机确定不再有任何方法可以让任何尚未死亡的线程访问该对象时,它将被调用,除非是由于其他一些准备结束的对象或类的结束所采取的操作。finalize方法可以采取任何动作,包括使该对象再次对其他线程可用;然而,finalize的通常目的是在不可撤销地丢弃对象之前执行清理操作。例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式的I/O事务来中断连接。
类Object的finalize方法不执行任何特殊操作;它只是正常返回。Object的子类可以覆盖这个定义。
Java编程语言不保证哪个线程将为任何给定对象调用finalize方法。但是,可以保证调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。如果finalize方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。
在finalize方法被对象调用之后,在Java虚拟机再次确定没有任何方法可以让任何尚未死亡的线程访问该对象之前,不会采取任何进一步的操作,包括准备结束的其他对象或类的可能操作,此时该对象可能被丢弃。
Java虚拟机对任何给定对象调用finalize方法的次数永远不会超过一次。
finalize方法抛出的任何异常都会导致此对象的终结终止,但会被忽略。*/

简单点说:finalize方法一般情况下并不需要我们去实现,而是在对象被 GC 回收之前通过由垃圾回收器对对象调用,当垃圾回收器确定不再有对对象的引用时,垃圾回收器会在某个时间回收该对象,并在回收之前调用该对象的 finalize() 方法,在 finalize() 方法中,可以对该对象进行一些清理工作,如释放一些资源等,但finalize的通常目的是在不可撤销地丢弃对象之前执行清理操作。例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式的I/O事务来中断连接,但是应该注意的是,finalize() 方法的执行时间是不确定的,甚至有可能不执行。因此,不应该在 finalize() 方法中依赖于执行的顺序或时间。


另外,在 Java 9 及其之后的版本中,finalize() 方法已被废弃,建议使用 Cleaner API 来代替。

相关文章
|
7天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
38 9
|
12天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
43 12
|
11天前
|
编译器 Android开发 开发者
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
Lambda表达式和匿名函数都是Kotlin中强大的特性,帮助开发者编写简洁而高效的代码。理解它们的区别和适用场景,有助于选择最合适的方式来解决问题。希望本文的详细讲解和示例能够帮助你在Kotlin开发中更好地运用这些特性。
25 9
|
2月前
|
Java
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
今日分享的主题是如何区分&和&&的区别,提高自身面试的能力。主要分为以下四部分。 1、自我面试经历 2、&amp和&amp&amp的不同之处 3、&对&&的不同用回答逻辑解释 4、彩蛋
|
3月前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
102 14
|
2月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
3月前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
4月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
50 3
|
4月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
293 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
4月前
|
前端开发 小程序 JavaScript
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
89 0

热门文章

最新文章