Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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_Object - Fatal编程技术网

Java 新对象似乎会更改以前对象的字段

Java 新对象似乎会更改以前对象的字段,java,object,Java,Object,我正在写一个包含电梯作为障碍的游戏。电梯在屏幕左侧或右侧生成,并有随机机会成为上升电梯或下降电梯。看起来是这样的: public class Elevator extends WorldObject { public static boolean ascending; public Elevator(int screenHeight, int xPos) { super(xPos, screenHeight, 0, 0); ascending

我正在写一个包含电梯作为障碍的游戏。电梯在屏幕左侧或右侧生成,并有随机机会成为上升电梯或下降电梯。看起来是这样的:

public class Elevator extends WorldObject {

    public static boolean ascending;

    public Elevator(int screenHeight, int xPos) {
        super(xPos, screenHeight, 0, 0);
        ascending = new Random().nextBoolean();
    }

    static public boolean isAscending(){
        return ascending;
    }

}
public class WorldObject {

    protected float posX;
    protected float posY;
    protected float velX, velY;

    public float getPosX() {
        return posX;
    }

    public void setPosX(float posX) {
        this.posX = posX;
    }

    public float getPosY() {
        return posY;
    }

    public void setPosY(float posY) {
        this.posY = posY;
    }

    public float getVelX() {
        return velX;
    }

    public void setVelX(float velX) {
        this.velX = velX;
    }

    public float getVelY() {
        return velY;
    }

    public void setVelY(float velY) {
        this.velY = velY;
    }

    public WorldObject(float posX, float posY, float velX, float velY) {
        this.posX = posX;
        this.posY = posY;
        this.velX = velX;
        this.velY = velY;
    }

}
它从中扩展的WorldObject如下所示:

public class Elevator extends WorldObject {

    public static boolean ascending;

    public Elevator(int screenHeight, int xPos) {
        super(xPos, screenHeight, 0, 0);
        ascending = new Random().nextBoolean();
    }

    static public boolean isAscending(){
        return ascending;
    }

}
public class WorldObject {

    protected float posX;
    protected float posY;
    protected float velX, velY;

    public float getPosX() {
        return posX;
    }

    public void setPosX(float posX) {
        this.posX = posX;
    }

    public float getPosY() {
        return posY;
    }

    public void setPosY(float posY) {
        this.posY = posY;
    }

    public float getVelX() {
        return velX;
    }

    public void setVelX(float velX) {
        this.velX = velX;
    }

    public float getVelY() {
        return velY;
    }

    public void setVelY(float velY) {
        this.velY = velY;
    }

    public WorldObject(float posX, float posY, float velX, float velY) {
        this.posX = posX;
        this.posY = posY;
        this.velX = velX;
        this.velY = velY;
    }

}
每5秒钟将创建一个电梯,并将其添加到
电梯的ArrayList中,如下所示:

    if (timeToElevator > 5.0f) {
        timeToElevator = 0;
        Elevator elevator = new Elevator((int) screenHeight, (int) generateElevatorXPos());
        Sprite eSprite = new Sprite(elevatorTexture);
        eSprite.setOrigin(0, 0);
        elevators.add(elevator);
        elevatorSprites.add(eSprite);
    }
然后,我检查每个电梯中与玩家的碰撞,如果超出边界,则将其移除,如果两者均未发生,则更新电梯对象的位置:

public static void calculateElevatorCollisions() {
    int counter = 0;
    for (Iterator<Elevator> i = elevators.iterator(); i.hasNext(); ) {
        Elevator item = i.next();
        if (item.getPosY() < -100) {
            //remove elevator
        } else if (..collision..) {
            //collision
        } else {
            item.setVelY(item.isAscending() ? -5 : 5);
            item.setPosY(item.getVelY() + item.getPosY());
            elevatorSprites.get(counter).setPosition(item.getPosX(),
                    item.getPosY());
            counter++;
        }
public static void calculateElevatorCollisions(){
int计数器=0;
for(迭代器i=1.Iterator();i.hasNext();){
电梯项目=i.下一个();
if(item.getPosY()<-100){
//拆下升降机
}否则,如果(…碰撞…){
//碰撞
}否则{
item.setVelY(item.isAscending()?-5:5);
item.setPosY(item.getVelY()+item.getPosY());
elevatorSprites.get(计数器).setPosition(项.getPosX(),
item.getPosY());
计数器++;
}
我的问题是,无论何时创建新的
电梯
,所有当前的
电梯
都会将其方向更改为新的
电梯
的方向。因此,假设我绘制了两个上升电梯,无论何时创建第三个电梯下降,其他两个先前上升的电梯现在都会上升

这是什么原因造成的?

这是您的问题:

public static boolean ascending;
       ^^^^^^
static
表示“这是一个由所有对象共享的类字段”。因此,如果您从一个对象更改了字段,则该类型的所有对象都会注意到该字段

删除它以使
升序
成为一个实例字段意味着
电梯的每个实例都有自己的副本,它可以自己修改,而无需更改其他实例的副本。

这是您的问题:

public static boolean ascending;
       ^^^^^^
static
表示“这是一个由所有对象共享的类字段”。因此,如果您从一个对象更改了字段,则该类型的所有对象都会注意到该字段

删除它以使
升序
成为一个实例字段意味着
电梯的每个实例都有自己的副本,它可以自己修改,而无需更改其他实例的副本。

这是您的问题:

public static boolean ascending;
       ^^^^^^
static
表示“这是一个由所有对象共享的类字段”。因此,如果您从一个对象更改了字段,则该类型的所有对象都会注意到该字段

删除它以使
升序
成为一个实例字段意味着
电梯的每个实例都有自己的副本,它可以自己修改,而无需更改其他实例的副本。

这是您的问题:

public static boolean ascending;
       ^^^^^^
static
表示“这是一个由所有对象共享的类字段”。因此,如果您从一个对象更改了字段,则该类型的所有对象都会注意到该字段

删除它以使
升序
成为一个实例字段意味着
电梯的每个实例都有自己的副本,它可以自己修改,而无需更改其他实例的副本。

更改

public static boolean ascending;

将变量设置为静态时,它是一个
变量,而不是
实例
变量。类变量是对象的所有
实例
共享的变量,而
实例
变量特定于对象的
实例

public static boolean ascending;

将变量设置为静态时,它是一个
变量,而不是
实例
变量。类变量是对象的所有
实例
共享的变量,而
实例
变量特定于对象的
实例

public static boolean ascending;

将变量设置为静态时,它是一个
变量,而不是
实例
变量。类变量是对象的所有
实例
共享的变量,而
实例
变量特定于对象的
实例

public static boolean ascending;

当您将变量设置为静态时,它是一个
class
变量,而不是
实例
变量。类变量是对象的所有
实例
共享的变量,而
实例
变量特定于对象的
实例

,因为我还不能评论(rep),我想补充一点:

您正在使用升序的getter isAscending()练习封装;但是,您封装的字段是
public
,可以从所有范围访问它

将封装字段保持为私有是一种很好的做法

而且,似乎每个人都只是声明字段将更改为非静态变量;然而,该方法仍然是静态的,即使它实际上也是一个实例方法

所需的变更:

公共静态布尔升序;
变成
私有布尔升序;

……还有

静态公共布尔isAscending()
变成
public boolean isascing()

由于我还不能发表评论(rep),我想再做一点说明:

您正在使用升序的getter isAscending()练习封装;但是,您封装的字段是
public
,可以从所有范围访问它

将封装字段保持为私有是一种很好的做法

而且,似乎每个人都只是声明字段将更改为非静态变量;然而,该方法仍然是静态的,即使它实际上也是一个实例方法

结果素