我已阅读内部课程教程并且不了解一件事。据说内部类隐藏了对外类的引用,所以我通过这个普通类提出了几个问题:
public class OuterClass {
public void doSomething() {
JButton button = new JButton();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
}
}
所以我们有一个本地内部类,它位于方法doSomething()
内,我有一些问题。
这个本地内部类是否保留对OuterClass的引用,因为它是本地的?
方法doSomething()
终止后,此本地内部类是否保留内存?
是否存在OuterClass符合GC条件但其他类仍引用本地内部类的情况?会发生什么?
答案 0 :(得分:8)
是的,内部类具有对OuterClass
实例的引用。
您可以通过访问方法中的OuterClass.this
来验证。
是的,在方法终止后,内部类实例将继续存在。
离开该方法不会影响对象的生命周期。正如所有其他对象一样,一旦没有对它的引用,它将符合GC的条件。由于JButton
将保留对它的引用,因此它将保留在内存中。
只要内部类实例可以访问,OuterClass
实例就不能符合GC条件。
原因是#1:内部类实例具有对外部类实例的引用,这意味着只要内部类不符合条件,外部类就不能符合GC的条件(即两个都不再可达。)