【问题标题】:Nested class in for loop, will there be n instances of the class?for循环中的嵌套类,该类会有n个实例吗?
【发布时间】:2013-06-10 09:41:38
【问题描述】:

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

  • 每次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();
  }
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    对于类本身,这意味着:

    • 类将照常加载(仅一次)
    • 类不会在每次迭代时重新加载
    • 在第二次调用test 时甚至不会重新加载该类
    • 可以根据 GC 类的常规规则对类进行 GC(非常严格)

    【讨论】:

    • 我认为,类对象指的是InnerClass实例。
    • @Andreas_D:我意识到他可能是这个意思,并扩展了我的答案。
    【解决方案2】:
    • 没有。该对象将在堆上挂起,直到 GC 启动。
    • 是的,一旦 GC 启动。
    • 它不会持续存在。不,它不能。

    例如,如果您通过构造函数将外部类实例(this)传递给内部类并分配给内部类的字段,那么在这种情况下,内部类对象将一直保留在内存中因为外部类实例在某处使用。

    【讨论】:

      【解决方案3】:

      GC 完全依赖于 JVM . 内存不足时执行,GC有机会。

      【讨论】:

      • 这与问题有什么关系?它没有解决任何 OP 的问题。
      猜你喜欢
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 2015-07-29
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多