6

我想知道嵌套类如何在 for 循环中工作:

  • 每次进行交互后,类的对象会被销毁吗?
  • 类的实例会被“垃圾”自动销毁吗?
  • 一旦 for 循环完成,嵌套类中的对象会保留在内存中吗?可以从程序中的其他地方召回吗?

这是代码:

class Outer {
  int outer_x = 100;

  void test() {
    for(int i=0; i<10; i++) {
      class Inner {
        void display() {
          System.out.println("display: outer_x = " + outer_x);
        }
      }
      Inner inner = new Inner();
      inner.display();
    }
  }
}

class InnerClassDemo {
  public static void main(String args[]) {
    Outer outer = new Outer();
    outer.test();
  }
}
4

3 回答 3

9

在方法中定义类只是语法:它仍然是一个完全正常的类定义。

对于您创建的Inner对象 ( new Inner()),这意味着:

  • 在循环迭代之后,每个对象都将像任何其他对象一样有资格进行垃圾回收
  • 是的,该对象最终将被垃圾收集
  • 对象将一直存在,直到它被垃圾收集,但不能从其他地方访问(因为没有对它的引用泄漏)。

对于班级本身,这意味着:

  • 该类将照常加载(仅一次)
  • 该类不会在每次迭代时重新加载
  • 该类甚至不会在第二次调用时重新加载test
  • 该类可以根据 GCing 类的正常规则进行 GC(非常严格)
于 2013-06-10T09:45:46.133 回答
0
  • 不,对象将在堆上挂起,直到 GC 启动。
  • 是的,一旦 GC 启动。
  • 它不会持续存在。不,它不能。

例如,如果您this通过构造函数将外部类实例(在某处使用。

于 2013-06-10T09:50:16.743 回答
-1

GC 完全取决于 JVM。如果内部内存不足,它将执行,并且 GC 有机会。

于 2013-06-10T09:47:09.810 回答