finalize方法
545字约2分钟
2024-12-02
finalize
方法
当垃圾回收时,系统会先调用
finalize
方法,子类可以重写该方法当一个对象没有被引用时,那么
jvm
虚拟机就会认为该对象是一个垃圾,就会使用垃圾回收机制来回收该对象,在回收之前会先调用finalize
方法在实际开发中很少使用该方法,所以了解一下即可
package com.Project.finalize_; public class Demo01 { public static void main(String[] args) { Cat cat = new Cat("喵喵喵?"); System.out.println("程序退出。。。" + cat.getName()); // cat等于null之后,则Cat对象就没有变量去引用(指向)Cat对象了 // 所以此时Cat对象就相当于是一个垃圾,则jvm虚拟机就要回收该垃圾,在回收该垃圾之前,jvm会先调用finalize方法 // 所以,如果我们不重写finalize方法,则默认调用Object里面的finalize方法,即默认处理 // 如果我们重写了finalize方法,在jvm会在回收垃圾之前先调用finalize方法 // 这里之所以没有输出 finalize 方法里面的属性,是因为jvm回收垃圾的机制问题(jvm垃圾回收有自己的一套算法),也就是说 并不是这个对象变成垃圾之后jvm就会立即回收 cat = null; // 垃圾回收机制是由系统决定的,当然我们也可以自己手动触发这个机制 // 调用 gc 方法不会像别的方法那样必须先执行完调用的方法之后,才能继续往下执行 // 所以调用 gc 方法时,该属性运行的结果是在最后才显示出来的 // 也就是说执行完 gc 方法之后,系统不会立即显示gc的运行效果(执行了,但是没有显示),而是等所有代码都运行完之后才显示gc的运行结果 System.gc(); // 调用System类中的gc方法 System.out.println("程序退出。。。"); } } class Cat { private String name; @Override protected void finalize() throws Throwable { System.out.println("垃圾回收成功。。。"); } public Cat(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }