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

为什么在java中布尔值会改变方法中的值,java,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); } pri

我想知道为什么如果我在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);


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

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

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

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

在removeAccess中,eq变量是来自main的eq的副本。更改removeAccess的eq不会更改main中的eq

如果要从removeAccess获取值eq,则必须返回该值。不需要将其作为参数传递;删除布尔参数

private boolean removeAccess(List<Integer> copy, Integer letterNum) {
    boolean eq = false;
    // rest of code from your method remains the same
    return eq;
}
在removeAccess中,eq变量是来自main的eq的副本。更改removeAccess的eq不会更改main中的eq

如果要从removeAccess获取值eq,则必须返回该值。不需要将其作为参数传递;删除布尔参数

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

boolean不是一个类,而是一个基本类型。 在函数调用中,将值false传递给对象,而不是对象的引用。
更改函数中Parameter的值对原始布尔值没有影响。

布尔值不是类,而是基元类型。 在函数调用中,将值false传递给对象,而不是对象的引用。
更改函数中Parameter的值对原始布尔值没有影响。

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

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

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

这里有一个链接,指向未作为类实现的Java原语文档


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

这里有一个链接,指向未作为类实现的Java原语文档


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

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

因为参数是通过JavaFIY中的值传递的:letterNum是一个整数而不是int。应该使用等于而不是==来比较整数。例如ifletterNum.equalscopy.geti==通常情况下,如果变量是int之类的基本体,则比较值;如果变量是对象,则比较引用。@SleimanJneidi每个人的答案都不错,但我最喜欢你的答案,因为它确实回答了我的问题,为什么它不起作用。Thanks@Rika我将把它作为答案发布,因为参数在JavaFIY中是通过值传递的:letterNum是一个整数而不是int。应该使用等于而不是==来比较整数。例如ifletterNum.equalscopy.geti==通常比较变量是int之类的基本体时的值,或者是对象时的引用。@SleimanJneidi每个人的答案都不错,但我最喜欢你的答案,因为它确实回答了我的问题
估计它为什么不起作用。Thanks@Rika我会把它作为一个答案贴出来,如果eq是一个对象,那就没什么区别了。它可以通过调用实例上的方法来更改实例的属性,但方法内的eq仍然是引用的副本:分配给eq(例如eq=null)在方法外没有任何效果。如果eq是对象,则没有区别。它可以通过调用实例上的方法来更改实例的属性,但方法内的eq仍然是引用的副本:分配给eq(例如eq=null)在方法外没有任何效果。