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
,可以从所有范围访问它
将封装字段保持为私有是一种很好的做法
而且,似乎每个人都只是声明字段将更改为非静态变量;然而,该方法仍然是静态的,即使它实际上也是一个实例方法
结果素