java 代码问题中的输出不符合预期
Output doesn't as expected in java code problem
我是 java 的新人。我正在研究一个问题,用蜗牛填满畜栏,蜗牛根据随机摆动方向放牧。但是输出并不像预期的那样。
package fill;
import java.util.Random;
public class FillTheCorral extends Gate {
public static final int sRANDOM_SEED=1234;
private static final int sMAX_GATES=4;
public static void main (String[] args) {
Random randomNumber=new Random(sRANDOM_SEED);
FillTheCorral mFillTheCorral=new FillTheCorral();
Gate[] corral=new Gate[sMAX_GATES];
for (int i=0; i<corral.length; i++) {
corral[i]=new Gate();
}
do {
mFillTheCorral.setCorralGates(corral , randomNumber);
} while (!mFillTheCorral.anyCorralAvailable(corral));
}
public void setCorralGates(Gate[] gate, Random selectDirection) {
System.out.println("Initial gate setup:");
for(int i=0;i<gate.length;i++){
int randDir = selectDirection.nextInt(3)-1;
gate[i].setSwing(randDir);
System.out.println("Gate " + i + ": "+ randDir);
}
}
public boolean anyCorralAvailable(Gate[] corral) {
for(int i=0;i<corral.length;i++){
if(corral[i].getSwingDirection() == IN)
return true;
}
return false ;
}
}
class Gate {
public static final int OUT=-1;
public static final int IN=1;
public static final int CLOSED=0;
private static int mSwing;
public static
int getSwingDirection () {
return mSwing;
}
public static boolean setSwing (int dir) {
mSwing=dir;
if (mSwing == IN) return true;
if (mSwing == OUT) return true;
if (mSwing == CLOSED) return true;
return false;
}
public int thru (int count) {
if (getSwingDirection() == IN) {
return +count;
} else if (getSwingDirection() == OUT) {
return -count;
} else {
count*=0;
return count;
}
}
}
预期输出:
初始门设置:
门 0: 1
门 1: 1
门 2: 1
3号门:-1
实际输出:
初始门设置:
门 0: 1
门 1: 1
门 2: 1
3号门:-1
初始门设置:
门 0: 1
门 1:-1
门 2: 0
3 号门:0
初始门设置:
门 0:-1
登机口 1:0
门 2: 0
3号门:1
我得到 x3 倍门随机方向。
问题是门的 mSwing
是静态的。当您在 for 循环中调用 gate[i].setSwing(randDir)
时,您每次都在替换相同的静态变量。这就是为什么您的 while 循环仅在 Gate 3 == 1 时结束。
尝试从 mSwing
变量中删除静态。
您的问题是您在 Gate
class 中将字段 mSwing
及其 getters/setters 定义为 static
。静态字段每个 class 仅存在一次,这意味着您创建的所有 4 个 Gate 对象将共享 mSwing
的相同值,而不是每个门都有自己的 mSwing
.[=17= 值]
更多信息请阅读:What does the 'static' keyword do in a class?
如果将字段更改为正常 non-static 字段,您将获得预期的输出:
private int mSwing;
public int getSwingDirection () {
return mSwing;
}
public boolean setSwing (int dir) {
mSwing=dir;
if (mSwing == IN) return true;
if (mSwing == OUT) return true;
if (mSwing == CLOSED) return true;
return false;
}
我认为问题在于您将变量 mSwing 声明为 static,这意味着它与每个单独的对象无关,但使用 class,所有对象将共享相同的值。
因此,当您从对象调用 getSwingDirection() 时,它将 return class 包含由方法 setSwing().
我在
添加了一个日志来显示结果
public boolean anyCorralAvailable(Gate[] corral) {
System.out.println("Value of getSwingDirection():");
for (int i = 0; i < corral.length; i++) {
System.out.println("corral[" +i + "]: " + corral[i].getSwingDirection());
if (corral[i].getSwingDirection() == IN)
return true;
}
return false;
}
使用 static 修饰符的结果:
Initial gate setup:
Gate 0: 1
Gate 1: 1
Gate 2: 1
Gate 3: -1
Value of getSwingDirection():
corral[0]: -1
corral[1]: -1
corral[2]: -1
corral[3]: -1
Initial gate setup:
Gate 0: 1
Gate 1: -1
Gate 2: 0
Gate 3: 0
Value of getSwingDirection():
corral[0]: 0
corral[1]: 0
corral[2]: 0
corral[3]: 0
Initial gate setup:
Gate 0: -1
Gate 1: 0
Gate 2: 0
Gate 3: 1
Value of getSwingDirection():
corral[0]: 1
Process finished with exit code 0
没有 static 修饰符的结果:
Initial gate setup:
Gate 0: 1
Gate 1: 1
Gate 2: 1
Gate 3: -1
Value of getSwingDirection():
corral[0]: 1
Process finished with exit code 0
从 mSwing 以及方法 setSwing() 和 static 中删除修饰符=25=]getSwingDirection() 会解决你的问题。
我是 java 的新人。我正在研究一个问题,用蜗牛填满畜栏,蜗牛根据随机摆动方向放牧。但是输出并不像预期的那样。
package fill;
import java.util.Random;
public class FillTheCorral extends Gate {
public static final int sRANDOM_SEED=1234;
private static final int sMAX_GATES=4;
public static void main (String[] args) {
Random randomNumber=new Random(sRANDOM_SEED);
FillTheCorral mFillTheCorral=new FillTheCorral();
Gate[] corral=new Gate[sMAX_GATES];
for (int i=0; i<corral.length; i++) {
corral[i]=new Gate();
}
do {
mFillTheCorral.setCorralGates(corral , randomNumber);
} while (!mFillTheCorral.anyCorralAvailable(corral));
}
public void setCorralGates(Gate[] gate, Random selectDirection) {
System.out.println("Initial gate setup:");
for(int i=0;i<gate.length;i++){
int randDir = selectDirection.nextInt(3)-1;
gate[i].setSwing(randDir);
System.out.println("Gate " + i + ": "+ randDir);
}
}
public boolean anyCorralAvailable(Gate[] corral) {
for(int i=0;i<corral.length;i++){
if(corral[i].getSwingDirection() == IN)
return true;
}
return false ;
}
}
class Gate {
public static final int OUT=-1;
public static final int IN=1;
public static final int CLOSED=0;
private static int mSwing;
public static
int getSwingDirection () {
return mSwing;
}
public static boolean setSwing (int dir) {
mSwing=dir;
if (mSwing == IN) return true;
if (mSwing == OUT) return true;
if (mSwing == CLOSED) return true;
return false;
}
public int thru (int count) {
if (getSwingDirection() == IN) {
return +count;
} else if (getSwingDirection() == OUT) {
return -count;
} else {
count*=0;
return count;
}
}
}
预期输出: 初始门设置: 门 0: 1 门 1: 1 门 2: 1 3号门:-1
实际输出:
初始门设置: 门 0: 1 门 1: 1 门 2: 1 3号门:-1
初始门设置: 门 0: 1 门 1:-1 门 2: 0 3 号门:0
初始门设置: 门 0:-1 登机口 1:0 门 2: 0 3号门:1
我得到 x3 倍门随机方向。
问题是门的 mSwing
是静态的。当您在 for 循环中调用 gate[i].setSwing(randDir)
时,您每次都在替换相同的静态变量。这就是为什么您的 while 循环仅在 Gate 3 == 1 时结束。
尝试从 mSwing
变量中删除静态。
您的问题是您在 Gate
class 中将字段 mSwing
及其 getters/setters 定义为 static
。静态字段每个 class 仅存在一次,这意味着您创建的所有 4 个 Gate 对象将共享 mSwing
的相同值,而不是每个门都有自己的 mSwing
.[=17= 值]
更多信息请阅读:What does the 'static' keyword do in a class?
如果将字段更改为正常 non-static 字段,您将获得预期的输出:
private int mSwing;
public int getSwingDirection () {
return mSwing;
}
public boolean setSwing (int dir) {
mSwing=dir;
if (mSwing == IN) return true;
if (mSwing == OUT) return true;
if (mSwing == CLOSED) return true;
return false;
}
我认为问题在于您将变量 mSwing 声明为 static,这意味着它与每个单独的对象无关,但使用 class,所有对象将共享相同的值。
因此,当您从对象调用 getSwingDirection() 时,它将 return class 包含由方法 setSwing().
我在
添加了一个日志来显示结果public boolean anyCorralAvailable(Gate[] corral) {
System.out.println("Value of getSwingDirection():");
for (int i = 0; i < corral.length; i++) {
System.out.println("corral[" +i + "]: " + corral[i].getSwingDirection());
if (corral[i].getSwingDirection() == IN)
return true;
}
return false;
}
使用 static 修饰符的结果:
Initial gate setup:
Gate 0: 1
Gate 1: 1
Gate 2: 1
Gate 3: -1
Value of getSwingDirection():
corral[0]: -1
corral[1]: -1
corral[2]: -1
corral[3]: -1
Initial gate setup:
Gate 0: 1
Gate 1: -1
Gate 2: 0
Gate 3: 0
Value of getSwingDirection():
corral[0]: 0
corral[1]: 0
corral[2]: 0
corral[3]: 0
Initial gate setup:
Gate 0: -1
Gate 1: 0
Gate 2: 0
Gate 3: 1
Value of getSwingDirection():
corral[0]: 1
Process finished with exit code 0
没有 static 修饰符的结果:
Initial gate setup:
Gate 0: 1
Gate 1: 1
Gate 2: 1
Gate 3: -1
Value of getSwingDirection():
corral[0]: 1
Process finished with exit code 0
从 mSwing 以及方法 setSwing() 和 static 中删除修饰符=25=]getSwingDirection() 会解决你的问题。