Java 需要更多关于finalize()的解释,样本考试

Java 需要更多关于finalize()的解释,样本考试,java,scjp,Java,Scjp,鉴于: 解决方案说C是正确的,我不明白为什么,请有人解释一下这里发生了什么。发生的事情是:finalize()重写对象类中的方法。将解释何时调用此函数。当一个对象不再在任何地方被引用时,它可能会被垃圾收集;但是当它被垃圾收集时,语言并没有定义它 垃圾收集时,将对每个finalize对象调用finalize()方法。当然,您发布的代码也显式地调用finalize() 在本例中,循环将调用newfinalize()100000次以创建新的Finalize对象。每次创建一个新对象时,它都被用来显式地调

鉴于:


解决方案说C是正确的,我不明白为什么,请有人解释一下这里发生了什么。

发生的事情是:
finalize()
重写
对象
类中的方法。将解释何时调用此函数。当一个对象不再在任何地方被引用时,它可能会被垃圾收集;但是当它被垃圾收集时,语言并没有定义它

垃圾收集时,将对每个
finalize
对象调用
finalize()
方法。当然,您发布的代码也显式地调用
finalize()

在本例中,循环将调用
newfinalize()
100000次以创建新的
Finalize
对象。每次创建一个新对象时,它都被用来显式地调用
finalize()
,但随后它就不再被使用了,因此可以立即对其进行垃圾收集。这样做的结果是,当我们到达
System.gc()
调用时,我们不知道还有多少
Finalize
对象仍在等待垃圾收集,但它可能在0到100000之间。(在我的机器上,它似乎是1。也就是说,除了一个对象之外,它已经对所有对象进行了垃圾收集,并在这些对象上调用了
finalize()

在第一个循环中,
x
将从0变为9999999(
finalize()
方法不会修改
x
),因此对于每个
x
的倍数为10000的
false x
。(请注意,
finalize()

在第一个循环之后,如果N是仍要进行垃圾收集的对象数,则
System.gc()
应使它们在该点进行垃圾收集(不保证);由于
x
已重置为0,并且
finalize()
将增加它,这意味着
x
将从1增加到N。(请注意,在
x%10000
测试之前,第一个
finalize()
将从0增加到1。)对于1到N范围内的每个
x
(10000的倍数),您应该看到
true x


但由于N可以是0到100000之间的任何值,这意味着我们可能看到或可能看不到任何
true
输出——我们无法判断。这就是为什么A和B都不是“永远正确”的原因。如果我们确实看到任何
true
输出,因为输出将在其范围内显示10000的每一个倍数,因此可以确定
true
输出将与先前的
false
输出具有相同的数字,这解释了为什么C是正确的,而D不是

你试过简单地运行代码吗?您的发现是什么?因为您无法在真正的测试中运行此代码,所以我建议您手动跟踪它(仅足以查看它在做什么,而不是该循环的所有100000次迭代)。这将帮助您了解代码在做什么,然后您可以了解为什么C是正确的。请注意,如果他了解为什么C是正确的,他仍然必须了解为什么A和B是不正确的。(考试要求选择所有始终正确的语句。C和D不能都正确,因为它们相互排斥。)@Jeroenvanevel我试过了,运行代码并不能提供足够的信息来解释很多事情。至少在我的系统上。
class Finalizer {
    static int x = 0;
    static boolean gc = false;
    public static void main(String[] args) {
        for(x=0; x<100000; x++) {
            new Finalizer().finalize();
        }
        x = 0;
        gc = true;
        System.gc();
    }
    protected void finalize() {
        if(gc == true) x++;
        if(x % 10000 == 0)
           System.out.println(gc + " " + x);
    }
}
A: true will never be an output
B: true will be output at least ones
C: If true and false are both output, their respective values for x can be the same.
D: If true and false are both output, their respective values for x can never be the same.