基本知识
final可以用来修饰类,方法,变量,分别有不同的意义。final修饰类表示不可以继承扩展;final的变量是不可以修改的;final修饰的方法也是不可以重写的。
finally则是Java保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC连接、保证unlock锁等操作。
finalize是基础类Java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特资源的回收。(现在已经不推荐使用,可能会引发OOM)
实践场景
- 我们可以将方法申明为final,这样可以明确告知别人,这些行为是不允许修改的。
- 使用final修饰参数或者变量,也可以清楚的避免意外赋值到导致的编程错误,甚至有人明确推荐奖所有方法参数、本地变量、成员变量声明成final。
- final变量产生了某种程度的不可变的效果,可以用于保护只读数据,尤其是在并发编程中,因为明确地不能在赋值final变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。
finally知道怎么使用就足够了。在Java7之后更加推荐try-with-resources语句。
public static void main(String [] args){
try(A a = new A();C c = new C()){
a.say();
c.say();
} catch (Exception e) {
System.out.println(e.getSuppressed().toString());
} finally{
System.out.println("finally");
}
}
输出结果
I am A
I am C
C is CLOSED in the close.
A is CLOSED in the close.
java.lang.Exception: Exception A
finally
对于finalize,我们要明确它是不推荐使用的。
知识扩展
final不是immutable(不可变)
如果非要实现immutable的类
- 将class声明为final,这样别人不能通过扩展来绕过限制了
- 将所有成员变量设置为private和final,并且不要实现set方法。
- 采用深度拷贝来初始化值。
匿名内部类访问局部变量的时候为什么要采用final来修饰??? Java内部类会copy一份局部变量,而不是直接去使用局部变量,final可以防止出现数据一致性的问题。
**
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。
CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。它只能保证最终一致性,不能保证实时一致性。**