有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

方法Java:变量不是递增的

我有三个类:Movement、Collision和Variables(Variables类是我存储变量的地方,它们都是公共的和静态的。考虑到我是java新手,我不太了解static关键字的作用,所以我的问题可能是static关键字)。在我的碰撞类中,有一个方法可以检查贴图中的碰撞。现在,这种方法非常有效:

public void checkCollision(int x, int y)
 {

    if (x == 100){
        Variables.collisionRight = true;

    } else {
        Variables.collisionRight = false;
    }
 }

在这里,我的运动类中有一个方法不起作用:

public void playerMovement (int x, int y)
{
    if (RightKeyPressed == true & collisionRight == false) {
        x += Variables.speed;

    }
}

以下是我如何称呼这些方法:

someObject.checkCollision(Variables.playerX, Variables.playerY);
someOtherObject.playerMovement(Variables.playerX, Variables.playerY);

在我看来,问题在于这一行:

x += Variables.speed;

如果我改变

x

Variables.playerX

一切都很好,但我不希望这样

它不起作用了。基本上应该是(Variables.playerX+=Variables.speed) 所有的方法都是样本

我想知道为什么我的x(Variables.playerX)变量没有增加3(这是我的Variables.speed变量)


共 (1) 个答案

  1. # 1 楼答案

    正在发生的事情是Variables.playerX被值传递为x。当函数修改x时,它实际上是在修改Variables.playerX的本地副本

    有关进一步讨论,请参见Is Java "pass-by-reference" or "pass-by-value"?Java is Pass-by-Value, Dammit!

    解决这个问题的一种方法是通过传递Variables对象(引用)而不是xy

    public void playerMovement (Variables vars)
    {
        if (RightKeyPressed && !collisionRight) {
            vars.x += vars.speed;
        }
    }
    

    注意我是如何重写if条件的。虽然你所说的并不是不正确的,但习惯上我们并没有明确地将布尔与truefalse进行比较。此外,在布尔上下文中,&&||优于&|,因为它们short-circuit