final finally finalize的区别

1、final 修饰符:final 可以用于修饰类、方法和变量。

  • 修饰类:表明该类不可被继承,无法派生新的子类。
  • 修饰方法:该方法不能被重写。
  • 修饰变量:只能在申明变量时或构造方法中赋值,一旦赋值了就不能在改变。

2、finally
在使用try{} catch(){} 时可以在其后加上finally{}也可以不加。如果加上,无论是否发生异常都会执行finally快中的代码,因此我们可以在其中处理资源的释放。

3、finalize方法
finalize方法是Object中的方法,因此所有的类都具有这个方法,它类似于C++的析构函数。在java中如果垃圾收集器发现一个对象不存在任何的引用指向它(或者说是不可达的),就会去回收这个对象,在回收之前会调用该对象的finalize方法,但是JVM不保证这个方法总被调用。通常我们不会使用这个方法,java也不建议使用。

关于finalize方法补充:
在垃圾回收器回收对象之前会调用finalize方法,因此我们可以通过这个方法让对象自我救赎,只需要在该方法中让一个引用重新指向它,这样对象就不会被回收了。不过需要注意的是该方法只会运行一次,如果下次垃圾回收器执行时,再检测到没引用指向它,不会再调用finalize方法了。

finalize()方法会执行的两个条件:

  1. 重写了finalize()方法。
  2. finalize()方法之前没被调用过。
//User.class
public class User{
    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize方法执行...");
        //让一个引用指向它
        Main.user=this;
    }
}

//Main .class
public class Main {

    public static User user;
    
    public static void main(String[] args) throws InterruptedException {
       user=new User();
       user=null;//此时没有引用指向User对象

        System.gc();//运行垃圾收集器
        TimeUnit.SECONDS.sleep(2);
        if (user!=null){
            System.out.println("我被拯救了,user重新指向我");
        }else {
            System.out.println("我没被拯救");
        }

        user=null;
        System.gc();//运行垃圾收集器
        TimeUnit.SECONDS.sleep(2);
        if (user!=null){
            System.out.println("我被拯救了,user重新指向我");
        }else {
            System.out.println("我没被拯救");
        }
    }
}

打印:

finalize方法执行...
我被拯救了,user重新指向我
我没被拯救
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值