下面以代码加注释,来方便读者理解。
package com.company;
public class Main {
public static void main(String[] args) {
// 未被引用的,无用对象
new Book("hello Java");
// 手动调用系统回收进行标记,进行回收
System.gc();
}
}
//声明一个书类
class Book {
// 书的名称
String bookName;
// 书的价格
double bookPrice;
// 注解: 同一个类利用方法重载机制可以拥有多个声明的构造方法,采用不同的参数列表实现,术语叫: 方法重载
// 构造方法1 一个参数
public Book(String bookName) {
// 这种调用方式,可以降低沉余代码量,在参数少的构造函数调用参数多的构造函数,实现构造函数体的重用
// this 为调用当前实例对象的构造方法,传不同数量的参数,会触发不同的构造函数(重载机制),在这里触发的是构造方法2
this(bookName, 520);
}
// 构造方法2 二个参数
public Book(String bookName, double bookPrice) {
this.bookName = bookName;
this.bookPrice = bookPrice;
}
// 下面的finalize是一个当实例对象被Java运行时系统进行准备自动垃圾回收前,会对其自动调用的一个finalize方法, 类似 钩子函数机制
// 触发条件:无用对象
// 1.离开作用域的对象
// 2.没有被引用指向的对象,比如: new Book('hello the program'); 没有被引用
// 在Java运行时系统当中存在一个垃圾收集器他会自动扫描对象的动态内存区域,对没有被使用的对象会进行标脏(标记)
// ,然后会在下一次的垃圾回收时将这个对象进行销毁,在销毁前就会调用finalize方法,他是每个类都默认存在的一个方法,继承自Object对象,你可以重写也称覆盖(Override)这个方法体来进行一些操作,但要注意以下几点:
// 补充:垃圾收集器是一个后台线程运行的,在系统空闲时会被异步执行。
// finalize特点:
// 1.用于释放资源
// 2.什么时候会被调用是不知道的,所以是无次序的,可能在任何时机以任何次序被执行
// 注意: 在进行释放资源的操作时,不能有严格次序关系,所以写的时候,不管什么时候这个finalize方法会被执行都不能写响应程序正确性的代码。
@Override
protected void finalize() {
if (this.bookPrice == 520) {
System.out.println(this.bookName);
}
}
}