java能否在类的实例被销毁之前执行某些代码? 就是说是否有哪个事件是在实例销毁之前触发的. 
请写个简单的例子.

解决方案 »

  1.   

    finalize
    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覆写此方法就可以了!
      

  2.   

    重写protected void finalize()
                     throws Throwable
    方法
      

  3.   

    protected void finalize()throws Throwable{
    System.out.println("test class end");
    }可以我在事件中写了这句,为什么没有打印出来??
      

  4.   

    我觉得建议使用finalize的人一定要说明一下,java不建议通过finalize来实现销毁动作。他和析构函数不一样。finalize并不确定何时调用。对于资源释放这种重要工作最好不要放到finalize里。
      

  5.   

    我觉得finalize的说法并没有错.
    人家要求的是在对象被销毁时调用一些操作,finalize确实可以保证这一点.也就是只要发生对象被销毁的事件肯定会调用这个方法,但JVM并不一定会对每个对象都销毁.
    只有在它认为内存吃紧时,需要进行垃圾回收时才会销毁对象.而如果一个进程的生命周期中根本
    没有内存吃紧的情况,就不会发生垃圾回收,所以也不存在对象销毁,所以没有调用finalize.这时是当JVM认为应该退出进程时,整个JVM进程把它点用的实际内存清空了,是整个JVM环境的销毁,所以JVM中的一切也随之而逝,它没有必要单独销毁那个等待回收对象.所以finalize不会被调用.对于楼主的主题"对象被销毁之前做的操作",finalize绝对满足这一条件,关键是你无法让所以对象一定会被销毁.