0

这可能太愚蠢了。我在 main 方法中有一个布尔变量。通过调用此类或其他类的另一个方法,我希望在 main 方法中修改我的布尔值。我这样做,但更改只发生在被调用的方法(本地)中,而不是调用者(主)。我认为这是因为 java 的传值特性。我什至尝试过布尔类型,但同样的问题!

实际上我会用它来管理并发线程的顺序。主处理器将检查每个线程的布尔值,以查看是否可以继续并计时。在打勾时钟后,main 将使 vars 为假,并等到 vars 再次为真。如果每个子线程的布尔值为 false,则子线程将启动它们的任务。任务完成后,他们会将 vars 设置为 true,以便主处理器能够再次运行。所以我想要一些没有回报的东西。我的意思是当值在方法内部发生变化时,main 可以看到它。

4

5 回答 5

1
boolean var = true;
var = methodWhichReturnsTheNewValueOfTheVariable();

在被调用的方法内部:

return newBooleanValue;

或者

SomeObjectWithBooleanVariableInside var = new SomeObjectWithBooleanVariableInside(true);
methodWhichModifiesTheObject(var);

在被调用的方法内部:

var.setBooleanValue(newBooleanValue);

布尔值就是这样一个对象:它包含一个布尔值。但它被有意设计为不可变的:它的包装布尔值不能更改。因此,您需要创建自己的功能对象。

于 2012-12-23T15:13:16.243 回答
0

当您认为您更改了原始布尔值的值时,它仅更改了该方法范围内的值。与布尔值相同,因为它是不可变的。更改其值实际上是在该方法的范围内为其分配了一个新值。您应该从该方法返回新值,然后分配它,或者您也可以使用所有人都知道的全局布尔值并更改该值。

(顺便说一句,如果您正在处理并发,请查看 AtomicBoolean)

于 2012-12-23T17:21:16.233 回答
0

是的 - 您不能在 Java 中的方法内修改按值传递的参数(例如在 C# 中您将编写method(ref param))。

为什么不能使用方法返回这个值:

public boolean method(params...) {...}

或者您可以将参数传递给调用者:

public void method(params..., CallerClass caller) { 
    //do something
    caller.setValue(Boolean.FALSE);
}

或者,您可以使此变量在调用者和调用方法范围内可访问 - 静态变量等。

于 2012-12-23T15:15:46.750 回答
0

原始类型是按值传递的,因此您不能更改作为方法参数的变量。

这也使理解程序的工作方式变得更容易,因为这种行为在这样的调用中更加明显:

boolean prime = false;
prime = isPrime(number);

您可以看到该found变量已重新分配;虽然您可以假设这number将保持不变。这有助于代码的可读性。

有一个肮脏的把戏,有时可以使用。由于数组是对象,因此您可以使用数组来包装原始类型:

boolean[] prime = { false };
isPrime(number, result);

public void isPrime(int number, boolean[] result) {
    result[0] = true;
}

对象引用也是按值传递的,但这里我们更改的是数组的内容,而不是数组引用。

这行得通。但是,我不建议这样设计您的代码。有时,知道这个技巧在单元测试中可能很有用。

于 2012-12-23T15:18:03.003 回答
0

执行此操作的通常方法如下:

public static void main(String[] args) {
    boolean myVar = true;

    ...
    ...

    myVar = myFunction();
}

public static boolean myFunction() {
    // the method should do it's calculation and return the value:
    return false;
}
于 2012-12-23T15:14:55.437 回答