Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么变量更改不能持久化方法调用?_Java_Variables - Fatal编程技术网

Java 为什么变量更改不能持久化方法调用?

Java 为什么变量更改不能持久化方法调用?,java,variables,Java,Variables,我正试图编程一个bug,使其在附加到自定义房间对象的阵列中移动,同时记录每个瓷砖被踩到的次数 房间对象工作正常,移动和计数也正常。但是,在退出nextMove方法后,bug的坐标,bugX和bugY以某种方式恢复为0。它们的值仅在退出该方法时恢复;即使是nextMove方法中的最后一行代码本身也会使用它们的新值 该方法的相关部分随附,但可根据要求添加其他部分 if (dirNum == 0 && bugY < length-1) //Move up

我正试图编程一个bug,使其在附加到自定义房间对象的阵列中移动,同时记录每个瓷砖被踩到的次数

房间对象工作正常,移动和计数也正常。但是,在退出
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);
        }

     }

}