一般匿名类实例化问题

发布于 2024-11-03 12:23:36 字数 593 浏览 7 评论 0原文


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

 Class ExampleClass{

     MyObj obj; 

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

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

 ExampleClass.this.obj()

我的问题:
1. 为什么我使用obj的时候一定要加上final?
2.ExampleClass.this是什么?请注意,ExampleClass 是类而不是实例。那么“这个”又是什么呢?如果它有多个实例?
3.如果我在内部方法运行时更改 obj 会发生什么(在我的代码中,内部方法在循环中运行,因此我计划更改它。它会爆炸吗?)

I have noticed in the code in my system that someone instantiated an anonymous class as follows

 Class ExampleClass{

     MyObj obj; 

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

So far so good.
Now, in order to use obj that was declared before the method I usually define it as final.
I don't really understand why but i do because the compiler asks.
In this code i see in innerMethodA() the usage of

 ExampleClass.this.obj()

without final.

My questions :
1. why do I have to put final when I use obj?
2. what is ExampleClass.this ? Notice that ExampleClass is the Class not an instance. then what is the "this"? if it has several instances?
3. What happens if I change the obj while the inner method runs (in my code inner method runs in a loop so I plan on changing it . will it explode?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暖风昔人 2024-11-10 12:23:37
  • 当您捕获本地变量的变量...而不是封闭类的实例变量时,您必须使用final
  • ExampleClass.this 是对与 ClassA 子类实例关联的 ExampleClass 实例的引用。在您的情况下,它将与 methodA 中的 this 相同。
  • 它不会爆炸 - 它只会改变 obj 的值。将其视为捕获 ExampleClass.this(因此您无法更改它),但您可以更改对象的数据由ExampleClass.this引用。
  • You have to use final when you capture the variable of a local variable... not an instance variable of the enclosing class.
  • ExampleClass.this is a reference to the instance of ExampleClass associated with the instance of the subclass of ClassA. In your case, it will be the same as this within methodA.
  • It won't explode - it will just change the value of obj. Think of it as capturing the value of ExampleClass.this (so you can't change that) but you can change the data within the object referred to by ExampleClass.this.
安静被遗忘 2024-11-10 12:23:37
  1. Java 中不存在“真正的”闭包(捕获作用域的函数)。请参阅例如http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-define-in-a- Different
  2. 您可以使用此形式来引用不明确的内容“ExampleClass”范围内的方法/变量。
  3. 您无法更改参考。您可以做的是使用间接,例如对可以交换其值的对象的最终引用。一个例子是 Atomic 值持有者的类,例如 原子参考
  1. There are no "true" closures (functions that capture scope) in Java. See e.g.http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-variable-inside-an-inner-class-defined-in-a-different
  2. You can use this form to reference ambiguous methods / variables in the scope of "ExampleClass".
  3. You cannot change the reference. What you can do is use an indirection, e.g. a final reference to an object that can swap it's values. An example would be the class of Atomic value holders, e.g. AtomicReference.
北城挽邺 2024-11-10 12:23:37
  1. 因为,按照您描述的方式,在这种情况下,他们没有使用ExampleClass.this.obj,而是调用ExampleClass.this.obj()方法。

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

  3. 不一定。

  1. Because, the way you described it, in this case, they are not using ExampleClass.this.obj, they are calling the method ExampleClass.this.obj().

  2. ExampleClass.this refers to the encapsulating instance of ExampleClass in which this ClassA instance is instantiated.

  3. Not necessarily.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文