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的区别的主要内容,如果未能解决你的问题,请参考以下文章

finalfinally与finalize的区别

Java面试题之finalfinally和finalize的区别

Java中finalfinally和finalize的区别

浅析finalfinally和finalize之间的区分

finalfinally finalize 有什么不同?

finalfinalize 和 finally 的不同之处