final finally 和 finalize的区别

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()方法,它跟析构函数不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值