我正在尝试创建一个让你重复任务一定次数的课程,或者直到满足条件。在继续之前,请考虑以下事项:
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)
中传递的布尔值永远不会更新,所以,如果这是正确的,可以有谁告诉我如何更新它?如果我的假设是错误的,导致这种情况的原因以及如何解决?
感谢无论谁实际读取我“打字”的所有字词(大部分是复制粘贴的)。
答案 0 :(得分:5)
当你通过方法传递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();
}
返回您是否希望继续循环isLooping()
将允许您更新您的布尔值。
答案 1 :(得分:1)
执行test == 0
时,until(test == 0);
的值为false。因此,您将false
传递给until()
,而在until()
内,!c
的值是真实的,永远不会改变。
您似乎认为将布尔表达式传递给方法会使方法在每次评估c
时重新评估表达式。这不是它的工作原理。在调用方法之前计算表达式,并传递该表达式的值。
答案 2 :(得分:-1)
你从test = 0开始,你的程序只减少测试。所以在第一个if子句中,它们是-1 ......它们永远不是0