经典面试题目

2018-10-19  本文已影响0人  冰与河豚鱼
谈谈final,finally,finalize有什么不同?

final可以用来修饰类、方法、变量。final修饰的class代表不可以继承扩;final的变量是不可以修改的,而final的方法是不可以被重写的。
finally是Java保证重点代码一定要被执行的机制。可以使用try-finally、try-catch-finally或try-with-resource来进行类似关闭JDBC连接、保证unlock锁、清理资源等操作。
finalize是基础类java.lang.Object的一个方法,目的是保证对象在被垃圾收集前完成特定资源的回收。

注意点:
try{
  // do something
  System.exit(1);
}finally{
  System.out.println("finally");
}

上面代码中的finally块不会被执行,因为System.exit(1)指非正常退出程序,结束当前正在运行的JVM。

finalize的执行是和垃圾收集关联在一起的,一旦实现了非空的finalize方法,就会导致相应对象回收呈现数量级上的变慢。finalize无法保证垃圾什么时候执行,执行的是否符合预期,使用不当会影响性能,导致程序死锁,挂起。

不要在finally代码块中处理返回值
不要再try代码块中调用return、break或continue语句

final与immutable:
final List<String> str = new ArrayList<>();
str.add("hello");
str.add("world");
List<String> unmodifuableStr = List.of("hello","world");
unmodifuableStr.add("again");

上面代码中final只能约束str这个引用不可以被赋值,但是str对象行为不被final影响,添加元素等操作是完全正常的。如果希望本身是不可变的,那么需要相应的类支持不可变的行为。而List.of方法创建的本身就是不可变List,最后的add方法会抛出异常。

上一篇下一篇

猜你喜欢

热点阅读