为什么下面程序的输出会在 Course 的 Finalize() 之前运行 Classmate 的 Finalize ? Classmate 使用类 Course 对象,因此其 Finalize() 应该在 Course 的 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 程序员)上一课。这个教训是:不要假设何时(或者更好的if)调用finalize。
说真的:你可以看看这个很棒的 question并且会发现对 Finalize 的调用与垃圾收集器的操作绑定(bind)在一起。事实是:当垃圾收集器决定收集东西时,您绝对没有控制权或“洞察力”。大多数时候,如果您不对正在处理的“设置”进行更改,它的 Activity 将导致相同的结果。例如:使用完全相同的 JVM 设置运行完全相同的示例。但一旦您开始关注“现实世界”的应用程序……您就会一直遇到意想不到的惊喜。
哎呀 - 甚至不能保证最终调用曾经。因此,您的代码不应依赖它。因此,使用 Finalize 的充分理由几乎为零。
换句话说:如果你真的想了解正在发生的事情;您必须深入研究 JVM 正在使用的 GC 的实现;了解 GC 定义垃圾的原因和时间;以及当它开始收集垃圾时。
关于java - 组合中最终确定的输出不确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38076389/