java - 局部内部类

标签 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. 是的,内部类引用了 OuterClass 实例。

    您可以通过在方法中访问 OuterClass.this 来验证这一点。

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

    离开方法不会影响对象的生命周期。就像所有其他对象一样,一旦不再有对它的引用,它将有资格进行 GC。由于 JButton 将保存对它的引用,因此它将保留在内存中。

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

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

关于java - 局部内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174310/

相关文章:

java - AWS 开发工具包 2.x DynamoDB 文档 API

java - android sqlcipher java.io.FileNotFoundException : icudt46l. 压缩包

java - 垃圾收集器问题

java - 为什么此代码不会导致我的计算机内存耗尽?

Python + NumPy : When is it useful to manually collect garbage?

java - 如果在外部类的方法中声明了内部类,如何初始化内部类的实例?

c# - 从内部类引发事件以在外部类处理,怎么做?

java - pageLoadTimeout 不适用于带有 PageObjects 的 Firefox

java - 在Java中,如何访问新监听器 block 内的静态方法参数?

java - 删除 POJO 的 toString() 中的某些 JSONObject 键