为什么布尔值会改变java中方法的值

时间:2014-11-07 18:54:22

标签: java

我想知道为什么如果我在secondPart方法中设置eq = false然后在removeAccess方法中将其更改为true(对于System.out.println显示eq = true),然后返回secondPart() System.out.println显示eq = false?

 public void secondPart(){
    boolean eq = false; 
    removeAccess(copy,d,eq);
    System.out.println(eq);
 }


private void removeAccess(List<Integer> copy, Integer letterNum,boolean eq){
for(int i =0; i<copy.size(); i++){
        System.out.println("LetterNum:" + letterNum);
        System.out.println("Copy:" + copy.get(i));
        if(letterNum == copy.get(i)){

            copy.remove(letterNum);
            eq = true;
            break;
        }

        else{
            eq = false;

        }
    }

    System.out.println("Eq:" + eq);


}

6 个答案:

答案 0 :(得分:3)

removeAccess中,您的eq变量是来自eq的{​​{1}}的副本。更改main的{​​{1}}不会更改removeAccess中的eq

如果您想要eq的值main,则必须将其返回。无需将其作为参数传递;删除eq参数。

removeAccess

然后在boolean

private boolean removeAccess(List<Integer> copy, Integer letterNum) {
    boolean eq = false;
    // rest of code from your method remains the same
    return eq;
}

答案 1 :(得分:1)

boolean不是类,而是基本类型。 在函数调用中,您将值移交给false而不是对象的引用。 更改函数中参数的值对原始布尔值没有影响。

答案 2 :(得分:1)

您正在尝试通过引用传递传递:您希望方法中的eq 引用传入的相同布尔值。但Java没有通过引用传递。它只有传递值eq的值被复制到一个新的变量中,该变量在方法完成后被丢弃。

答案 3 :(得分:1)

他只想知道原因。我说给openCage解决方案。我可以通过一些链接进一步阐述他的回答。如果你想通过引用传递变量,你可以将它包装在一个类(How do I pass a primitive data type by reference?)中,但我建议简单地返回rgettman上面提到的布尔值。

以下是Java Primitives文档的链接,这些文档未实现为类。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

答案 4 :(得分:1)

因为Java中的参数是按值传递的

 int x = 1;
 fn(x);
 System.out.println(x); // nothing changed

 public void fn(int x){
     x++; // changes stay local to fn
 }

解决此问题的常用方法是返回您更改的值

public int fn(int x){
   x++;
   return x;
}

现在您可以将新值分配给x

int x = 1;
x = fn(x);
System.out.println(x); // it works now, Brilliant!

答案 5 :(得分:0)

removeAccess方法中,您将局部变量eq设置为true。它是被声明为正在设置的参数的变量。

您希望在方法之外声明eq并使其成为类成员,并在方法内部对其进行操作。对于removeAccess方法,您仍然可以将其作为参数接受,但使用this.eq = eq;将参数值分配给类变量。分配值后,请继续使用this.eq(类)来区分本地eq和类eq