[英]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
变量是main
的eq
的副本。 更改removeAccess
的eq
不改变eq
的main
。
如果要从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.