Java 为什么变量更改不能持久化方法调用?
我正试图编程一个bug,使其在附加到自定义房间对象的阵列中移动,同时记录每个瓷砖被踩到的次数 房间对象工作正常,移动和计数也正常。但是,在退出Java 为什么变量更改不能持久化方法调用?,java,variables,Java,Variables,我正试图编程一个bug,使其在附加到自定义房间对象的阵列中移动,同时记录每个瓷砖被踩到的次数 房间对象工作正常,移动和计数也正常。但是,在退出nextMove方法后,bug的坐标,bugX和bugY以某种方式恢复为0。它们的值仅在退出该方法时恢复;即使是nextMove方法中的最后一行代码本身也会使用它们的新值 该方法的相关部分随附,但可根据要求添加其他部分 if (dirNum == 0 && bugY < length-1) //Move up
nextMove
方法后,bug的坐标,bugX
和bugY
以某种方式恢复为0
。它们的值仅在退出该方法时恢复;即使是nextMove
方法中的最后一行代码本身也会使用它们的新值
该方法的相关部分随附,但可根据要求添加其他部分
if (dirNum == 0 && bugY < length-1) //Move up
bugY++;
else if (dirNum == 1 && bugX < width-1) //Move right
bugX++;
else if (dirNum == 2 && bugY > 0) //Move down
bugY--;
else if (dirNum == 3 && bugX > 0) //Move left
bugX--;
else {
System.out.println("Error: Cannot move " + direction + ".");
canMove = false;
dirNum = generator.nextInt(4);
continue;
}
分配起始坐标的声明不在任何循环中,更不用说调用变量本身的位置了。看起来您是在按值传递
bugX
和bugY
参数。在这种情况下,在方法内更改它们的值不会影响它们在方法外的值。
您可能希望让您的nextMove方法在计算完
bugX
和bugY
后返回新的值,以便您可以将它们收集回实际的bugX
和bugY变量中。@T.J.Crowder在其答案中描述的问题,尽管适用于java
java中作为参数传递的变量是按值传递的。如果值由接收参数的方法更改,则更改仅影响该方法内的值。“外部”值不变
您可以做的是将坐标封装在对象中,并将封装对象作为参数传递。
然后,该方法将按值接收对象,并更改其状态(而不是对象的值)
有关更深入的了解,请参阅
编辑一:
我稍微整理了一下代码。虽然它缺少room
和simSentinel
的声明,但如果您添加了,您应该有一个运行示例
public class Bug{
public int x=0;
public int y=0;
}
public class SimpleSim {
private int dirNum = 0;
private int length = 20;
private int width = 20;
private boolean canMove = true;
private Random generator = new Random();
private boolean endSim = false;
public static void main(String [] args) {
SimpleSim simpleSim = new SimpleSim();
simpleSim.start();
}
private void start() {
Bug myBug = new Bug();
// Give the bug some initial x, y values.
myBug.x = 0;
myBug.y = 0;
while (endSim == false) {
nextMove(myBug);
System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
simSentinel = in.next();
if (simSentinel.charAt(0) == 'n')
endSim = true;
}
}
}
public void nextMove(Bug bug){
if (dirNum == 0 && bug.y < length-1) //Move up
bug.y++;
else if (dirNum == 1 && bug.x < width-1) //Move right
bug.x++;
else if (dirNum == 2 && bug.y > 0) //Move down
bug.y--;
else if (dirNum == 3 && bug.x > 0) //Move left
bug.x--;
else {
System.out.println("Error: Cannot move " + "?" + ".");
canMove = false;
dirNum = generator.nextInt(4);
}
}
}
公共类错误{
公共整数x=0;
公共整数y=0;
}
公共类单纯形{
私有int dirNum=0;
私有整数长度=20;
私有整数宽度=20;
私有布尔值canMove=true;
专用随机生成器=新随机();
私有布尔值endSim=false;
公共静态void main(字符串[]args){
SimpleSim SimpleSim=新SimpleSim();
simpleSim.start();
}
私有void start(){
Bug myBug=新Bug();
//给bug一些初始的x,y值。
myBug.x=0;
myBug.y=0;
while(endSim==false){
下一个移动(myBug);
System.out.print(room.printRoom()+“\n\n下一步移动?(y/n)”);
simSentinel=in.next();
if(simSentinel.charAt(0)='n')
endSim=真;
}
}
}
public void nextMove(Bug){
if(dirNum==0&&bug.y0)//向下移动
bug.y--;
else如果(dirNum==3&&bug.x>0)//向左移动
bug.x--;
否则{
System.out.println(“错误:无法移动“+”?“+”);
canMove=false;
dirNum=generator.nextInt(4);
}
}
}
在nextMove
中是否有bugX
和bugY
参数的名称?当然,该方法内部的更改在其外部是不可见的,它们是通过值传递的。我认为问题的标签是错误的。代码似乎是java(System.out.print()),但问题被标记为javascript.Related:在我的辩护中,问题被标记了(它已经被修复)。我只是,呃,没有注意到System.out.println
调用…:-)(编辑:哦,是你注意到的!)@T.J.Crowder是的,我引用了你的答案,因为问题就是你描述的问题。参数按值传递。您的解释帮助很大;这需要一些努力,但我成功了。使Bug成为一个带有坐标的新自定义对象,并设置nextMove以在更改其坐标后返回该Bug对象。
public class Bug{
public int x=0;
public int y=0;
}
public class SimpleSim {
private int dirNum = 0;
private int length = 20;
private int width = 20;
private boolean canMove = true;
private Random generator = new Random();
private boolean endSim = false;
public static void main(String [] args) {
SimpleSim simpleSim = new SimpleSim();
simpleSim.start();
}
private void start() {
Bug myBug = new Bug();
// Give the bug some initial x, y values.
myBug.x = 0;
myBug.y = 0;
while (endSim == false) {
nextMove(myBug);
System.out.print(room.printRoom() + "\n\nNext move? (y/n) ");
simSentinel = in.next();
if (simSentinel.charAt(0) == 'n')
endSim = true;
}
}
}
public void nextMove(Bug bug){
if (dirNum == 0 && bug.y < length-1) //Move up
bug.y++;
else if (dirNum == 1 && bug.x < width-1) //Move right
bug.x++;
else if (dirNum == 2 && bug.y > 0) //Move down
bug.y--;
else if (dirNum == 3 && bug.x > 0) //Move left
bug.x--;
else {
System.out.println("Error: Cannot move " + "?" + ".");
canMove = false;
dirNum = generator.nextInt(4);
}
}
}