一、final
final可以用来修饰类、方法、变量。
final修饰类则该类不能被继承扩展。如String就是final类。
final修饰方法,当该方法所属的类被继承时,方法不能被重写。
final变量是不能被修改的。final修饰基本类型变量,变量的值无法被修改;final修饰引用型变量,不能再指向其他对象,但是它指向的对象的内容是可变的。
final StringBuilder sb = new StringBuilder("a");
sb.append("b");
System.out.println(sb); //ab
final StringBuilder sb = new StringBuilder("a");
sb = new StringBuilder("ab"); //无法赋值
二、finally
finally是保证重要代码一定被执行到的一种机制。try-finally或try-catch-finally中finally块能保证try语句结束时资源能被关闭。
三、finalize
(1)finalize在对象被垃圾收集前调用,是由垃圾收集器在对象不再被引用时对这个对象调用的。
(2)垃圾回收只回收内存,并且只回收内存中创建对象所占用的那部分内存(堆内存),其他资源如文件操作的句柄,数据库连接是无法回收的。java提供finalize可以对这些资源释放。
(3)垃圾回收只有在内存即将用完时才会释放资源,能不回收就不回收,因为垃圾回收本身也是有开销的,当程序正常退出,申请的资源会自动交还给操作系统。调用System.gc() 也无法保证垃圾回收的运行。因此对象不一定被回收,finalize()不一定会被调用。垃圾回收器以独立的低优先级方式运行,就算finalize()被调用,它的调用时间也是不确定的,因为程序中其他线程的优先级远远高于执行finalize()线程的优先级。
(4)finalize无法保证什么时候执行,执行的是否符合预期,使用不当会影响性能,导致程序死锁挂起等,因此是不建议使用的,java9中已经明确将 Object.finalize() 标记为 deprecated。