在java中final、finally、finalize三者在写法上很相近,但是实际含义和作用却是相差甚远。本文主要是来深层的研究下这三者的用法以及之间的区别
1.final
属性:java中的关键字,修饰符
作用:用于修饰类、成员方法、变量(成员变量、局部变量)
用法:如果类被声明为final,那么该类就不能再派生出新的子类,也不能当作父类被子类继承。一个类不能同时被声明为抽象类(absrtact修饰)和final的类;如果成员方法被声明final,那么该方法只能使用,不能重载;如果变量(成员变量、局部变量)被声明为final,那么必须在声明时给定初始化的值,在后面的引用中只能读取,不可修改值。
注意:1.类被声明为final,类中的所有成员方法都会被隐式地指定为final方法; 2. final成员变量必须在声明的时候初始化或者在构造器中初始化,否则编译时会报错; 3.在匿名类(内部类)中所有变量都必须是final变量; 4.在接口中声明的所有变量本身是final的; 5.如果基本数据类型的变量被声明为final,则其数值一旦在初始化之后便不能更改
如果引用类型的变量被声明为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()方法的主要用途是释放一些其他做法开辟的内存空间,以及做一些清理工作
- 一旦垃圾回收器GC准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。只有到下一次再进行垃圾回收动作的时候,才会真正释放这个对象所占用的内存空间
7.finalize()现在已经不推荐使用了,java9已经设置为deprecated了