final、finally、finalize

这三个本质上没什么关系,由于长得比较像给人一种假象认为他们之间有联系

final:

可以用来修饰类、方法、变量,分别有不同的意义,final修饰的类达标不可以被继承,final修饰的变量是不可以被修改的,而final修饰的方法也是不可以被重写的

一些应用场景:

可以将方法或者类申明为final,这样可以明确的告诉别人,这些是不可以被修改的

使用final修饰参数或者变量,也可以清楚的避免意外赋值导致的编程错误

final变量产生了某种程度的不可变效果,所以可以用于保护制度数据,尤其是在并发编程中,有利于减少额外的同步开销,也可以省去一些防止被拷贝的必要

注意:

final不是不可变

比如当final修饰一个集合的时候,final只能约束集合这个引用不可以被赋值,但是不能影响对象的一些行为,比如添加元素等操作

如果要实现一个不可变的类

将class使用final修饰

将所有的成员变量定义为private和final,并且不能实现setter方法

通过构造函数初始化成员是,进行深拷贝

在getter方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝

finally:

是Java保证重点代码一定要被执行的一种机制。我们一般使用try-finally或者try-catch-finally来进行一些回收资源操作

    注意:finally也不是一定会被执行,以下这些情况是不会被执行的

1、无限循环

try{
			while(ture){
			Log.d(TAG, "111");
			}
			}finally{
			Log.d(TAG, "222");
			}

                        2、try-catch异常退出

try{
			system.exit(1)
			}finally{
			Log.d(TAG, "222");
			}

                        3、执行try-finally的线程被杀死


finalize:

                保证对象在被垃圾收集前完成特定资源的回收。不推荐使用

如果没有特别的原因,不要事先finalize方法,也不要利用它来进行资源回收,因为无法保证finalize什么时候被执行,执行的是否符合预期效果。如果使用不当还会造成程序死锁

目前Java正在使用Cleaner来替换掉finalize。Cleaner的实现利用了幻想引用。利用了幻想引用和引用队列可以保证对象被销毁前做一些类似资源回收的工作,比如关闭文件描述符,它比finalize更加轻量、更加可靠。每个Cleaner都有自己的运行线程,可以避免意外死锁等问题。

猜你喜欢

转载自blog.csdn.net/qq_36447701/article/details/80570781