final、finally 、finalize的区别

1、final
在java中,final可以用来修饰类、方法 和变量(成员变量和局部变量)
1> 修饰类时:当用final修饰类的时候,表明该类不能被其他类所继承,当我们需要让一个类永远不被继承,此时就可以使用final修饰,但要注意:final类中所有的成员都会隐式的定义为final方法。
2>修饰方法:
使用final方法的原因主要有两个:
1、把方法锁定,以防止继承类对其进行更改
2、效率,在早期的版本中,会将final方法转为内嵌调用,但若方法过于庞大,可能在性能上不会有到达的提升
被final修饰的方法,不可以被重写
注意:若父类中final方法的访问权限是private,将导致子类不能直接继承该方法,因此,此时可以在子类中定义相同名的函数,此时不会与重写final的锚段,而是在子类中重新定义了新方法

3>修饰变量
只能被赋值一次
对于修饰的成员变量,赋值可以在三种情况:1、创建的时候赋值
2、在构造代码块中赋值 3、在所有的构造函数中赋值

2、finally
作为异常处理的一部分,它只能用在try/catch语句中,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下
其实上面有一定的问题:
如:


@Test
public void test(){
    int  j = 10/0;
    try{
        int i = 10/0;
        System.out.println("这里执行了一句");
        return;
    }catch (Exception e){
        e.printStackTrace();
    }finally {
        System.out.println("我最终还是执行了");
    }

}

在开始的时候,try块里面还没有执行,这个时候就报错了,fianlly 中的就不会执行,如果执行了try里面的语句报错,则即使里面有return,finally先执行,然后执行return;
finally块不会执行的第二中情景

    @Test
    public void test(){
    
        try{
            int i = 10/0;
            System.out.println("这里执行了一句");
            //强制退出
            System.exit(0);
            return;
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println("我最终还是执行了");
        }

    }

finally块不会执行第三种情景
断电等物理因素

3、finalize
finalize() 是在java.lang.Object 里定义的,也就是说每一个对象都有这么个方法,这个方法在gc启动,该对象被回收的时候被调用,其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定)所以一般是不需要我们去实现finalize的
特殊情况下、需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期有效,那么就需要实现finalize,关闭这个链接
一个对象的finalize方法只会被调用一次,而且finalize()方法被调用不意味着gc会立即回收该对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值