【问题标题】:Local inner class本地内部类
【发布时间】:2011-09-04 16:23:09
【问题描述】:

我已经阅读了内部类教程,但不明白一件事。据说内部类包含对外部类的隐藏引用,所以我通过这个普通类提出了几个问题:

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 条件但本地内部类仍被其他类引用的情况?会发生什么?

【问题讨论】:

  • 您从未投票或接受过您之前问题的答案。请对此进行改进。
  • 我想为这个问题点赞,但看了你的个人资料,你从来没有接受过答案,或者更糟糕的是,从来没有给任何人投票过,很抱歉,你错过了我的投票。
  • @Final:至少你的问题的第 1 点和第 3 点可以通过编写一个简单的测试程序来解决。
  • @Harry:你是在对问题投票,而不是对提问者 ;-) 一个好的问题值得一票,即使提问者可以以某种方式改进。
  • @Joachim:但问题始终属于提问者,我不支持只通过提问而不放弃投票或接受答案来不断获得声誉和特权的人。

标签: java garbage-collection inner-classes


【解决方案1】:
  1. 是的,内部类引用了OuterClass 实例。

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

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

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

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

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

【讨论】:

  • 这实际上并不完全正确。由于这种情况下的内部类实际上从不引用其封闭的OuterClass 实例,因此不会编译对它的引用。因此,在问题3 中,答案是OuterClass 实例可以是GC 'd 即使内部类仍然被引用。当然,这是本案特有的,但尽管如此。
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多