在java中final、finally、finalize三者在写法上很相近,可是实际含义和做用倒是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别java
1.finaljvm
属性:java中的关键字,修饰符spa
做用:用于修饰类、成员方法、变量(成员变量、局部变量)3d
用法:若是类被声明为final,那么该类就不能再派生出新的子类,也不能看成父类被子类继承。一个类不能同时被声明为抽象类(absrtact修饰)和final的类;若是成员方法被声明final,那么该方法只能使用,不能重载;若是变量(成员变量、局部变量)被声明为final,那么必须在声明时给定初始化的值,在后面的引用中只能读取,不可修改值。对象
注意:1.类被声明为final,类中的全部成员方法都会被隐式地指定为final方法; 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,不然编译时会报错; 3.在匿名类(内部类)中全部变量都必须是final变量; 4.在接口中声明的全部变量自己是final的; 5.若是基本数据类型的变量被声明为final,则其数值一旦在初始化以后便不能更改blog
若是引用类型的变量被声明为final,则在对其初始化以后便不能再让其指向另外一个对象,但该对象的内容是能够改变的继承
6.当final变量是基本数据类型以及String类型时,在编译期间是知道它的确切值,那么编译器会把它当作编译期常量,在用到该final变量的地方,至关于直接访问的这个常量接口
只有在编译期间能肯定final变量值的时候才会被当编译常量,如下是编译时不知道肯定值的内存
2.finally资源
属性:异常处理时的finally块
做用: try { 正常逻辑 } catch(Exception e) { 异常逻辑 } finally{ 必定会被执行的逻辑 }
用法:异常处理(try catch)时finally块不管有没有异常发生,finally块的代码必定会被执行,因此在程序中有须要不管发生什么都必须执行的代码,就能够放在finally块中,最多见流关闭等释放资源的操做
注意:1.finally代码块不管有没有异常发生,finally块的代码必定会被执行; 2.即便try里包含continue、break、return语句,try块结束后,finally块也会执行; 3.finally中最好不要包含return,不然程序会提早退出,返回值不是try或catch中保存的返回值
3.finalize
属性:方法名,Object中的方法
做用:finalize()方法是在垃圾收集器删除对象以前对这个对象调用
用法:Java中使用finalize()方法在垃圾收集器将对象从内存中清除出去以前(GC以前)作必要的清理内存的工做。这个方法是在垃圾收集器确认一个对象没有被引用时对这个对象调用的。它在Object类中定义的,全部的类都继承了它。子类覆盖finalize()方法已整理系统资源或者执行其余清理工做。finalize()方法是在垃圾收集器删除对象以前对这个对象调用的
注意:1.垃圾回收器要回收对象的时候,首先要调用这个类的finalize方法
2.程序退出时为每一个对象调用一次finalize方法
3.当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,可是jvm不保证finalize()必定被调用
4.finalize()方法被关键字protected修饰是防止在该类以外定义的代码访问finalize()标识符
5.finalize()方法的主要用途是释放一些其余作法开辟的内存空间,以及作一些清理工做
6. 一旦垃圾回收器GC准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工做。只有到下一次再进行垃圾回收动做的时候,才会真正释放这个对象所占用的内存空间
7.finalize()如今已经不推荐使用了,java9已经设置为deprecated了