为什么下面程序的输出在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为何以及何时定义垃圾;当它开始收集垃圾