import java.util.ArrayList;
import java.util.List;
public class DemoTest {
private static final int SIZE = 100000000;
public static void main(String[] args) {
demo();
}
public static void demo() {
List<DemoFactory.DemoPojo> list = new ArrayList<>(SIZE);
for (int i = 0; i < SIZE; i++) {
list.add(new DemoFactory().createPojo());
}
}
public static class DemoFactory {
public DemoFactory() {
}
public DemoPojo createPojo() {
return new DemoPojo();
}
public class DemoPojo {
}
}
}
DemoPojo 作为 DemoFactory 的内部类,是作为类似字段一般的存在,是作为对象的一部分。这个时候,DemoPojo 类的对象会隐含一个外部容器类的指向,用以访问外部容器类的字段。这个引用,可以用 <外部容器类>.this 来指代。DemoPojo 这里,可以用 DemoFactory.this 来访问隐含的外部 DemoFactory 对象。
如果是 static 修饰的内部类,本质和普通类是一致的,不持有外部类对象的引用,所以没有这个问题。
这个不算大问题,主要问题是内存浪费。只要内部类对象被回收,外部容器类对象没有其他引用的情况下,也会被回收。但是点比较细。主要是注意内部类的使用,推荐使用静态内部类,轻易不要使用普通内部类。