繁体   English   中英

为什么布尔值会更改Java方法中的值

[英]Why does boolean change value in method in java

我想知道为什么如果我在secondPart方法中设置eq = false,然后在removeAccess方法中将其更改为true(因为System.out.println显示eq = true),然后又回到system的secondPart()中。 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);


}

removeAccess ,您的eq变量是maineq的副本。 更改removeAccesseq不改变eqmain

如果要从removeAccess获得值eq ,则必须返回它。 无需将其作为参数传递; 删除boolean参数。

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

然后在main

eq = removeAccess(copy,d);

布尔值不是类而是原始类型。 在函数调用中,您传递值false而不是对该对象的引用。 在函数中更改参数的值对原始布尔值无效。

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

他只是想知道为什么。 我说给openCage解决方案。 我可以通过一些链接进一步阐述他的答案。 如果希望通过引用传递变量,则可以将其包装在一个类中( 如何通过引用传递原始数据类型? ),但是我建议仅返回rgettman上面提到的布尔值的想法。

这是未实现为类的Java基元文档的链接。

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

因为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!

removeAccess方法中,将局部变量eq设置为true。 声明为要设置的参数的变量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM