“嗨,阿米戈!”

“嗨,艾莉。你有什么有趣的事要告诉我吗?”

“今天,我们将讨论对象在内存中保留多长时间,也称为对象的生存期。创建对象后,只要有一个变量正在存储其地址(至少有一个对该对象的引用),则该对象存在(存活)。如果不再有任何引用,则该对象死亡。下面是一些示例:”

public class MainClass
{
   public static void main (String[] args)
   {TommyCat cat = new Cat("汤米");
    ┃ cat = null;
    ┗
    ┏ SammyCat cat1 = new Cat("萨米");
    ┃┏ Missy
    ┃┃Cat cat2 = new Cat("米西");
    ┃┃cat2 = cat1;
    ┃┗
    ┃┏ Ginger
    ┃┃cat1 = new Cat("金杰");
    ┃┃cat2 = null;
    ┃┗
    ┗
   }
}

“Tommy 对象从创建起只存在一行。引用该对象的唯一变量在下一行中被设置为 null,因此该对象被 Java 虚拟机 (JVM) 销毁。”

“Sammy 对象在创建后存储在 cat1 变量中。或者,更准确地说,该变量存储对该对象的引用。在几行之后,此引用被复制到 cat2。然后将对另一个对象的引用保存到 cat1。现在,只有 cat2 引用 Sammy。最后,在 main 方法的最后一行,对该对象的最后一个剩余引用被设置为 null。”

“Missy 对象在创建后只存在一行。在下一行,cat2 变量被设置为另一个值,对 Missy 的引用丢失。无法再访问该对象,因此系统将其视为垃圾(即该对象已死亡)。”

“Ginger 对象自创建后一直存在,直至方法结束。在方法结尾,cat2 变量被销毁,紧接着 Ginger 被销毁。”

“我明白了。”

“但是,如果在方法内部创建一个 Cat 对象,并将其引用存储在某个实例变量中,则只要 Cat 对象被仍然存活的另一个对象引用,该对象就将存在。”

“实际上,对象通常不会立即被系统销毁。Java 虚拟机会不时地执行‘垃圾回收’,销毁已标记为删除的对象。稍后我会详细介绍该过程。”

“另外,如果我们不再需要变量引用某个对象,可以将该变量设置为 null,或为其分配对另一个对象的引用。”