final、finally与finalize的区别
final
在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)。
修饰类
当用final修饰类的时,表明该类不能被其他类所继承。final类中所有的成员方法都会隐式的定义为final方法。
修饰方法
把方法锁定,以防止继承类对其进行更改。即此方法不能被重写。
修饰变量
final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。
- 当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;
- 如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了(引用的值是一个地址,final要求值,即地址的值不发生变化),但该引用所指向的对象的内容是可以发生变化的。
final修饰一个成员变量(属性),必须要显示初始化
- 一种是在变量声明的时候初始化;
- 第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
finally
finally作为异常处理的一部分,它只能用在try-catch
语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
- 只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。如果在执行try语句块之前已经返回或抛出异常,那么try对应的finally语句并不会执行。
- 在某些情况下,即使try语句执行了,finally语句也不一定执行:在try语句块中执行
System.exit (0)
语句,终止Java虚拟机的运行。 - 当一个线程在执行try语句块或者catch语句块时被打断(interrupted)或者被终止(killed),与其相对应的finally语句块可能不会执行。
finalize
finalize()
是在java.lang.Object
里定义的,也就是说每一个对象都有这么个方法。这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象,所以一般是不需要程序员去实现finalize的。