final,finally,finalize的区别

    final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 

    finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。在Java语言的异常处理中,finally块的作用就是为了保证无论出现什么情况,finally块里的代码一定会被执行。由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,
因此任何语句要执行都只能在return前执行(除非碰到exit函数),因此finally块里的代码也是在return之前执行的。此外,如果try-finally或者catch-finally中都有return,那么finally块中的return将会覆盖别处的return语句,最终返回到调用者那里的是finally中return的值。 

    finalize—通过GC Roots对象做起点,从节点往下搜索,搜索路径成为引用链。如果从GC Roots到对象不可达,则判死缓。可达性分析中判定为不可达的对象会被标记为不可达,之后要进行第二次筛选,筛选条件判断此对象是否有必要执行finalize方法。如果对象没有覆盖finalize方法或者
finalize方法被虚拟机调用过(只调一次),都将被视为没有必要执行!    如果这个对象被判定有必要执行finalize方法,那么这个对象会被放置在FQueue队列,并由一个虚拟机自动建立的低优先级的finalizer线程去执行,如果该线程发生了死循环,运行缓慢等因素,也会被干掉。如果执行成功,即与引用链的任意对象建立关联,都会成功活下来

猜你喜欢

转载自blog.csdn.net/qq_31615049/article/details/80291955