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.