for循环中的嵌套类,会有n个类的实例吗?

时间:2013-06-10 09:41:39

标签: java for-loop inner-classes nested-class

我想知道嵌套类如何在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();
  }
}

3 个答案:

答案 0 :(得分:9)

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

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

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

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

  • 班级将照常加载(仅一次)
  • 每次迭代都不会重新加载类
  • test
  • 的第二次调用中,甚至不会重新加载该类
  • 该类可以根据GCing类的正常规则(非常严格)进行GC计算。

答案 1 :(得分:0)

  • 否。该对象将在堆上挂起,直到GC启动。
  • 是的,一旦GC启动。
  • 它不会持久。不,它不能。

例如,如果您通过构造函数将外部类实例(this)传递给内部类并分配给Inner类的字段,那么Inner类对象将保留在内存中只要外部类实例在某处使用。

答案 2 :(得分:-1)

GC完全依赖于JVM 。 如果内部存储器很低,它将执行,并且GC有机会。