Java 非常简单的最终修改器和运行方法问题

Java 非常简单的最终修改器和运行方法问题,java,Java,关于run()方法中使用的修饰符“final”和var,我有一个简单的问题。这里有一段代码,我已经有了,但是其他的代码不起作用。我猜它不能添加到firstTime变量,我不确定这是因为你不能用final修饰符,还是java讨厌我:/ final long firstTime = System.currentTimeMillis(); WorldTasksManager.schedule(new WorldTask() { @Override public void run() { if

关于run()方法中使用的修饰符“final”和var,我有一个简单的问题。这里有一段代码,我已经有了,但是其他的代码不起作用。我猜它不能添加到firstTime变量,我不确定这是因为你不能用final修饰符,还是java讨厌我:/

final long firstTime = System.currentTimeMillis();

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}
如果你们知道这是什么原因,或者我如何修复,请帮忙


提前谢谢

无法修改最终变量。这(本质上)是final的定义


您不能更改引用,但可以更改对象。但是,对于像您这里这样的
long
,将创建一个新的
long
,并将其分配给
第一次的值,该值试图更改引用,因此是非法的。

无法修改最终变量。这(本质上)是final的定义


您不能更改引用,但可以更改对象。但是,在像这里这样的
long
的情况下,将创建一个新的
long
并将其分配给
firstTime
的值,该值试图更改引用,因此是非法的。

只能在构造函数中或在声明时通过初始值设定项分配最终变量

只能在构造函数中或在声明时通过初始值设定项指定最终变量

本问答解释了删除
final
修饰符时出现的编译错误:

在您的示例中,
run()
变量看到的
firstTime
实际上是封闭类中
firstTime
变量的副本。需要使用
final
来保持只有一个变量的错觉

您将
首次
的声明移动到
run()
方法中的解决方案是好的,但它确实改变了行为。该变量现在设置为任务开始运行的时间,而以前设置为任务计划的时间


最后,如果您真的希望
run()
方法能够第一次更新封闭范围中的
变量,那么您需要以其他方式进行更新。最简单的方法是使
第一次
成为实例变量,而不是局部变量。然后,您可以删除
final
,而
run()
方法可以直接更新变量。

这就解释了删除
final
修饰符时出现的编译错误:

在您的示例中,
run()
变量看到的
firstTime
实际上是封闭类中
firstTime
变量的副本。需要使用
final
来保持只有一个变量的错觉

您将
首次
的声明移动到
run()
方法中的解决方案是好的,但它确实改变了行为。该变量现在设置为任务开始运行的时间,而以前设置为任务计划的时间

最后,如果您真的希望
run()
方法能够第一次更新封闭范围中的
变量,那么您需要以其他方式进行更新。最简单的方法是使
第一次
成为实例变量,而不是局部变量。然后您可以删除
final
,而
run()
方法可以直接更新变量。

像这样做

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    long firstTime = System.currentTimeMillis();
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}
喜欢吗

WorldTasksManager.schedule(new WorldTask() {
@Override
public void run() {
    long firstTime = System.currentTimeMillis();
    if (System.currentTimeMillis() >= firstTime) {
        stop();
    } else {
    firstTime += 5;
    }
}

当我试图删除最后一个修饰符时,我遇到了另一个错误。为了修复它,我所要做的就是声明长时间的、第一次的、内部的worldtask,它像一个咒语一样工作。当我试图删除最后一个修饰符时,我遇到了另一个错误。为了修复它,我所要做的就是声明一个长的、第一次的、内部的worldtask,它就像一个charmHe不能删除final在这个例子中(匿名类)。他不能删除final在这个例子中(匿名类)。