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