final,finally &finalize的区别学习理解
final
-
final是一个关键字,修饰符。它可以修饰类、对象、属性、方法和变量。
-
修饰类时,该类就成为一个最终类,不能被继承,java中已提供的很多类都被声明为final类,不可进行继承。
-
修饰对象时,该对象的应用就不可再次进行修改,但不影响对对象的属性进行操作。
-
修饰属性时,表示该属性只能读取,不能修改,final属性定义时可以不进行初始化,但必须在初始化块或者构造函数中进行初始化,final修饰的变量必须确保使用时被初始化过。
-
修饰方法时,这个方法可以被子类继承,但不可被重写。
-
修饰变量时,该变量就相当于一个常量,其不可被再次赋值。
概括总结来说final修饰“对象”,是给该“对象”赋予了一种只读特性,只能对其进行使用操作而不能进行修改的操作(其中类不能被继承,对象不可修改引用,对象属性不受限制,方法不可被重写)
finally
finally是java异常处理中的一个重要部分,在对异常进行捕获处理之后,finally块的内容将被无条件执行执行。
try{
...
}catch(){
...
}finally{
...
}
其使用结构如上,理论上来说不论是否发生异常,finally块是一定会被执行的,但学习中发现有不同的看法,总结其情况如下:
- 程序没有执行try块导致的finally块没被执行。这里我觉得可以解释一下,finally块是在异常处理中与try块配合使用的,而如果没有进行异常捕获,也就是没有执行到try块,那么与之对应的finally块不执行是很正常的。
- 程序执行了try块,但在执行过程中虚拟机退出而导致的finally块没被执行。这我觉得没必要解释了,虚拟机都停止了程序不再执行也是正常情况。
总结来说,只要程序执行了try块,并且没有发生特殊情况,即正常执行完了try块或者执行完了某个catch块,那么finally块都将被执行。其中在没有发生异常,即正常执行完try块后再执行finally时,如果return语句在finally块之前,finally块会执行且其中的操作不会影响return的返回值,如果return语句在最后则finally块正常执行且可以影响return的值。另外实际中finally块常被用来进行资源释放,例如关闭流、连接等的操作。
finalize
finalize()是object的一个方法,是在垃圾收集器在对象不再被引用的情况下被调用的,用来进行资源的释放。finalize方法可以主动调用,但是并没有什么用。