finalize()方法是Object类中用于对象回收前清理的机制,但调用时机不确定、不保证执行,且自Java 9起已被弃用;其核心用途是释放非内存资源(如文件句柄、JNI内存),而非替代try-with-resources等现代资源管理方式。
多态调用本身不直接参与垃圾回收,但它会影响对象的生命周期判断和 finalize() 方法的执行行为——尤其在涉及父类引用、子类构造与重写方法时,容易出现看似“矛盾”的日志输出(如 radius=0 后又变为 1),本质是构造顺序与多态调用时机共同作用的结果。
当子类构造器中调用 super() 时,父类构造器会先执行;若父类构造器中调用了被子类重写的方法(如 getString()),JVM 会按运行时类型(即子类)去调用该方法——哪怕子类字段(如 radius)尚未初始化。
当对象进入垃圾回收队列并准备执行 finalize() 时,若该方法被子类重写,JVM 同样依据实际类型调用——这导致日志中看到的是子类的 finalize() 和其重写的 getString(),而非父类版本。
多态常伴随向上转型(如 Point c1 = new Circle(...)),这种写法不影响 GC 判断——JVM 看的是对象实际内存是否还有强引用指向它,而不是变量声明类型。
多态 + 构造/回收组合容易引发理解偏差,实践中应避免以下做法:
Python工程实践之np.loadtxt()读取数据
python中的extend功能及用法
pythonJieba分词处理详解【模式词库的添加、删除自定义词库失败处理等】
pycharm没有找到manage repositories按钮的解决办法
Python+pandas数据分析实践总结
pycharm中报ModuleNotFoundErrorNo module named apostensorflowapos错误解决