java非常简单的最终修饰符和运行方法问题
关于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;
}
}
如果你们知道这是什么原因,或者我如何修复,请帮忙
提前谢谢
# 1 楼答案
像这样做
# 2 楼答案
这就是Q&;A解释了删除
final
修饰符时出现的编译错误:在您的示例中,
run()
变量看到的firstTime
实际上是封闭类中firstTime
变量的副本。需要final
来保持只有一个变量的错觉将
firstTime
的声明移动到run()
方法中的解决方案是好的,但它确实改变了行为。该变量现在设置为任务开始运行的时间,而之前它设置为任务计划的时间最后,如果您真的希望
run()
方法能够更新封闭作用域中的firstTime
变量,那么您需要以其他方式来实现这一点。最简单的方法是将firstTime
作为实例变量,而不是局部变量。然后可以删除final
,而run()
方法可以直接更新变量# 3 楼答案
不能修改最终变量。这(本质上)就是final的定义
不能更改引用,但可以改变对象。但是,在
long
的情况下,会创建一个新的long
,并将其分配给firstTime
的值,该值试图更改引用,因此是非法的# 4 楼答案
最后一个变量只能在构造函数中赋值,或在声明时通过初始值设定项赋值