final、finally、finalize有什么区别?
典型的回答
- final可以用来修饰类、变量、方法,分别有不同的含义。final修饰类时,该类不可被继承。final修饰变量时该变量不可被修改。final修饰方法时,该方法不可被重写。
- finally是java中保证关键代码一定被执行的一种机制。我们可以使用try-finally、try-catch-finally来关闭io流、JDBC链接、unlock解锁等操作。
- finalize是Objec类中的一个方法。它设计的目的是为了保证对象在垃圾回收之前完成特定资源的回收。finalize机制已不推荐使用了,并且在jdk 1.9后已经被标记为deprecated。
最佳实践
final
- 将方法、类声明为final,明确表示这些行为是不允许被修改的
比如java.lang包下的许多类都被申明成final,在第三方类库的一些基础类中同样如此,这可以有效避免 API 使用者更改基础功能,某种程度上,这是保证平台安全的必要手段。 - 在并发编程中,因为明确地不能再赋值 final 变量,有利于减少额外的同步开销,也可以省去一些防御性拷贝的必要。
finally
对于 finally,明确知道怎么使用就足够了。需要关闭的连接等资源,更推荐使用 Java 7 中添加的 try-with-resources 语句,因为通常 Java 平台能够更好地处理异常情况,编码量也要少很多
try {
// do something
System.exit(1);
} finally{
System.out.println(“Print from finally”);
}
上述代码finally不会被执行
扩展
- 注意,final 不是 immutable。
final List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("world");
List<String> unmodifiableStrList = List.of("hello", "world");
unmodifiableStrList.add("again");
final 只能约束 strList 这个引用不可以被赋值,但是 strList 对象行为不被 final 影响,添加元素等操作是完全正常的。如果我们真的希望对象本身是不可变的,那么需要相应的类支持不可变的行为。在上面这个例子中,List.of 方法创建的本身就是不可变 List,最后那句 add 是会在运行时抛出异常的。(List.of()是JDK9新增的方法)