为什么下面程序的输出在完成()之前会运行同学的最终结果呢?同学使用类课程对象,所以它的finalize()当然应该在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发布于 2016-06-28 12:40:24
这样做是为了给您(和任何其他Java程序员)一个教训。这个教训是:不要假设何时(或者更好的,如果)被调用。
认真地说:您可以查看这个伟大的question,并会发现对find的调用绑定到垃圾收集器的操作。问题是:当垃圾收集器决定收集东西时,您绝对没有控制或“洞察力”。大多数时候,它的活动会导致相同的结果.如果您不对正在处理的“设置”进行更改。比如:使用相同的JVM设置运行相同的示例。但一旦你开始研究“真实世界”的应用程序..。你总是会遇到意想不到的惊喜。
见鬼--甚至不能保证finalize是调用的。因此,您的代码不应该依赖它。因此,使用finalize的理由几乎为零。
换句话说:如果您真的想了解正在发生的事情;您必须深入了解JVM正在使用的GC的实现;了解该GC定义垃圾的原因和时间;以及它何时开始收集垃圾。
https://stackoverflow.com/questions/38076389
复制相似问题