A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周星星 注册黑马   /  2012-6-19 10:30  /  1373 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

泛微的一道笔试题:final,finally,finalize 的区别,前两个我知道吗,finalize我就崩溃了

5 个回复

正序浏览
final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。
finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
简单说,final是修饰符;finally是有关于异常的;finalize是有关于垃圾清除的
回复 使用道具 举报
周星星 发表于 2012-6-19 10:58
同学能具体点吗,finalize的作用是什么呢?

给你在上面补充了一个例子,你应该可以看懂了!
回复 使用道具 举报
finalize()是Object中的一个方法,查API找到如下说明:

protected void finalize()
                 throws Throwable当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。
finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。

Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。

Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。

finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。


抛出:
Throwable - 此方法抛出的 Exception
回复 使用道具 举报
同学能具体点吗,finalize的作用是什么呢?
回复 使用道具 举报
本帖最后由 李盼 于 2012-6-19 11:10 编辑

final :修饰符 ,表示最终的
如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承,因为他是最终类,不需要子类来完善。
所以一个类不能既被声明为 abstract的,又被声明为final的。
将变量定义为final,可以保证它们只能被赋值一次,以后值都不能被改变。
被声明为final的方法也同样不能被子类被复写。

  finally异常处理时,中断了代码执行。finally代码块也是必须被执行的。通常用来关闭一些资源!

  finalize是一个方法名。 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要执行的方法。它是在 Object 类中定义的,因此所有的类都继承了它。我们可以覆盖此方法,以便达到当对象被垃圾回收器回收之前,一定要执行一次这个方法中的内容。

public class Test {
public static void main(String[] args)
{
  new A();
  System.gc(); //调用垃圾回收器,这个时候我们没有调用A的finalize方法,但是在垃圾回收器回收这个A对象时,A一定会指定一次finalize方法
}    //所以输出结果就是hello
}
class A
{
protected void finalize()
{
  System.out.println("hello");
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马