一般匿名类实例化问题

时间:2011-04-28 08:47:26

标签: java anonymous-class


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

 Class ExampleClass{

     MyObj obj; 

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

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

的用法
 ExampleClass.this.obj()

没有最终结果。

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

3 个答案:

答案 0 :(得分:5)

  • 当您捕获本地变量的变量时,必须使用final ...而不是封闭类的实例变量。
  • ExampleClass.this是对与ExampleClass的子类实例关联的ClassA实例的引用。在您的情况下,它与this中的methodA相同。
  • 它不会爆炸 - 它只会改变obj的值。可以将其视为捕获ExampleClass.this(因此您无法更改),但您可以更改<{em> 中引用的对象中的数据 {{ 1}}。

答案 1 :(得分: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. 您无法更改参考。你可以做的是使用间接,例如对可以交换它的值的对象的最终引用。一个例子是原子价值持有者的类别,例如AtomicReference

答案 2 :(得分:0)

  1. 因为,你描述它的方式,在这种情况下,他们没有使用ExampleClass.this.obj,他们正在调用方法ExampleClass.this.obj()。

  2. ExampleClass.this引用ExampleClass的封装实例,其中实例化了这个ClassA实例。

  3. 不一定。