final、finally、 finalize 有什么不同?

1、final

final 是 java 中的关键字,可用于修饰类,方法,变量。

推荐使用 final 关键字来明确表示我们代码的语义、逻辑意图,这已经被证明在很多场景下是非常好的实践。
当修饰类时,表明这个类不可被继承。Java 中有一些核心类都被 final 修饰了,比如 String,System。当考虑到安全性原因时,可以将该类设计成 final。

当修饰方法时,表明该方法不可被重写。一般是某些流程控制不希望被修改掉时,可以将这些方法声明成 final,比如 View 中的 measure(),requestFocus(),findViewById()。

当修饰变量时,表明该变量为常量,不允许被重新赋值,因此声明成 final 的变量都需要显示的进行赋值,否则编译会报错。所以,可以用于保护只读数据,尤其是在并发编程中,因为明确地不能再赋值 final 变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。

2、finally

finally 则是 Java 保证重点代码一定要被执行的一种机制。通常的用法都是在 finally 里进行一些资源的关闭,回收。比如 IO 流的关闭等等。

不要在finally代码块中处理返回值。

注意以下这种情况finally是不会被执行的。

try {
  // do something
  System.exit(1);
} finally{
  System.out.println(“Print from finally”);
}

3、finalize

finalize 是基础类 java.lang.Object的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。

finalize 机制现在已经不推荐使用,并且在 JDK 9开始被标记为 deprecated。

为什么呢?简单说,你无法保证 finalize 什么时候执行执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。如果确实需要额外处理,可以考虑 Java 提供的 Cleaner可以考虑 Java 提供的 Cleaner 机制或者其他替代方法。

Java 平台目前在逐步使用 java.lang.ref.Cleaner 来替换掉原有的 finalize 实现。Cleaner 的实现利用了幻象引用(PhantomReference),这是一种常见的所谓 post-mortem 清理机制。

你可能感兴趣的:(final、finally、 finalize 有什么不同?)