java语言有有很多看起来相似,但用途却完全不同的要素,那么final,finally,finalize又有哪些不同之处呢?
final
final可以用来修饰类、方法、变量,分别有不同的意义,
final修饰的class表示不可以继承扩展
final修饰的变量是不可以修改的
final修饰的方法是不可以重写的
final执行去修饰某个引用,
finally
finally是保证java重点代码执行的一种机制,他可以配合我们的异常机制一起使用,我们可以使用try{}finally{}或者try{}catch(){}finally{}来关闭类似jdbc的连接,保证unlock锁等动作.
finalize
finalize是java的一个方法,它的设计目的是java对象在被垃圾回收器回收之前,完成特定资源的回收,finalize机制现在已经不推荐使用,
在一般情况下不能指望finalize来进行回收资源,为什么呢?简单来说,无法保证finallize什么时候执行,执行是否符合预期,使用不当会影响性能,导致程序死锁,挂掉等。通常来说上面提到的try{}finally{}机制是回收资源的办法,如果特别需要额外处理的话,可以考虑java提供的cleaner机制(垃圾回收机制)或者其他替代方法.
finalize是和垃圾收集相关联的,一但调用finalize方法,就会导致相应的对象回收呈现数量集上的变慢,有人专门做过研究,实现该方法速度大概是40-50倍的下降,因为finallize被设计成在对象本身垃圾回收之前调用,这就意味者实现finalize方法的对象是个特殊供应。cdn要对他进行额外处理,finalize本质上成为快速回收的阻碍,可能导致你的对象经过多个垃圾经期,才能被回收.如果我们告知jvm来回收也是不痛不痒的.就向我们用过的jdbc连接池,其中有一个close方法,他是释放资源的,清空某个池子,以供下回使用,如果我们指望finalize进行回收的话,有可能造成内存溢出.那么只能让他作为程序的守门员.其中finalize也会掩盖一些出错信息.
java用cleaner来替换调finalize的所有实现.利用了幻象引用。这是一个清理机制.利用幻象引用或者队列可以保证资源被释放,他有自己的线程,避免了死锁的情况。
mysqljdbc就用了幻象引用机制。
隐藏的问题
性能,并发,对象生命周期,垃圾回收等过程方面的问题。
推荐使用final关键字来表示我们代码的语义和逻辑密度,这已经被证明在很多场景下的实现,比如我们可以将方法或类声明为final,这样就可以明确告诉别人,这些类和方法是不可以修改的.如果你关心过java的核心类库和源码的话,你就会发现java下的很多类都被声明为final class,这可以防止api使用者改变基础功能,某种情况这是保证平台安全的必要手段,使用final修饰方法或者变量,可以避免意外布局导致的编程错误,甚至有人明确推荐将所有方法参数、本地变量、成员变量声明为final,final在一定程度上产生不可变的效果,所以可以用于保护只读数据,尤其是在并发编程中,因为明确的不能再赋值final变量,有利于减少额外的同步开销,也可以省略防御性拷贝的必要,fianl在很多场景中可以提高性能,利用fianl可能将cdn方法进行内连,可以改善编译器进行编译的能力等等,坦白说很多类似的结果都是基于假设得出的,比如现代高性能cdn判断内敛,未必依赖final的提示,fianl关键字对性能的影响,没有考虑的必要,如果在开发中要想以这样的方式来提高性能,那真的是没有必要.
finally基础笔试题
public class finally_demo{
public static char Label;
public static void main(String[] args){
System.out.println(test_finally());
System.out.println(Label);
}郑州引产手术费用多少钱 https://yiyuan.120ask.com/art/307587.html
public static char test_finally(){
try{
System.out.println('A');
return Label= 'A';
}finally{
System.out.println('B');
Label= 'B';
}
)
}
输出结果:
ABAB
结构分析:
1.这道题考察的点是:return和finally的执行顺序是什么;
执行过程:
前面输出AB,大部分人是没有疑惑的,这是因为Test1方法里面的两个输出语句。
之后,
先将label='A’进行赋值,
后会检测是否存在finally的语句,
有,则执行finally的语句,Label=‘B’,故最终结果Label的值是B!;
最终将return语句返回(此时并不进行赋值操作,Label虽然等于B,但是返回的仍然是刚才尚未执行finally语句前的值)。
创建自定义不可变类需要遵守的规则:
1、使用private和final修饰成员变量。
2、提供带参构造方法,用于初始化成员变量。
3、不要为成员变量提供setter方法。
4、如果成员变量中有可变类时需要重写Object中的hashCode方法和equals方法