Java定稿方法访谈问题

Java定稿方法访谈问题,java,Java,我遇到了关于finalize方法的困难Java面试问题。假设您已给出finalize方法,如下所示: public void finalize() { a.b = this; } 现在给出以下对象场景 你将如何解决这个问题?如果A不是指B,那么这个问题可能会更容易,因为GC将运行,它将收集B并为B调用finalize,但这里A指的是B,所以它很困难。在这种情况下,finalize将如何工作 有什么想法吗?提前谢谢您的问题并不完全清楚 但是,声明没有指定对象最终确定的顺序。这意味着所

我遇到了关于finalize方法的困难Java面试问题。假设您已给出finalize方法,如下所示:

public void finalize()
{
     a.b = this;
}
现在给出以下对象场景

你将如何解决这个问题?如果A不是指B,那么这个问题可能会更容易,因为GC将运行,它将收集B并为B调用finalize,但这里A指的是B,所以它很困难。在这种情况下,finalize将如何工作


有什么想法吗?提前谢谢

您的问题并不完全清楚

但是,声明没有指定对象最终确定的顺序。这意味着所有可终结类的finalize方法都应设计为在以任何顺序调用时都能工作

请注意,这同样适用于不可访问和终结器可访问的对象。换句话说,图表中的3个对象可以按任何顺序最终确定


。。。当A是可访问的时,如何对B进行垃圾收集,以及如何为B调用finalize

也许这是个骗人的问题。如果A是可访问的,那么B也是可访问的,因此不会对其进行垃圾收集,也不会调用其finalize方法。如果A变得不可访问,那么B也不可访问,两者都将最终确定

finalize方法的实际功能取决于它所属的类。假设它是“保证可到达对象”的方法,
a
变量包含对a的引用:

  • GC不会调用finalize方法,因为对象是可访问的

  • 其他一些代码可以显式调用
    finalize
    方法。如果发生这种情况,那么
    a.b
    将不再引用b,并且b将无法访问,并且有资格最终进行垃圾收集、终结和(最终)删除


    • 这是一个非常有趣的问题。从JDK1.6文档中,我发现以下两句话: 1.finalize方法可以执行任何操作,包括使此对象再次可供其他线程使用 2.对于任何给定对象,Java虚拟机都不会多次调用finalize方法


      所以在我看来,第一次,当B由GC收集时,如果A对某些线程仍然可用,则会调用finalize方法,然后B再次可用,这次GC不会收集B。但是因为finalize方法只会调用一次,因此,下次当任何线程都无法访问GC find B时,GC将收集B。

      如果我错了,很抱歉。但对我来说,B是a的一个字段,所以a肯定需要保留对B的引用,而一个“始终有效”的对象包含对a的引用,A和B都不是GC,而GC B的问题就没有意义。

      < P>最简单的java定型方法是把每个终结器都看作是一个额外的“位”状态。创建新对象时,此位设置为false。当垃圾收集器发现带有终结器的对象不可访问时,它会检查此isFinalized位,并仅在该位为true时回收该对象——如果为false,则运行终结器并将该位设置为true。一旦设置,就无法清除位,因此在以后任何时候垃圾收集器运行时,如果无法访问,它将被收集。

      我将通过不使用
      finalize
      来解决此问题。曾经。我同意我们应该避免定稿,但就面试问题而言,我想知道这个问题的答案是什么。仅供参考:询问定稿人/定稿人毛茸茸的行为的面试问题是面试官不知所措的迹象。对定稿行为的了解不应影响应聘者完成面试工作的能力。对于标准面试问题,这是一个很好的(额外回答问题)。我问每一位声称自己懂Java的应聘者:“
      final
      finally
      finalize
      之间有什么区别!我理解你所说的定稿顺序是不可预测的。这个面试问题是关于当A是可到达的,B将如何被垃圾收集,以及B将如何被调用?