每日一道面试题之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 来代替。

相关文章
|
3月前
|
Android开发 Kotlin
Android经典面试题之Kotlin的==和===有什么区别?
本文介绍了 Kotlin 中 `==` 和 `===` 操作符的区别:`==` 用于比较值是否相等,而 `===` 用于检查对象身份。对于基本类型,两者行为相似;对于对象引用,`==` 比较值相等性,`===` 检查引用是否指向同一实例。此外,还列举了其他常用比较操作符及其应用场景。
193 93
|
28天前
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
24 1
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
31 3
|
2月前
|
编译器
经典面试题:变量的声明和定义有什么区别
在编程领域,变量的“声明”与“定义”是经典面试题之一。声明告诉编译器一个变量的存在,但不分配内存,通常包含变量类型和名称;而定义则为变量分配内存空间,一个变量必须至少被定义一次。简而言之,声明是告知变量形式,定义则是实际创建变量并准备使用。
|
2月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
142 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
前端开发 小程序 JavaScript
面试官:px、em、rem、vw、rpx 之间有什么区别?
面试官:px、em、rem、vw、rpx 之间有什么区别?
48 0
|
3月前
|
Java 关系型数据库 MySQL
面试官:GROUP BY和DISTINCT有什么区别?
面试官:GROUP BY和DISTINCT有什么区别?
96 0
面试官:GROUP BY和DISTINCT有什么区别?
|
4月前
|
算法 Java
【多线程面试题十八】、说一说Java中乐观锁和悲观锁的区别
这篇文章讨论了Java中的乐观锁和悲观锁的区别,其中悲观锁假设最坏情况并在访问数据时上锁,如通过`synchronized`或`Lock`接口实现;而乐观锁则在更新数据时检查是否被其他线程修改,适用于多读场景,并常通过CAS操作实现,如Java并发包`java.util.concurrent`中的类。
|
4月前
|
Java
【多线程面试题十三】、说一说synchronized与Lock的区别
这篇文章讨论了Java中`synchronized`和`Lock`接口在多线程编程中的区别,包括它们在实现、使用、锁的释放、超时设置、锁状态查询以及锁的属性等方面的不同点。