有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
    }
}

如果你们知道这是什么原因,或者我如何修复,请帮忙

提前谢谢


共 (4) 个答案

  1. # 1 楼答案

    像这样做

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

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

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

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

    最后,如果您真的希望run()方法能够更新封闭作用域中的firstTime变量,那么您需要以其他方式来实现这一点。最简单的方法是将firstTime作为实例变量,而不是局部变量。然后可以删除final,而run()方法可以直接更新变量

  3. # 3 楼答案

    不能修改最终变量。这(本质上)就是final的定义

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

  4. # 4 楼答案

    最后一个变量只能在构造函数中赋值,或在声明时通过初始值设定项赋值