这可能太傻了。 我在main方法中有一个布尔变量。通过调用此类或另一个类的另一个方法,我希望在main方法中修改我的布尔值。我这样做但改变只发生在被调用的方法(本地),而不是调用者(主)。我认为这是因为java的pass-by-value功能。 我甚至尝试过布尔类型,但同样存在问题!
实际上我会用它来管理并发线程的排序。主处理器将检查每个线程的布尔值,以查看是否可以继续并勾选时钟。在勾选时钟后,主将使变量变为假,并将等到变量再次为真。如果子线程的布尔值都为假,则子线程将启动它们的任务。任务完成后,他们将使变量为真,以便主处理器能够再次打勾。 所以我想要一些没有回报的东西。我的意思是当主要可以看到方法内的值发生变化时。
答案 0 :(得分:1)
boolean var = true;
var = methodWhichReturnsTheNewValueOfTheVariable();
并且在被调用的方法中:
return newBooleanValue;
或
SomeObjectWithBooleanVariableInside var = new SomeObjectWithBooleanVariableInside(true);
methodWhichModifiesTheObject(var);
并且在被调用的方法中:
var.setBooleanValue(newBooleanValue);
布尔值就是这样一个对象:它包含一个布尔值。但它有意设计为不可变:它的包装布尔值无法更改。所以你需要创建自己的功能对象。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
是的 - 您无法在Java中修改方法内的pass-by-value参数(例如在C#中您将编写method(ref param)
)。
为什么不能使用以下方法返回此值:
public boolean method(params...) {...}
或者您可以将参考传递给调用者:
public void method(params..., CallerClass caller) {
//do something
caller.setValue(Boolean.FALSE);
}
或者你可以在调用者和调用方法范围 - 静态变量等
中访问这个变量答案 3 :(得分: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;
}
对象引用也是按值传递的,但是这里我们更改数组的内容,而不是数组引用。
这很有效。但是,我不建议像这样设计你的代码。 有时候,知道这个技巧在单元测试中会很有用。
答案 4 :(得分:0)
当您认为更改了原始布尔值时,它只更改了该方法范围内的值。与布尔一样,因为它是不可变的。更改其值实际上在该方法的范围内为其分配了一个新值。 你应该从该方法返回新值,然后分配它,或者你也可以使用一个众所周知的全局布尔值来改变它。
(顺便说一下,如果你正在处理并发检查AtomicBoolean)