从静态调用非静态方法(在不同的类中)

时间:2016-06-20 19:45:38

标签: java methods static instances

我已经在这里做了一些寻找解决方案,但我找不到一个解决方案。我尝试了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非静态时,引用其中的任何方法都会导致空指针异常。

3 个答案:

答案 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数组对于可能导致将同一实例写入所有元素的错误(或在此处发布该代码以便人们可以看到问题)。