final:
1.final是Java的关键字之一,用final声明的类,不可被继承,不可派生出新的子类;所以,一个类不能同时被声明为abstract抽象类的和final的类
2.final声明的方法不能被重写,但可以重载。
3.final声明的变量不能被二次赋值,final修饰全局变量必须提前赋值,final修饰局部变量可以先声明在赋值,但要想使用必须赋值。
具体用法如下:
(49条消息) java关键字(final)_Jing<>的博客-CSDN博客
finally:
finally是异常处理语句结构的一部分,不管是否有异常发生,finally模块都会执行。
public final class FinallyTest{
public static void main(String[] args){
try{
throw new NullPointerException();
}catch(NullPointerException e){
System.out.println("程序抛出了异常");
}finally{
//这里总会被执行,不受break,return影响另如数据库连接的close()一般写在这里,可以降低程序的出错几率
System.out.println("执行了finally语句块");
}
}
}
finalize:
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。Java中使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没被引用时对这个对象调用的。它是在Object类中定义的,因此所的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。
它的定义如下:protected void finalize()throws Throwable{},finalize()方法是GC(garbagecollector运行机制的一部分,在此我们只说说finalize()方法的作用是什么呢?finalize()方法是在GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕获的异常(uncaughtexception,GC将终止对改对象的清理,并且该异常会被忽略;直到下一次GC开始清理这个对象时,它的finalize()会被再次调用。请看下面的示例:
public final class FinallyTest{
//重写finalize()方法
protected void finalize() throws Throwable{
System.out.println("执行了finalize()方法");
}
public static void main(String[] args){
FinallyTest ft = new FinallyTest();
ft = null;
System.gc();
}
}
结果:执行了finalize()方法
程序调用了java.lang.System类的gc()方法,引起GC的执行,GC在清理ft对象时调用了它的finalize()方法,因此才了上面的输出结果。调用System.gc()等同于调用下面这行代码:Runtime.getRuntime().gc();调用它们的作用只是建议垃圾收集器(GC启动,清理无用的对象释放内存空间,但是GC的启动并不是一定的,这由JAVA虚拟机来决定。直到 JAVA虚拟机停止运行,些对象的finalize()可能都没被运行过,那么怎样保证所对象的这个方法在JAVA虚拟机停止运行之前一定被调用呢?答案是我们可以调用System类的另一个方法:
public static void FunFinalizersOnExit(boolean value){
//othercode
}
给这个方法传入true就可以保证对象的finalize()方法在JAVA虚拟机停止运行前一定被运行了,不过遗憾的是这个方法是不安全的,它会导致有用的对象finalize()被误调用,因此已不被赞成使用了。由于finalize()属于Object类,因此所类都这个方法,Object的任意子类都可以重写(override该方法,在其中释放系统资源或者做其它的清理工作,如关闭输入输出流。
参考:Java中final、finally、finalize的区别与用法 - smart_hwt - 博客园 (cnblogs.com)