final finally 和 finalize的区别
一、final
final为常量关键字,在java中,final可以用来修饰类,方法和变量(成员变量或局部变量)
修饰类:当用final修饰类时,表明该类不能被其他类所继承。需要注意的是final类中所有的成员方法都会隐式的定义为final方法
final class A{}//表明A类是不可继承的
修饰方法:当用final修饰方法时,表明该方法不能被重写,但可以被重载。
注意:若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。
class A{
private final void getName(){}
}
public class B extends A{
public void getName(){}
public static void main(String[]args){
System.out.println("OK");
}
}
修饰变量:final成员变量表示常量,只能被赋值一次,赋值后其值不再改变。final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
public final int A=10; //在定义时初始化
public final int G;
//在构造器中初始化
public finalTest(){
G=70;
}
二、finally
finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行,由于finally用法特殊,如果finally之前有return语句,会撤销之前的return语句,继续执行最后的finally块中的代码。
try{
//可能抛出异常的代码
}catch(NullPointerException e){
System.out.println(“程序抛出了异常”);
}finally{
//这里总会被执行,不受break,return影响另如数据库连接的close()一般写在这里,可以降低程序的出错几率
System.out.println(“执行了finally语句块”);
}
三、finalize
1、finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,供垃圾收集时的其他资源回收,例如关闭文件等。
2、Java技术使用finalize()方法在垃圾收集器将对象从内存中清除出去前,做必要的清理工作。它是在Object类中定义的,因此所的类都继承了它。子类可覆盖finalize()方法以整理系统资源或者执行其他清理工作。
3、这个方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
4、特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
5、使用finalize还需要注意一个事,调用super.finalize();
一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。 所以,推荐不要使用finalize()方法,它跟析构函数不一样。