我很好奇为什么我们不能在同一方法中声明的匿名内部类中使用方法的局部变量。在对内部类的引用可能继续存在的情况下,方法完成后从调用堆栈中删除变量的原因对我来说似乎不合理。
我的怀疑:
如果类不能在方法之外实例化,那么不允许它使用局部变量的原因是什么?
为什么让论证最终让它可以接受?这些不在调用堆栈中吗?
由于内部类不能在方法之外实例化,如何将内部类的引用传递给另一个方法,如何将它分配给另一个方法中的引用变量?可以分配给它的变量的类型是什么?
以下是一个例子:
public class MyOuter2 {
int num = 1; //Outer instance variable
void doStuff(final int x) { //Outer instance Method with final variable
// void doStuff( int x) { //Final removed, compiler error
class MyInner { //Outer Method inner class
public void seeOuter() {
System.out.println("Outer num=" + num);
System.out.println(x);
}
}
MyInner inner = new MyInner();
inner.seeOuter();
readInnerObject(inner); //any method that pass inner object
}
public void readInnerObject(Object i ){
MyOuter2 outer = new MyOuter2(); // how to receive it???????????
}
public static void main(String args[]) {
MyOuter2 o = new MyOuter2();
o.doStuff(2);
}
}
答案 0 :(得分:1)
内部类中的代码可以在封闭方法退出后运行,并且调用堆栈上不再存在局部变量。因此,需要制作其价值的副本。在实例化内部类时执行此操作最容易理解和实现。
如果类不能在方法之外实例化而不是让它使用局部变量的原因?
因为当运行内部类的代码时,调用堆栈上可能不再存在局部变量。
为什么让论证最终让它可以接受?这些与堆栈有关吗?
因为可以复制这些值而不必担心它们何时被复制。
如果内部类无法在方法外实例化,如果传递给其他方法的内部类的引用将如何分配给哪种类型的变量?
您可以通过超类或内部类扩展或实现的接口来引用内部类。
答案 1 :(得分:0)
要回答问题3,您无法将MyInner
的实例传递给其他方法,因为他们不知道MyInner
类是什么。在更现实的示例中,MyInner
将实现接口或扩展一些超类。这将允许您通过将MyInner
实例分配给其他方法,将其分配给声明为接口或超类类型的引用变量。