我对Java中的布尔值有疑问。假设我有一个这样的程序:
boolean test = false;
...
foo(test)
foo2(test)
foo(Boolean test){
test = true;
}
foo2(Boolean test){
if(test)
//Doesn't go in here
}
我注意到在foo2中,布尔测试不会改变,因此不会进入if语句。那我怎么去换呢?我查看了布尔值但我找不到一个将测试从“设置”为true的函数。如果有人能帮助我,这将是伟大的。
答案 0 :(得分:6)
您将原始布尔值传递给函数,没有“引用”。所以你只是在foo
方法中隐藏价值。相反,您可能希望使用以下之一 -
持有人
public static class BooleanHolder {
public Boolean value;
}
private static void foo(BooleanHolder test) {
test.value = true;
}
private static void foo2(BooleanHolder test) {
if (test.value)
System.out.println("In test");
else
System.out.println("in else");
}
public static void main(String[] args) {
BooleanHolder test = new BooleanHolder();
test.value = false;
foo(test);
foo2(test);
}
哪个输出“在测试中”。
或者,使用
成员变量
private boolean value = false;
public void foo() {
this.value = true;
}
public void foo2() {
if (this.value)
System.out.println("In test");
else
System.out.println("in else");
}
public static void main(String[] args) {
BooleanQuestion b = new BooleanQuestion();
b.foo();
b.foo2();
}
其中,也输出“在测试中”。
答案 1 :(得分:1)
您将参数命名为与实例变量相同。这里,参数是引用的参数,而不是实例变量。这称为“阴影”,其中简单名称test
作为参数名称会影响也称为test
的实例变量。
在foo
中,您将参数test
更改为true
,而不更改实例变量test
。这就解释了为什么它不会进入if
中的foo2
块。
要分配值,请删除foo
上的参数,或使用this.test
引用实例变量。
this.test = true;
和
if (this.test)
答案 2 :(得分:1)
您需要注意:
由于1和2,您无法在方法中更改布尔传递的状态。
你大多有2个选择:
选择1:为布尔值设置一个可变的持有者,如:
class BooleanHolder {
public boolean value; // better make getter/setter/ctor for this, just to demonstrate
}
因此在您的代码中应该如下所示:
void foo(BooleanHolder test) {
test.value=true;
}
选择2:更合理的选择:从方法中返回值:
boolean foo(boolean test) {
return true; // or you may do something else base on test or other states
}
调用者应该使用它:
boolean value= false;
value = foo(value);
foo2(value);
这种方法更受欢迎,因为它更适合普通的Java编码实践,并且通过方法签名,它向调用者提示它将根据您的输入返回新的值
答案 3 :(得分:0)
您的foo
方法将test
的值更改为true。看起来你想要的是为每个函数使用实例变量。
boolean test = false;
...
foo(test)
foo2(test)
foo(Boolean test){
this.test = true;
}
foo2(Boolean test){
if(this.test)
//Doesn't go in here
}
这样,您的方法只会更改该方法中test
的值,但您的公开test
参数会保留false
值。
答案 4 :(得分:0)
这是一个很好的解释。
http://www.javadude.com/articles/passbyvalue.htm
Java有指针,并且该指针的值被传入。 实际上没有办法将对象本身作为参数传递。你只能 将指针(值)传递给对象。
我的解决方案
public static class MutableBoolean {
public boolean value;
public MutableBoolean(boolean value) {
this.value = value;
}
}
用法:
MutableBoolean needStop = new MutableBoolean(false);
call( new Listener(needStop){
void onCallback(){
needStop.value = true;
}
})