0


我注意到在我系统的代码中有人实例化了一个匿名类,如下所示

 Class ExampleClass{

     MyObj obj; 

     methodA(new ClassA(){
         @override public void innerMethodA(){
            //code...
        }
    });
} 

到现在为止还挺好。
现在,为了使用在方法之前声明的 obj,我通常将其定义为 final。
我真的不明白为什么,但我这样做是因为编译器要求。在这段代码中,我在 innerMethodA() 中看到了

 ExampleClass.this.obj()

没有决赛。

我的问题:
1. 为什么我在使用 obj 时必须输入 final?
2.什么是ExampleClass.this?请注意,ExampleClass 是 Class 而不是实例。那么“这个”是什么?如果它有几个实例?
3. 如果我在内部方法运行时更改 obj 会发生什么(在我的代码中,内部方法在循环中运行,所以我打算更改它。它会爆炸吗?)

4

3 回答 3

5
  • final当您捕获局部变量的变量时,您必须使用......而不是封闭类的实例变量。
  • ExampleClass.this是对ExampleClass与 的子类的实例关联的实例的引用ClassA。在您的情况下,它将与thiswithin相同methodA
  • 它不会爆炸——它只会改变obj. 将其视为捕获 的ExampleClass.this因此您无法更改),但您可以更改.ExampleClass.this
于 2011-04-28T08:51:09.837 回答
1
  1. Java 中没有“真正的”闭包(捕获范围的函数)。参见例如http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-different
  2. 您可以使用此表单来引用“ExampleClass”范围内的模棱两可的方法/变量。
  3. 您不能更改参考。您可以做的是使用间接,例如对可以交换其值的对象的最终引用。一个例子是 Atomic 值持有者的类,例如AtomicReference
于 2011-04-28T08:52:49.083 回答
0
  1. 因为,按照您描述的方式,在这种情况下,他们没有使用 ExampleClass.this.obj,他们正在调用方法 ExampleClass.this.obj()。

  2. ExampleClass.this 指的是在其中实例化此 ClassA 实例的 ExampleClass 的封装实例。

  3. 不必要。

于 2011-04-28T08:53:23.373 回答