composition 中 finalize 的输出不确定

output of finalize in composition uncertain

为什么以下程序的输出 运行s 在 Course 的 finalize() 之前完成 Classmate ? 同学使用 class Course 对象,所以它的 finalize() 应该在 Course 的 finalize() 之后 运行?但输出显示 reverse.WHY?

class Classmate{

    Course mca;
    Classmate(){
        System.out.println("Student const. `enter code here`called");
        mca = new Course();
        mca.getCourse();
    }

    @Override
    protected void finalize()  {System.out.println("good bye Student"); 

    }
}
class Course{
    Course(){
        System.out.println("Course const. called"); 
    }

    void getCourse(){
        System.out.println("your ccourse is MCA");
    }

    @Override
    protected void finalize() throws Throwable {
        // TODO Auto-generated method stub
    System.out.println("goodbye course");
    }
}



public class Composition {

public static void main(String[] args) {

    Classmate ram = new Classmate();
    ram=null;
    System.gc();
    for(int i=0;i<5;i++)
        System.out.println("i is "+i);
}
}

输出:

Student const. called

Course const. called

your ccourse is MCA

good bye Student

i is 0

goodbye course

i is 1

i is 2

i is 3

i is 4

它这样做是为了给您(和任何其他 Java 程序员)一个教训。这个教训是:不要假设何时(或更好 if)调用 finalize。

说真的:您可以看看这个很棒的 question 并且会发现对 finalize 的调用绑定到垃圾收集器的操作。事情是:当垃圾收集器决定收集东西时,您绝对无法控制或 "insight"。大多数时候,它的活动将导致相同的结果......如果你不对你正在处理的 "setup" 进行更改。喜欢:运行 使用完全相同的 JVM 设置的完全相同的示例。但是,一旦您开始查看 "real world" 个应用程序……您将无时无刻不在遇到意想不到的惊喜。

哎呀 - 甚至不能保证 曾经 调用过 finalize。所以,你的代码不应该依赖它。因此,使用 finalize 的充分理由几乎为零。

换句话说:如果你真的想了解发生了什么;您将不得不深入研究您的 JVM 正在使用的 GC 的实现;了解 GC 定义垃圾的原因和时间;以及它何时开始收集垃圾。