作文中定型的输出不确定



为什么下面程序的输出在finalize() Course之前运行finalize of Classmate ?同班同学使用类Course对象,所以它的finalize()应该在finalize()之后运行。但是输出显示的是相反的,为什么?

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程序员)上一课。这个教训就是:不要假设何时(或者如果的话最好是)调用finalize。

认真地说:你可以检查一下这个伟大的问题,你会发现finalize的调用被绑定到垃圾收集器的操作上。问题是:当垃圾收集器决定收集东西时,您绝对无法控制或"洞察"。大多数时候,它的活动将导致相同的结果……如果您不更改您正在处理的"设置"。例如:使用完全相同的JVM设置运行完全相同的示例。但是一旦你开始关注"现实世界"的应用程序……你总是会遇到意想不到的惊喜。

见鬼——甚至不能保证finalize在被调用时是。因此,您的代码不应该依赖于它。所以,使用finalize的好理由几乎为零。

换句话说:如果你真的想了解发生了什么;你必须深入研究JVM正在使用的GC的实现;理解GC为何以及何时定义垃圾;当它开始收集垃圾

最新更新