Java |布尔值不重新评估/更新

Java | boolean doesn't re-evaluate / update

我正在尝试制作一个 class 让您重复某项任务一定次数,或者直到满足条件为止。在继续之前,请考虑以下事项:

int test = 0;

我的重复 class:

public static abstract class Repeat {

    public void loop(int c) {
        for (int i = 0; i < c; i++) {
            run();
        }
    }

    public void until(boolean c) {
        while (!c) {
            run();
        }
    }

    public abstract void run();
}

我遇到的问题是 until(boolean c) 方法,不是 loop(int c) 方法。 loop 方法工作得很好,如下所示:

public static void main(String[] args) {
    new Repeat() {
        @Override
        public void run() {
            test += 1;
            System.out.println(test); // so I know what test currently is
        }
        {
            loop(10);
        }
    };
}

即改试1、10次。控制台证明正确:

1
2
3
4
5
6
7
8
9
10

现在是问题。 如果我尝试使用 until() 方法,如果我不这样做,它会 变得迟钝 '在几秒钟内终止启动,'因为它将无限递增 test

public static void main(String[] args) {
    new Repeat() {
        @Override
        public void run() {
            test += 1;
            System.out.println(test); // so I know what test currently is
        }
        {
            loop(10);
        }
    };
    new Repeat() {
        @Override
        public void run() {
            test -= 1;
            System.out.println(test);
        }
        {
            until(test == 0);
        }
    };
}

永远持续下去。我的假设是因为传入 (test == 0) 的布尔值永远不会更新,所以,如果那是正确的,谁能告诉我如何更新它?如果我的假设是错误的,是什么原因造成的,我该如何解决?

感谢 真正阅读了我的每一个字 "typed"(大部分是复制粘贴的)。

你从 test = 0 开始,你的程序只递减 test。所以一开始 if-clause 它的 -1 他们 -2 .... 它永远不会 0

当您通过方法在 Java 中传递原语时,它会传递值,这意味着您只传递 truefalse,它们永远不会更新,因为它只是一个价值。但是,如果您制作如下所示的内容,它应该可以工作:

public static abstract class Repeat {
    public void loop(int c) {
        for (int i = 0; i < c; i++) {
            run();
        }
    }

    public void until() {
        while (isLooping()) {
            run();
        }
    }

    public abstract void run();
    public abstract boolean isLooping();
}

返回是否希望继续循环 isLooping() 将允许您更新您的布尔值。

执行until(test == 0);test == 0的值为false。因此,您将 false 传递给 until(),并且在 until() 内部,!c 的值因此是真实的并且永远不会改变。

您似乎认为将布尔表达式传递给方法会使该方法在每次计算 c 时重新计算表达式。它不是这样工作的。在调用方法之前计算表达式,并传递该表达式的 value