Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java | boolean不';t重新评估/更新_Java_Loops_Boolean_Repeat_Evaluation - Fatal编程技术网

Java | boolean不';t重新评估/更新

Java | boolean不';t重新评估/更新,java,loops,boolean,repeat,evaluation,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) {

我试着制作一个类,让你重复一个任务一定的次数,或者直到满足一个条件。在继续之前,请考虑以下内容:

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();
}
这改变了测试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)
中传递的布尔值永远不会更新,因此,如果这是正确的,有人能告诉我如何更新它吗?如果我的假设是错误的,是什么原因导致了这一点?我该如何修复它


多亏了真正阅读我“键入”的每个单词(大部分是复制粘贴的)的人。

你从test=0开始,你的程序只会递减test。所以在第一个if子句its-1中,它们-2。。。。从test=0开始,您的程序只对test进行递减,它永远不会为0。所以在第一个if子句its-1中,它们-2。。。。它从不为0

当您通过方法传递Java中的原语时,它会传递值,这意味着您只传递
true
false
,它们永远不会更新,因为它只是一个值。但是,如果您制作了以下内容,它应该会起作用:

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();
}
公共静态抽象类重复{
公共无效循环(INTC){
对于(int i=0;i

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

当您通过方法传递Java中的原语时,它会传递值,这意味着您只传递
true
false
,它永远不会更新,因为它只是一个值。但是,如果您制作了以下内容,它应该会起作用:

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();
}
公共静态抽象类重复{
公共无效循环(INTC){
对于(int i=0;i

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

当执行
直到(test==0)时,
test==0的值为false。因此,您将
false
传递给
until()
,并在
until()
中传递
的值!因此,c
是正确的,永远不会改变


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

当执行
直到(test==0)时,
test==0的值为false。因此,您将
false
传递给
until()
,并在
until()
中传递
的值!因此,c
是正确的,永远不会改变


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

实际上否。在我的代码中,首先我有一个循环块,它将“test”增加到10,然后是一个until块,它应该将其减少回零。是否尝试使测试为静态?实际上否。在我的代码中,首先,我有一个循环块,它将“test”增加到10,然后是一个until块,它应该将它减少到零。尝试使测试保持静态?我没有直接使用您的答案,但它最终让我找到了正确的解决方案。谢谢我并没有直接使用您的答案,但它最终让我找到了正确的解决方案。谢谢