Java 实例变量重置其值

Java 实例变量重置其值,java,libgdx,Java,Libgdx,此代码显示奇怪的行为。BaseActor类只是按顺序调用:initPhysics、initGraphics和onCreate(仅一次),然后act(针对每个帧)。预期的行为是,在onCreate方法中,我持有fixX值(实际上是-6),以使用该值设置对象每帧的X位置,从而使对象的X轴保持静态。我在onCreate和act中设置了一个调试点,并适当地调用了他。 什么时候 正如预期的那样,他得到了值6,但在act中,fixX值返回到0。 当我将fixX变量更改为static时,一切正常。我不知道怎么

此代码显示奇怪的行为。BaseActor类只是按顺序调用:initPhysics、initGraphics和onCreate(仅一次),然后act(针对每个帧)。预期的行为是,在onCreate方法中,我持有
fixX
值(实际上是-6),以使用该值设置对象每帧的X位置,从而使对象的X轴保持静态。我在onCreate和act中设置了一个调试点,并适当地调用了他。 什么时候

正如预期的那样,他得到了值6,但在act中,
fixX
值返回到0。 当我将
fixX
变量更改为static时,一切正常。我不知道怎么做。我在Birdator的构造函数上设置了一个系统,以确保只创建一次对象。 Box2D引擎的LIGDX C++代码的JNI接口是一个JNI接口。p>
public class BirdActor extends BaseActor {


   private float fixX = 0;

    public BirdActor() {
        System.out.println("Created");
    }

    @Override
    protected Body initPhysics() {
        return Assets.scene.getNamed(Body.class, "bird").get(0);
    }

    @Override
    protected void onCreate() {
        fixX = getBody().getPosition().x;
    }

    @Override
    public void act() {
        getBody().setTransform(fixX, getBody().getPosition().y, 0);
        super.act();


    }

    @Override
    protected Sprite initGraphics() {
        Sprite sprite = new Sprite(Assets.textureBird);
        return sprite;
    }

}

问题可能是因为您在构造函数中调用了虚方法

因此,呼叫列表是:

1. BaseActor()
2. onCreate() of BirdActor
3. BirdActor() whitch inits the fixX = 0. 

因此,初始化
fixX
是在
onCreate()方法之后调用的。尝试删除
fixX
初始化(
=0

BaseActor类中有什么?您的代码是在多线程环境中执行的吗?如果是,那么您应该向fixX变量添加一个volatile声明。我猜您每次都在创建一个新的对象实例,因此第二次查看该值时,会看到另一个对象中的值。@Sanjeev:没有什么重要的,只是按该顺序调用方法:initPhysics、initGraphics和onCreate。@Maxim:否,它是单线程的,但我回家后会尝试使用volatile。
1. BaseActor()
2. onCreate() of BirdActor
3. BirdActor() whitch inits the fixX = 0.