谈谈final、finally、 finalize有什么不同?

1. final;

修饰类:不可被继承

修饰方法:不可重写;

修饰变量:不可修改,只能约束引用不可以被再次赋值。匿名内部类访问局部变量时需要使用 final,因为 Innerclass 实际会 copy 一份局部变量,final 可以防止出现数据一致性问题(但是final有很多方法可以绕过去比如:

    Field field = util.getClass().getDeclaredField("info");

    field.setAccessible(true);

   只要将setAccessible(true)改为true就可以)

2. finally:Java 保证重点代码一定要被执行的机制,try - finally,除非在 finally 前执行了

System.exit(1)(这个是强制停止程序用的 (1)代表无论程序执行或没执行完立刻强制停止,(0)则表示等程序执行完再正常停止)

或者try 中死循环、线程被杀死(这里的杀死指的是杀死了执行finally的这个线程)、另外在finally中不要使用return语句来返回结果否则很有可能会在finally必执行的过程中被修改。

3. finalize:基础类 Object 的一个方法,保证对象在被垃圾收集前完成特定的资源回收。由于 finalize 执行时间不确定且可能造成程序死锁、拖慢垃圾收集等问题,Java 9 中将改方法废弃(finalize能不用就不要用,实在不得已也是可以用的,只不过副作用太强(不确定性和不稳定性太强))

优化:使用 Cleaner 配合幻想引用

补充知识点:

深拷贝与浅拷贝;其实这两个概念的区别就是当在给一个变量赋值时候是否直接使用这个值的内存地址;例如,基础类型都是值传递,所以浅拷贝过来的对象赋值后不会影响之前被拷贝的对象。但是对于引用类型的变量,在拷贝的时候就要考虑了,如果你要使新的对象的赋值不会影响之前被拷贝的对象,就要用深拷贝,否则就是copy的内存地址而已。一个类实现拷贝的功能很简单,有两种方式;要么实现Clone~接口,然后在clone方法里面进行拷贝;要是实现序列化,先把对象写到输入流里面,然后在读出来对象,这样就是一个新的对象了。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值