-1

我很好奇为什么我们不能在同一方法中声明的匿名内部类中使用方法的局部变量。在方法完成后从调用堆栈中删除变量而对内部类的引用可能继续存在的原因对我来说似乎并不合理。

我的疑惑:

  1. 如果类不能在方法之外实例化,那么不让它使用局部变量的原因是什么?

  2. 为什么使论点成为最终论点使其可以接受?这些也不在调用堆栈上吗?

  3. 既然内部类不能在方法外实例化,那么如何将内部类的引用传递给另一个方法,又如何将它分配给另一个方法中的引用变量呢?它可以分配给什么类型的变量?

这是一个例子:

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);
    }

}
4

2 回答 2

1

内部类中的代码可以在封闭方法退出后运行,并且局部变量不再存在于调用堆栈上。因此,需要制作它们的值的副本。在内部类被实例化时这样做是最容易理解和实现的。

如果类不能在方法之外实例化,那么不让它使用局部变量的原因是什么?

因为当内部类的代码运行时,局部变量可能不再存在于调用栈上。

为什么使论点成为最终论点使其可以接受?这些不与堆栈一起使用吗?

因为这些值可以被复制而无需担心何时被复制。

如果内部类不能在方法之外实例化,内部类的引用如果传递给其他方法将如何分配给什么类型的变量?

您可以通过超类或内部类扩展或实现的接口来引用内部类。

于 2013-06-24T21:04:50.723 回答
0

要回答问题 3,您不能将实例传递MyInner给其他方法,因为它们不知道MyInner类是什么。在更现实的例子中,MyInner会实现一个接口或扩展一些超类。这将允许您通过将实例MyInner分配给声明为接口或超类的类型的引用变量来使用它们,从而将其传递给其他方法。

于 2013-06-24T21:28:21.213 回答