局部内部类和匿名内部类在方法执行结束后是否存在问题探究
局部内部类和匿名内部类会在方法执行结束后继续存在,当他们被外部类、其他内部类或方法所引用时,这些内部类就不会在方法执行结束后被销毁。而当他们没有被引用时,这些内部类就会随着方法一起消失。
当方法执行结束后,局部内部类和匿名内部类会继续存在的情况有:
- 当局部内部类或匿名内部类被外部类或其他类引用时,它们会在方法执行结束后继续存在。
下面是一个例子,在这个例子中,外部类Outer类中的方法test()创建了一个局部内部类Inner。Inner类被外部类Outer的变量innerRef引用,所以Inner类不会在test()方法结束后被销毁。
class Outer {
public void method() {
class Inner { }
Inner inner = new Inner();
// ...
}
public void anotherMethod() {
Inner inner = new Inner();
}
}
- 当局部内部类或匿名内部类是静态内部类时,它们会在方法执行结束后继续存在。
class Outer {
public void method() {
static class Inner { }
Inner inner = new Inner();
// ...
}
}
在此例中,方法method()结束后,Inner类仍然存在,因为它是静态内部类。
- 局部内部类或匿名内部类被某个对象所引用,它们会在方法执行结束后继续存在。
class Outer {
public void method() {
class Inner { }
Inner inner = new Inner();
Object obj = inner;
// ...
}
}
在此例中,方法method()结束后,Inner类仍然存在,因为它被obj引用。
- 局部内部类或匿名内部类被某个匿名内部类或局部内部类所引用,它们会在方法执行结束后继续存在。
class Outer {
public void method() {
class Inner1 {
class Inner2{}
}
Inner1 inner1 = new Inner1();
}
}
在此例中,方法method()结束后,Inner1和Inner2类都会继续存在,因为Inner2被Inner1引用。
- 局部内部类或匿名内部类被某个集合类所引用,它们会在方法执行结束后继续存在。
class OuterClass {
public void someMethod() {
final int x = 10;
List<Object> list = new ArrayList<>();
list.add(new Object() {
public void printX() {
System.out.println(x);
}
});
}
}
// 调用方法
OuterClass outer = new OuterClass();
outer.someMethod();
// 获取匿名内部类的引用
Object inner = list.get(0);
inner.printX();
们在someMethod中创建了一个ArrayList对象,并将一个匿名内部类添加到了这个集合中。因为这个集合对象还在使用中,所以匿名内部类不会在方法执行结束后销毁。
- 当局部内部类或匿名内部类实现了某种接口或继承了某个类,并且这个接口或类的实例被外部类或其他类引用时,它们会在方法执行结束后继续存在。
举例来说,假设有一个Outer类,其中有一个方法createInner,这个方法创建了一个局部内部类Inner,它实现了接口MyInterface:
class Outer{
public void createInner(){
class Inner implements MyInterface{
//...
}
MyInterface inner = new Inner();
//...
}
}
如果Outer类的某个实例调用了createInner方法,并且在方法中创建的Inner实例被赋值给了一个MyInterface类型的变量inner,那么Inner实例就会在方法结束后继续存在,因为它被引用了。