finalfinally与finalize的区别
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了finalfinally与finalize的区别相关的知识,希望对你有一定的参考价值。
参考此博文整理:https://www.cnblogs.com/ktao/p/8586966.html
一、final
1、final 的理解
- 在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。
2、final 修饰类的理解
- 当用final修饰类的时,表明该类不能被其他类所继承。当我们需要让一个类永远不被继承,此时就可以用final修饰,但要注意:final类中所有的成员方法都会隐式的定义为final方法。
3、final 修饰方法的理解
-
当用final修饰方法时,把方法锁定,以防止继承类对其进行更改。final方法意味着“最后的、最终的”含义,即此方法不能被重写。
-
注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。
4、final 修饰变量的理解
-
final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
-
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化。
-
当final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
-
final修饰一个成员变量(属性),必须要显示初始化。
二、finally
1、finally的理解
- finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。(这句话其实存在一定的问题)
2、执行try语句块之前已经返回,try对应的finally语句并没有执行。
3、执行try语句块之前抛出异常,try对应的finally语句并没有执行。
4、执行 try 语句块或者 catch 语句块时者被终止(killed),与其相对应的 finally 语句块可能不会执行。
5、执行 catch 语句块时者被终止(killed),与其相对应的 finally 语句块可能不会执行。
6、在try-catch-finally语句中都执行return语句,finally块中的代码retrun会执行。
package com.xz.springsecuritydemo.test;
/**
* @description:
* @author: xz
* @create: 2021-09-06 21:12
*/
public class Test1 {
public static int test(String str){
try{
System.out.println("进入try语句");
return str.charAt(0)-'0';
}catch(NullPointerException e1){
System.out.println("进入catch语句 NullPointerException");
return 1;
}catch(StringIndexOutOfBoundsException e2){
System.out.println("进入catch语句 StringIndexOutOfBoundsException");
return 2;
}catch(Exception e3){
System.out.println("进入catch语句 Exception");
return 3;
}finally {
System.out.println("进入finally语句");
return 4;
}
}
public static void main(String[] args) {
System.out.println("第1次执行=================");
int a=test("1");
System.out.println("第2次执行==============");
System.out.println(test("2"));
System.out.println("第3次执行=================");
System.out.println(test("3"));
}
}
- 首先finally语句在改代码中一定会执行,从运行结果来看,每次return的结果都是4(即finally语句),仿佛其他return语句被屏蔽掉了。
- 事实也确实如此,因为finally用法特殊,所以会撤销之前的return语句,继续执行最后的finally块中的代码。
三、finalize
- finalize()是在java.lang.Object里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
- 特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
- 使用finalize还需要注意一个事,调用super.finalize();
- 一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。
以上是关于finalfinally与finalize的区别的主要内容,如果未能解决你的问题,请参考以下文章