3.谈谈final、finally、finalize有什么不同?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/endlessseaofcrow/article/details/80316347

第3讲:谈谈final、finally、finalize有什么不同?

典型回答:
  • final可以用来修饰类、方法、变量,分别有不同的意义,final修饰的class代表不可以继承扩展,使用final的方法也是不可以重写的(override),但可以被重载。使用final的变量即为常量,常量不能被修改,当final修饰基本类型变量的时候,不能对基本类型变量重新赋值,因此基本类型变量不能被改变;但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。
  • finally则是Java 保证重点代码一定要被执行的一种机制。我们可以使用try-finally或者try-catch-finally来进行类似关闭JDBC 连接、保证unlock锁等动作。
  • finalize是基础类java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize机制现在已经不推荐使用,并且在JDK9开始被标记为deprecated。简单说,你无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。
考点分析:
  • 我们可以将方法或者类声明为final,这样就可以明确告知别人,这些行为是不许修改的,这可以有效避
    免API使用者更改基础功能,某种程度上,这是保证平台安全的必要手段。
  • 使用final修饰参数或者变量,也可以清楚地避免意外赋值导致的编程错误。
  • final 定义的变量,不是必须要在定义的同时完成初始化,也可以在构造方法中完成初始化
知识扩展

final并不等同于immutable,比如

final List<String> strList=new ArrayList<>();
strList.add("Hello");
strList.add("world");

final只能约束strList这个引用不可以被赋值,但是strList对象的行为不被final影响,添加元素等操作时完全正常的,如果我们真的希望对象本身是不可变的,那么需要在相应的类中支持不可变的行为。

那么如何实现immutable的类,我们需要做到:

  • 将class定义为final,这样别人就不能扩展来绕过限制了。
  • 将所有成员变量定义为private和final,并且不要实现setter方法。
  • 通常构造对象时,成员变量使用深度拷贝来初始化,而不是直接赋值,这是一种防御措施,因为你无法确定输入对象不被其他人修改。
  • 如果确实需要实现getter方法,或者其他可能会返回内部状态的方法,使用copy-on-write原则,创建私有的copy。

这些原则在并发编程中经常被提到。

阅读更多

没有更多推荐了,返回首页