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