Java | boolean不会重新评估/更新

时间:2016-01-17 16:58:01

标签: java loops boolean repeat evaluation

我正在尝试创建一个让你重复任务一定次数的课程,或者直到满足条件。在继续之前,请考虑以下事项:

int test = 0;

我的重复课程:

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) 方法。 循环方法工作得很好,如下所示:

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) 中传递的布尔值永远不会更新,所以,如果这是正确的,可以有谁告诉我如何更新它?如果我的假设是错误的,导致这种情况的原因以及如何解决?

感谢无论谁实际读取我“打字”的所有字词(大部分是复制粘贴的)。

3 个答案:

答案 0 :(得分:5)

当你通过方法传递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()将允许您更新您的布尔值。

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

你从test = 0开始,你的程序只减少测试。所以在第一个if子句中,它们是-1 ......它们永远不是0