Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java本地类中捕获的变量是什么_Java - Fatal编程技术网

Java本地类中捕获的变量是什么

Java本地类中捕获的变量是什么,java,Java,的Java文档说明: 此外,局部类可以访问局部变量。但是, 局部类只能访问声明为final的局部变量。 当局部类访问 封闭块,它捕获该变量或参数。例如 PhoneNumber构造函数可以访问局部变量numberLength 因为它被宣布为最终决定;numberLength是一个捕获的变量 public void writeToDataBase(final Object toWrite) { executor.submit(new Runnable() { public v

的Java文档说明:

此外,局部类可以访问局部变量。但是, 局部类只能访问声明为final的局部变量。 当局部类访问 封闭块,它捕获该变量或参数。例如 PhoneNumber构造函数可以访问局部变量numberLength 因为它被宣布为最终决定;numberLength是一个捕获的变量

public void writeToDataBase(final Object toWrite) {
    executor.submit(new Runnable() {
        public void run() {
             writeToDBNow(toWrite);
        }
    });
    // if toWrite were mutable and you changed it now, what would happen !?
}
// after the method returns toWrite no longer exists for the this thread...
什么是捕获变量,它的用途是什么,为什么需要它?请帮助我理解它的概念

什么是捕获变量,它的用途是什么,为什么需要它


捕获的变量是已复制的变量,以便可以在嵌套类中使用。必须复制该对象的原因是该对象可能超出当前上下文。它必须是
final
(或者在Java8中有效地是
final
),因此对于是否会看到变量的更改没有任何混淆(因为它们不会)

注意:Groovy确实有这个规则,对局部变量的更改可能意味着对封闭类中的值的更改,如果涉及多个线程,这尤其令人困惑

捕获变量的一个示例

public void writeToDataBase(final Object toWrite) {
    executor.submit(new Runnable() {
        public void run() {
             writeToDBNow(toWrite);
        }
    });
    // if toWrite were mutable and you changed it now, what would happen !?
}
// after the method returns toWrite no longer exists for the this thread...

捕获的变量是来自本地类外部的变量-在周围的块中声明的变量。在某些语言中,这被称为

在(简化的)示例中,在类PhoneNumber之外声明的变量numberLength被“捕获”


下面是一篇描述它的帖子:

以下是文章的一个片段:

Java强制要求,如果方法中定义的内部类引用该方法的局部变量,则该局部变量应定义为final


这是因为函数可能会完成执行并从进程堆栈中删除,所有变量都会被销毁,但内部类的对象仍可能在堆上引用该函数的特定局部变量。为了解决这个问题,Java制作了一个局部变量的副本,并将其作为对内部类的引用。为了保持两个副本之间的一致性,局部变量必须是“最终”且不可修改。

给出您的源代码。有一些引用仅在上下文中才有意义。可能是@SotiriosDelimanolis的副本,谢谢提醒,我已经用源代码详细信息更新了我的帖子。请澄清(或举例说明)该对象(哪个对象?)比当前上下文更长?非常感谢Peter,能否请您在Java程序中给我一个例子,解释对象如何在上下文之外生存,以及如何使Java的设计人员对变量设置为final或effective final的限制。@user2065083为out living添加了一个例子,并给出了这样做的原因。我不知道如何让它更清楚。谢谢Peter提供了一个例子,但我对多线程/并发性知之甚少,所以我发现理解起来很困难。我期待一些其他的基本示例,或者一些使用Java的比较器接口的示例更常用。@user2065083比较器通常是无状态的。给他们捕捉到的变量是很少见的。一个罕见的发现。谢谢你,我真的不明白为什么这个简单而超级清晰的答案没有被提升多少。