Java同一变量在不同的语言中有不同的值

Java同一变量在不同的语言中有不同的值,java,libgdx,Java,Libgdx,所以我有一个类,它处理用户对作为libgdx应用程序一部分创建的屏幕的输入。 我的问题是变量cameraDelta是一个矢量2,在keyTyped和getCameraDelta中似乎有不同的值 在这两种方法中,在运行时使用sys.out.println时,无论何时按下“wasd”中的任何一个,都会显示该值的变化,并且该值会随着时间的推移而保持不变,但从getCameraDelta输出时,该值始终保持在(0,0) public class InputHandler implements Input

所以我有一个类,它处理用户对作为libgdx应用程序一部分创建的屏幕的输入。 我的问题是变量cameraDelta是一个矢量2,在keyTyped和getCameraDelta中似乎有不同的值

在这两种方法中,在运行时使用sys.out.println时,无论何时按下“wasd”中的任何一个,都会显示该值的变化,并且该值会随着时间的推移而保持不变,但从getCameraDelta输出时,该值始终保持在(0,0)

public class InputHandler implements InputProcessor {

    private Firetruck myTruck;
    private GameWorld myWorld;
    private int mouseX;
    private int mouseY;
    private Vector2 cameraDelta;

    public InputHandler(GameWorld myWorld) {
        this.myWorld = myWorld;
        myTruck = myWorld.getFiretruck();
        cameraDelta = new Vector2(0, 0);
    }

    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        if (character == 'w') {
            cameraDelta.add(0, 5);
        } else if (character == 's') {
            cameraDelta.add(0, -5);
        } else if (character == 'd') {
            cameraDelta.add(5, 0);
        } else if (character == 'a') {
            cameraDelta.add(-5, 0);
        }
        return false;
    }

    public Vector2 getCameraDelta() {
        /*/
        Vector2 temp = this.cameraDelta.cpy();
        /*/
        Vector2 temp;
        temp = new Vector2(0, 0);
        temp.add(cameraDelta);
        Gdx.app.log("getCameraDelta", cameraDelta.toString());
        cameraDelta.x=0;
        cameraDelta.y=0;
        return temp;
    }

这是因为您正在新的
Vector2
实例中添加一个对象
cameraDelta
。java中的对象是通过引用传递的,因此每当您将某些内容更改为您的
cameraDelta
时,它将在使用的任何地方更改。例如:

public class Foo {
  public int fooNumber;
}

public class Bar {
  public Foo fooBar;

  public Bar() {
      fooBar = new Foo();
      fooBar.fooNumber = 1;
  }

  public void changeReference(Foo foo) {

      System.out.println(fooBar.fooNumber);  // RESULT -> 1

      fooBar = foo;  // here you're making your original foo to
      //point to the "foo" passed in the method

      foo.fooNumber = 0;

      System.out.println(fooBar.fooNumber); // RESULT -> 0
  }

  public static void main(String[] args) {
      Bar bar = new Bar();
      Foo foo = new Foo();
      bar.changeReference(foo);
      System.out.println(bar.fooBar.fooNumber); // RESULT -> 0
  }

}

这是因为您正在新的
Vector2
实例中添加一个对象
cameraDelta
。java中的对象是通过引用传递的,因此每当您将某些内容更改为您的
cameraDelta
时,它将在使用的任何地方更改。例如:

public class Foo {
  public int fooNumber;
}

public class Bar {
  public Foo fooBar;

  public Bar() {
      fooBar = new Foo();
      fooBar.fooNumber = 1;
  }

  public void changeReference(Foo foo) {

      System.out.println(fooBar.fooNumber);  // RESULT -> 1

      fooBar = foo;  // here you're making your original foo to
      //point to the "foo" passed in the method

      foo.fooNumber = 0;

      System.out.println(fooBar.fooNumber); // RESULT -> 0
  }

  public static void main(String[] args) {
      Bar bar = new Bar();
      Foo foo = new Foo();
      bar.changeReference(foo);
      System.out.println(bar.fooBar.fooNumber); // RESULT -> 0
  }

}


对不起,为什么
getCameraDelta
不仅仅是
Vector2 getCameraDelta(){return camerradelta;}
?要么在每次请求时计算它,要么为它设置一个私有变量,但不要同时使用这两个变量:这只会让你自己感到困惑。实际上,getter不需要修改它得到的东西。这就是所谓的副作用,而带有副作用的代码就是带有等待发生的bug的代码。如果要返回副本,请使用复制构造函数:
returnnewvector2(cameraDelta)
,并且不要更改
cameraDelta
@Mike'Pomax'Kamermans中的值。我同意这一点。另外,除非创建了
InputHandler
的新实例,
Vector2
的值不应更改为(0,0),除非手动更改。对吗?初始化到一些正常的默认值是可以的。感谢您指出,我已经将getter更改为简单的getter,并在使用后添加了一个对其进行归零的调用,但是它并没有解决我的问题,即keyTyped中变量的值不会将getCameraDelta中的值从(0,0)更改,即使keytyped中的值从未被归零,就像它引用了两个不同的变量一样,inputhandler似乎被实例化了两次,第一个实例从未保存,第二个实例保存但未连接到屏幕对不起,为什么
getCameraDelta
不仅仅是
Vector2 getCameraDelta(){返回cameraDelta;}
?要么在每次请求时计算它,要么为它使用一个私有变量,但不要同时使用这两个变量:这只会让你自己感到困惑。一个真正的getter不需要修改它得到的东西。这称为副作用,而带有副作用的代码就是带有等待发生的bug的代码。如果你想返回复制,然后使用复制构造函数:
returnnewvector2(cameraDelta)
,不要更改
cameraDelta
@Mike'Pomax'Kamermans中的值。我同意这一点。此外,除非创建了
InputHandler
的新实例,否则
Vector2
的值不应更改为(0,0)除非手动更改。对吗?初始化到一些正常的默认值是可以的。感谢您指出,我已经将getter更改为简单的getter,并在使用后添加了一个对其进行归零的调用,但是它并没有解决我的问题,即keyTyped中的变量值不会将getCameraDelta中的值从(0,0)更改,即使keytyped中的值从未被归零,就像它引用了两个不同的变量一样,InPurthandler似乎被实例化了两次,第一个实例从未保存,第二个实例保存但未连接到屏幕。因此,在问题中发布的代码中,这些是两个“罪魁祸首":
cameraDelta.x=0;
cameraDelta.y=0;
是的,
Foo
是原始的
Vector2
foodumber
cameraDelta的
x
y
虽然这是有意义的,但我不确定这实际上是我遇到的问题。在这两个函数中打印cameraDelta的值会产生这个输出t:
[keytypted](0.0,40.0)[getCameraDelta](0.0,0.0)[keytypted](0.0,45.0)[getCameraDelta](0.0,0.0)[keytypted](0.0,50.0)[getCameraDelta](0.0,0.0)
因此,keyTyped中的值不只是被归零,它似乎引用了一个完全不同的变量,因为它在输出时调用GetCameradeltOok时将其值保持在归零之间:
[keyTyped]
始终与0不同,而
[getCameraDelta]
始终为0,因为您正在返回保存
cameraDelta
对象的
temp
变量。在您的方法返回
temp
之前,您将
cameraDelta
值设置为x=0和y=0,并且因为我已经告诉过您,java对象是通过引用传递的,一旦您进行了
cameraDelta.x=0
,来自
temp
cameraDelta
也会改变它的值,因为它在内存中是同一个引用。因此,对于问题中发布的代码,这些是两个“罪魁祸首”:
cameraDelta.x=0;
cameraDelta.y=0;
是的,
Foo
是原始的
Vector2
foodumber
cameraDelta的
x
y
虽然这是有意义的,但我不确定这实际上是我遇到的问题。在这两个函数中打印cameraDelta的值会产生这个输出t:
[keytypted](0.0,40.0)[getCameraDelta](0.0,0.0)[keytypted](0.0,45.0)[getCameraDelta](0.0,0.0)[keytypted](0.0,50.0)[getCameraDelta](0.0,0.0)
因此,keyTyped中的值不仅仅是被归零,它似乎引用了一个完全不同的变量,因为它在调用getCameraDeltaLook时在输出时保持其值在归零之间:
[keyTyped]
始终是一个不同的变量