本地内部阶级

时间:2011-05-30 09:09:43

标签: java garbage-collection inner-classes

我已阅读内部课程教程并且不了解一件事。据说内部类隐藏了对外类的引用,所以我通过这个普通类提出了几个问题:

public class OuterClass {

public void doSomething() {
    JButton button = new JButton();
    button.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {                
      }
    });
  }
}

所以我们有一个本地内部类,它位于方法doSomething()内,我有一些问题。

  1. 这个本地内部类是否保留对OuterClass的引用,因为它是本地的?

  2. 方法doSomething()终止后,此本地内部类是否保留内存?

  3. 是否存在OuterClass符合GC条件但其他类仍引用本地内部类的情况?会发生什么?

1 个答案:

答案 0 :(得分:8)

  1. 是的,内部类具有对OuterClass实例的引用。

    您可以通过访问方法中的OuterClass.this来验证。

  2. 是的,在方法终止后,内部类实例将继续存在。

    离开该方法不会影响对象的生命周期。正如所有其他对象一样,一旦没有对它的引用,它将符合GC的条件。由于JButton将保留对它的引用,因此它将保留在内存中。

  3. 只要内部类实例可以访问,OuterClass实例就不能符合GC条件。

    原因是#1:内部类实例具有对外部类实例的引用,这意味着只要内部类不符合条件,外部类就不能符合GC的条件(即两个都不再可达。)