温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

final、finally、finalize的详细分析

发布时间:2020-08-10 01:26:07 来源:ITPUB博客 阅读:182 作者:ckxllf 栏目:编程语言

  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方法

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI