黑马程序员技术交流社区

标题: 一个关于final的小白问题 [打印本页]

作者: 深圳在漂移    时间: 2013-7-19 16:00
标题: 一个关于final的小白问题
请问final、finally、finalize的区别 是什么?

作者: wedge    时间: 2013-7-19 16:07
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
作者: 下雨天    时间: 2013-7-19 16:09
final是一个修饰符  可以用来修饰类 方法 变量   就像public   private     static 一样
finally是用于执行某些程序的一个代码块  经常和try一起使用
fianlize是java中的垃圾回收机制  这个不需要你使用 也可以不用去了解
作者: jialihong    时间: 2013-7-19 18:10
final :修饰符(关键字)。使用该关键字修饰,不能作为父类被继承,不能再有子类,称之为最终类。
finally:在异常处理时最后一部分要用到的finally块
finalize:是垃圾回收机制里面的方法,finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
作者: 王广亚    时间: 2013-7-19 20:17
final修饰变量:就表示这个变量被赋予的值是不可变的,即它是个常量;
final修饰对象:就表示这个变量被赋予的引用是不可变的
final修饰方法:表示这个方法不可以被子类重写,但是它这不影响它被子类继承

finally语句 :它只能用在try/catch语句中,并且附带着一个语句块,表示这段语句最终总是被执行
  1. public final class FinallyTest {
  2.         public static void main(String[] args) {
  3.                 try {  throw new NullPointerException(); }
  4.                 catch (NullPointerException e)
  5.                 {  System.out.println("程序抛出了异常"); }
  6.                 finally
  7.                 {  System.out.println("执行了finally语句块"); }
  8.                 }
  9.         }
复制代码
正如楼上所说finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
作者: 张先庆    时间: 2013-7-19 22:31
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.

finally是异常处理语句结构的一部分,表示总是执行

try{

}catch{

}finally{

}

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收

作者: zcbyzcb    时间: 2013-7-20 11:10
final类似于C++中的const,用在变量前则为常量,用在方法前则不能重写,用在类则不能有子类。
作者: zcbyzcb    时间: 2013-7-20 11:13
finally就是处理异常时必然会执行的代码块。
finalize是java一种垃圾回收器,因为java的自动垃圾回收机制只能处理new出来的内存,所以就用finalize作为回收用。
作者: yangqing    时间: 2013-7-20 12:01
final:你可以这样理解 和其英文解释一样 (最后) 被final修饰的类 不能有子类   一个变量(有值)被final就变成固定常量。只能读取不能修改
finally:只有一种情况下 finally不会被执行  那就是退出JVM   你可以把它理解为必须被执行的代码。
finalize: 和多线程原理差不多 , 独立运行 不定时的 垃圾回收机制 。无须做过多的了解
作者: 董凯    时间: 2013-7-20 14:43
final

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

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

finally是try后面的语句块之一,无论异常是否抛出,都会执行的语句块

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2