final、finally和finalize的区别

final关键字

final是一个修饰符,有一下三种用法:
	1、修饰在类上,表示类不可以被继承
		格式:public final class A{}
	2、修饰在属性上,表示属性为常量,不可被更改
		注意:
			成员属性的常量没有默认值,要初始化
			局部属性(即方法内的属性)的常量有默认值
	3、修饰在方法上,表示该方法不可被重写

finally关键字

含义:
经过异常处理代码块(即经过了try...catch...语句)之后,无论是否产生异常必定会执行的代码块
一般用于资源的释放

注意:
finally代码块不执行的情况有如下情况:
	1、没有进入到try代码块,相应的finally也不会执行
	2、在finally代码块之前调用了System.exit();退出了虚拟机
	3、线程在执行到try代码块后被kill掉,则无法执行finally

在try…catch…代码块中执行了return语句,finally何时执行:

public class Demo1 {
    public static void main(String[] args) {
        Person p = haha();
        System.out.println(p.age);
    }
    public static Person haha(){
        Person p = new Person();
        try{
            p.age = 18;
            return p;       //程序执行到此处时,先将p运算完得到一个需要return的拷贝,但不return
                            //然后去执行finally代码块,执行完毕后,再将刚刚运算得到的p对象return出去
        }catch(Exception e){
            return null;
        }finally {
            p.age = 28;
        }
    }
    static class Person{
        int age;
    }
}

由于p是一个引用类型,所以

运行结果:

28

注意:

如果p是一个基本数据类型:
public class Demo2 {
    public static void main(String[] args) {
        int a = haha();
        System.out.println(a);
    }
    public static int haha(){
        int a = 10;
        try{
            return a;
        }catch(Exception e){

        }finally {
            a = 20;
        }
        return 0;
    }
    static class Person{
        int age;
    }
}

运行结果:

10

finalize方法

是Object类中的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法
注意:
	该方法只会被执行一次
	jdk9之后就不再使用

例:
public class Test{

    public static void main(String[] args) throws Exception{
        Person person = new Person();
        System.out.println("person创建了");
        if (person.p == null){
            System.out.println("Person中的静态属性为空");
        }

        person = null;//将指向该对象的引用置为null
        System.gc();//调用辣鸡肥收器
        Thread.sleep(1000);//确保守护线程工作完毕再继续执行

        if (Person.p != null){
            System.out.println("Person中的静态属性不是空");
        }

        person = Person.p;//重新给person引用赋值
        person.p = null;//并将其中的属性置为空
        person = null;//再将指向该对象的引用置为null
        System.gc();//调用辣鸡肥收器
        Thread.sleep(1000);
        if (Person.p == null){
            System.out.println("Person中的静态属性为空");
        }
    }
}

class Person{
    static Person p;
    @Override
    protected void finalize() throws Throwable {
        System.out.println("finalize方法执行了");
        p = this;
    }
}

运行结果:

person创建了
Person中的静态属性为空
finalize方法执行了
Person中的静态属性不是空
Person中的静态属性为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值