当前位置: 首页 > 编程笔记 >

Java中覆盖finalize()方法实例代码

薛俊美
2023-03-14
本文向大家介绍Java中覆盖finalize()方法实例代码,包括了Java中覆盖finalize()方法实例代码的使用技巧和注意事项,需要的朋友参考一下

本文研究的主要是Java中关于覆盖finalize()方法的一次尝试,具体实现如下。

测试代码

package com.alioo.gc;

/**
 * 执行结果:
 *
 */
public class FinalizeEscapeGC{
  public static FinalizeEscapeGC instance=null;
  public void isAlive(){
    System.out.println("yes,i am still alive");
  }
  @Override
  protected void finalize() throws Throwable {
    super.finalize();
    System.out.println("finalize methode executed");
    instance=this;
  }

  public static void main(String [] args) throws InterruptedException {
    instance=new FinalizeEscapeGC();

    instance=null;
    System.gc();
    Thread.sleep(1000);
    instance.isAlive(); //在没有重写finalize方法时,肯定是会报nullpointerException的

    instance=null;
    System.gc();
    Thread.sleep(1000);
    instance.isAlive();
  }
}

执行结果:

finalize methode executed
yes,i am still alive
Exception in thread "main" java.lang.NullPointerException
at com.alioo.gc.FinalizeEscapeGC.main(FinalizeEscapeGC.java:29)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

解释说明:

先执行 instance=null;后执行instance.isAlive(); 在没有重写finalize方法时,肯定是会报nullpointerException的,
但是实际执行结果是一次逃脱成功,一次失败,这是因为任何一个对象的finalize()方法都只会被系统自动调用一次,如果对象面临下一次回收,它的finalize()方法就不会再次执行

总结

这个拯救对象的方式带有极大的不确定性,建议大家不用使用它,忘掉这个方法的存在。

以上就是本文关于Java中覆盖finalize()方法实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

 类似资料:
  • 问题内容: 我想覆盖我无法控制的工厂提供给我的对象中的方法。 我的具体问题是,我想覆盖 的getInputStream 和 getOutputStream方法 一的 Socket对象 进行 线记录 。 通用问题如下: 我想实例化并用我自己的实例替换的位置,如下所示: 对于套接字,我将返回一个 InputStream 和 OutputStream ,它们通过记录来包装以拦截数据。 问题答案: 由于J

  • 本文向大家介绍Java Enum finalize()方法与示例,包括了Java Enum finalize()方法与示例的使用技巧和注意事项,需要的朋友参考一下 枚举类方法 finalize()方法在java.lang包中可用。 finalize()方法用于表示枚举类不包含finalize方法。 finalize()方法是一种非静态方法,只能通过类对象访问,如果尝试使用类名称访问该方法,则会收到

  • 本文向大家介绍Java FileInputStream finalize()方法与示例,包括了Java FileInputStream finalize()方法与示例的使用技巧和注意事项,需要的朋友参考一下 FileInputStream类方法 finalize()方法在java.io包中可用。 finalize()方法用于确保在不存在任何引用的情况下调用此FileInputStream的方法,或

  • 问题内容: 我希望有人能够回答这个对Python有深刻理解的问题 考虑以下代码: 注意)如何不会产生的预期结果?我想知道为什么会这样,是否有办法实现这一目标… 相比之下,下面的示例仍然有效(也许是因为我们不打算重写特殊方法吗?): 问题答案: 不会调用特殊方法,那些__在实例上带有名称包围的特殊方法,而仅在类上,显然可以提高性能。因此,无法直接在实例上进行覆盖并使其起作用。相反,你需要执行以下操作

  • 问题内容: 为什么必须重写接口的所有方法? 例如,如果我有 我将有很多我什至不会使用的方法,有没有一种方法可以删除未使用的实现方法,例如,如果 我计划从接口中使用一种方法 我也不想使用抽象,因为这意味着我无法创建对象的实例(至少我的编译器这样说) 问题答案: 具体的类必须始终实现接口的所有方法。如果您还没有扩展,可以扩展。它实现了空方法,以避免将其写出来。您可以在类内部使用匿名类,如下所示:

  • 问题内容: 这个想法有些含糊不清,我需要澄清。 我的问题是使用此代码时: 输出为。 这是因为main函数与method在同一类中,还是由于重写? 我已经在书中读过这个想法,当我将该函数放在另一个类中时,会出现编译器错误。 问题答案: 您不能覆盖方法。如果投射到,则看不到。您 可以 覆盖一个方法,但这不是您要在此处执行的操作(是的,在这里,如果将移至,则会得到另一个方法。我建议您在打算覆盖时注解,