我已经在这里做了一些寻找解决方案,但我找不到一个解决方案。我尝试了these ones和其他许多人,我遇到了同样的问题。
我正在尝试创建一个简单的文本游戏,我遇到了一个问题,我有一个主类,一个名为" gameboard"我有一个像这样定义的数组:
group by
现在,这很好用,直到我尝试更改这些数组对象中的单个对象的特征。我会这样做:
static GameBoard[] gameboard = new GameBoard[9];
并且应该改变的游戏板的具体实例将不是唯一的:当我这样做时,它们都会改变。这很奇怪。只有gameboard[input].setState(2);
应该更改,而不是所有9个游戏板实例。我所拥有的每个变量和方法都是"静态",但由于main方法(public static void main ...),所有内容似乎都必须是静态的。我如何摆脱所有这些静电?
GameBoard Class
gameboard[**input**]
主要课程(称为游戏)
package com.name.tictactoe;
public class GameBoard {
char[] States = {'N','X','O'};
char state;
public void setState(int s){
state = States[s];
}
public char getState(){
return state;
}
}
}
更新:目前的答案不起作用。虽然Eclipse没有意识到这一点,但是当GameBoard非静态时,引用其中的任何方法都会导致空指针异常。
答案 0 :(得分:2)
static
变量属于类,而不是对象,所以当然所有GameBoard
都受到影响!
仅仅因为你处于静态方法并不意味着你无法操纵实例变量。首先,使GameBoard
类中的所有内容都是非静态的(除非您确实需要在所有实例中共享某些值)。这包括您的实例变量和getter / setter方法。
如果您的程序仅使用main
方法运行,那么请将GameBoard[]
对象保持为静态。然后,当您进行该方法调用时:
gameboard[input].setState(2);
这将仅更改索引GameBoard
的{{1}}的状态。
修改强>
要在input
内部使用基本GameBoard[]
个对象进行实例化,您可以在GameBoard
方法的开头执行此操作:
main
答案 1 :(得分:1)
数组中的其他对象不应更改。您可以为更多上下文添加更多代码吗?
据我所知,你做的事情如下:
public class Main {
public static String[] strings = new String[2];
public static void main(String[] args) {
strings[0] = "test";
System.out.println(strings[1]);
}
}
在我的例子中输出是" null"如预期的那样。
如何摆脱所有这些静电?
只需在main函数中创建对象的实例。
GameBoard[] gameboard = new GameBoard[9];
答案 2 :(得分:1)
对于你所描述的事情,游戏棋盘阵列的所有元素必须设置为同一个对象(与静态数组无关),检查代码,用GameBoard类的新实例填充gameBoard数组对于可能导致将同一实例写入所有元素的错误(或在此处发布该代码以便人们可以看到问题)。