1. 前序
在了解引用的分类之前先了解一下对象和对象引用之间的区别。
1.1 对象
对象是类的实例。当使用new关键字创建类的实例时,jvm 会在堆内存中给该对象分配内存空间。
对象的特性:
① java对象普遍存储在堆内存中(其他情况,在经过【即时编译器】的【逃逸分析】技术分析之后,如果 能够确定一个对象不会逃逸到线程之外,那么就可以在 虚拟机栈 上为这个对象分配内存,这被称为【栈上分配】)。
② java对象 包含实例变量(非静态字段)和方法。
举例,假设有一个名为 Person的类,那么创建一个对象的行为可以是:
Person person = new Person();
在这行代码中,new Person() 实际上就是创建了一个 Person类型的对象。
1.2 对象引用
对象引用 就是一个变量,它存储的是 Java对象在堆内存中的地址。当你声明了一个变量用来存储对象时,你创建的就是一个引用,这个引用指向了堆内存中的对象,你可以通过这个引用来访问对象。
对象引用的特性:
① 对象引用可以存储在堆内存,也可以存储在虚拟机栈内存中(作为局部变量存储时)。
② 对象引用指向堆内存中的一个对象实例。
③ 如果改变指向,则就指向堆内存中的另一个不同的对象。
④ 如果引用被设置为 null,它就不再指向任何对象,这样做可以让原本引用的对象成为垃圾回收的候选对象。
继续上面的例子,变量 person 就是一个对象引用,它指向 new Person() 创建的 Person对象实例。概括来说,对象时具体的数据实体,而对象引用相当于指针或者句柄,指向这些实体数据。
2. 引用
2.1 引用的分类
Q:在Java中,对象的引用分为了四个类别:强引用、软引用、弱引用、虚引用。为什么要分这么多类型的引用?
A:这些引用类型提供了不同的生命周期和垃圾收集行为,Java虚拟机在进行垃圾回收时,可以根据应用场景的需要选择性的回收对象。
2.2 强引用
举例
Person person