我已经通读了内部类教程,但有一点不明白。据说内部类隐藏了对外部类的引用,所以我通过这个简单的类提出了几个问题:
public class OuterClass {
public void doSomething() {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
}
}
所以我们有一个本地内部类,它位于方法 doSomething()
中,我有一些问题。
这个本地内部类是否持有对 OuterClass 的引用,因为它是本地的?
在
doSomething()
方法终止后,这个局部内部类是否保留内存?是否存在OuterClass符合GC条件但局部内部类仍被其他类引用的情况?会发生什么?
最佳答案
是的,内部类引用了
OuterClass
实例。您可以通过在方法中访问
OuterClass.this
来验证这一点。是的,方法终止后,内部类实例将继续存在。
离开方法不会影响对象的生命周期。就像所有其他对象一样,一旦不再有对它的引用,它将有资格进行 GC。由于
JButton
将保存对它的引用,因此它将保留在内存中。只要内部类实例可访问,
OuterClass
实例就不能符合 GC 条件。原因是 #1:内部类实例引用了外部类实例,这意味着只要内部类不符合条件,外部类就不能同时符合 GC 条件(即两者都不再可达)。
关于java - 局部内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174310/