谈谈final, finally, finalize的区别

一、final

用于以下四个地方: 
定义变量,包括静态的和非静态的。
定义方法的参数。 
定义方法。 
定义类。 

final 修饰的是一个基本类型,表示这个变量被赋予的值是不可变的,即它是个常量;如果 final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,这里需要提醒大家注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指 向的对象。 final的含义与第一种情况相同。如果一个变量或方法参数被 final 修饰,就表示它只能被赋值一次,但是 JAVA虚拟机为变量设定的默认值不记作一次赋值。 被 final 修饰的变量必须被初始化。初始化的方式有以下几种: 在定义的时候初始化。final 变量可以在初始化块中初始化,不可以在静态初始化块中初始化。 静态 final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。 final 变量还可以在类的构造器中初始化,但是静态 final变量不可以。 编译器在处理 private 方法时,是按照 final 方法来对待的,这样可以提高该方法被调用时的效率。不过子类仍然可以定义同父类中的 private 方法具有同样结构的方法,但是这并不会产生重写的效果,而且它们之间也不存在必然联系。 最后我们再来回顾一下 final 用于类的情况。这个大家应该也很熟悉了,因为我们最常用的String 类就是 final 的。由于 final 类不允许被继承,编译器在处理时把它的所有方法都当作 final 的,因此final 类比普通类拥有更 高的效率。final 的类的所有方法都不能被重写,但这并不表示 final的类的属性(变量)值也是不可改变的, 要想做到 final 类的属性值不可改变,必须给它增加 final 修饰。

如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在new一个对象时初始化(即只能在声明变量或构造器或代码块内初始化),而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能覆盖(重写)。

二、finally

在异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finally是try后面的语句块之一,无论异常是否抛出,都会执行的语句块。常见于  (1) 文件流操作中: 打开-->执行-->关闭   (2)数据库操作:打开连接-->执行操作-->关闭连接

三、finalize

方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。注意:finalize不一定被jvm调用,只有当垃圾回收器要清除垃圾时才被调用。

finalize()方法的作用是什么呢? finalize()方法是在 GC清理它所从属的对象时被调用的,如果执行它的过程中抛出了无法捕获的异常 (uncaught exception),GC将终止对改对象的清理,并且该异常会被忽略;直到下一次 GC 开始清理这个对 象时,它的 finalize()会被再次调用。 由于finalize()属于 Object 类,因此所有类都有这个方法,Object 的任意子类都可以重写(override)该方法,在其中释放系统资源或者做其它的清理工作,如关闭输入输出流。 通过以上知识的回顾,我想大家对于final、finally、finalize 的用法区别已经很清楚了。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值