技术思考--谈谈final、finally、 finalize有什么不同?

问题思考

final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,final的变量是不可以修改的,而final的方法也是不可以重写的(override)。总的来说用final修饰的是不可以进行更改。

finally则是Java保证重点代码一定要被执行的一种机制。我们在try-catch-finally中必须关闭io流、jdbc连接等操作。

fnalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。fnalize机制现在已经不推荐使用,并且在JDK 9开始被标记为deprecated。

结合项目中的应用:

1.final可以修饰类或方法,让别人清楚类不能进行修改,方法不能重写,可以有效避免开发者修改基础功能

2.使用final修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误,该变量不可进行重新赋值,但对于引用变量来说只是这个对象不能进行赋值,对象中的属性还是可以进行赋值的

知识拓展


一、finalize是一种已经被业界证明了的非常不好的实践,为什么会导致这些问题?

finalize的执行是和垃圾收集关联在一起的,一旦实现了非空的fnalize方法,就会导致相应对象回收呈现数量级上的变慢,有人专门做过benchmark,大概是40~50倍的下降。因为,finalize是在对象被垃圾收集前调用,这就意味着实现了finalize方法的对象是个“特殊公民”,JVM要对它进行额外处理。fnalize本质上成为了快速回收的阻碍者,可能导致对象经过多个垃圾收集周期才能被回收。

二、有什么机制可以替换finalize吗?

Java平台目前在逐步使用java.lang.ref.Cleaner来替换掉原有的finalize实现。

三、列几个 fianlly 不会被执行的情况:

1. try-catch 异常退出。

   try{

         system.exit(1)

   }finally{

         print(abc)

   }

2. 无限循环

try{

       while(ture){

            print(abc)

       }

 }fnally{

      print(abc)

 }

3. 线程被杀死

当执行 try,fnally 的线程被杀死时。fnally 也无法执行。

总结:

1、不要在 fnally 中使用 return 语句,

2、fnally 总是执行,除非程序或者线程被中断。


四、String类为什么要设计成final?

String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。String是不可变的关键都在底层的实现,而不是一个final。不可变的好处是安全。

你可能感兴趣的:(技术思考--谈谈final、finally、 finalize有什么不同?)