更改布尔值?

时间:2013-12-18 01:17:17

标签: java boolean primitive-types

我对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的函数。如果有人能帮助我,这将是伟大的。

5 个答案:

答案 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. 在Java中,参数是按值传递的。
  2. 布尔值,boolean的包装类型,是不可变的。
  3. 由于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;
   }

})