从静态调用非静态方法(在不同的 class 中)
Calling non-static method (in a different class) from static
我在这里四处寻找解决方案,但找不到。我尝试了 these ones 和许多其他问题,我 运行 遇到了同样的问题。
我正在尝试制作一个简单的文字游戏,我 运行 遇到了一个问题,我有一个主 class 和一个名为 "gameboard" 的 class我有一个这样定义的数组:
static GameBoard[] gameboard = new GameBoard[9];
现在,在我尝试更改这些数组对象中的单个对象的特征之前,它工作正常。我会做:
gameboard[input].setState(2);
并且应该更改的游戏板的特定实例不会是唯一的:当我这样做时,它们都会发生变化。有点奇怪。只有 gameboard[**input**]
应该改变,而不是所有 9 个游戏板实例。我拥有的每个变量和方法都是 "static",但是由于主要方法(public static void main...),一切似乎都必须是静态的。我如何摆脱所有这些静电?
游戏板Class
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;
}
}
主要class(称为游戏)
package com.name.tictactoe;
import java.util.Scanner;
public class Game {
static boolean turn, win;
static GameBoard[] gameboard;
static Scanner kb = new Scanner(System.in);
static int input;
public static void main(String[] args){
gameboard = new GameBoard[9];
reset();
displayStates();
askTurn();
displayStates();
askTurn();
}
public static void askTurn() {
System.out.println();
System.out.println();
System.out.println("Where do you want to go? Use the numbers shown, where the first segment is the top and the last is the bottom - left to right.");
input = kb.nextInt();
if(input > 8){
System.out.println("Input out of bounds. Game over by default.");
try {
Thread.sleep(1000000000);} catch (InterruptedException e) {e.printStackTrace();}
}
gameboard[input].setState(2);
}
public static void reset(){
for(int i = 0; i < 9; i++){
gameboard[i].setState(0);
}
}
public static void displayStates(){
for(int i = 0; i < 9; i++){
System.out.print(gameboard[i].getState() + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
for(int i = 0; i < 9; i++){
System.out.print(i + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
}
}
更新:当前答案无效。尽管 Eclipse 没有意识到这一点,但将 GameBoard 设为非静态会在引用其中的任何方法时导致空指针异常。
数组中的其他对象不应更改。您能否为更多上下文添加更多代码?
据我了解你,你正在做这样的事情:
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"。
How do I get rid of all this static?
只需在主函数中创建对象的实例。
GameBoard[] gameboard = new GameBoard[9];
一个static
变量属于class,而不是对象,所以当然你所有的GameBoard
都会受到影响!
仅仅因为您处于静态方法中并不意味着您不能操作实例变量。首先,使 GameBoard
class 中的所有内容都成为非静态的(除非您确实需要一些在所有实例之间共享的值)。这包括您的实例变量和您的 getter/setter 方法。
如果您的程序仅通过 main
方法运行,那么请保持您的 GameBoard[]
对象静态。然后,当您调用该方法时:
gameboard[input].setState(2);
这将仅更改索引 input
处的 GameBoard
的状态。
编辑:
要用其中的基本 GameBoard
对象实例化您的 GameBoard[]
,您可以在 main
方法的开头执行此操作:
for(int x=0; x<gameboard.length; x++) {
gameboard[x] = new GameBoard(); //Assuming you want to use the default constructor
}
对于你所描述的情况,gameboard 数组的所有元素都必须设置为同一个对象(与静态数组无关),请检查你的代码,其中你用新的实例填充 gameBoard 数组GameBoard class 可能导致将同一实例写入所有元素的错误(或 post 此处的代码,以便人们可以看到问题)。
我在这里四处寻找解决方案,但找不到。我尝试了 these ones 和许多其他问题,我 运行 遇到了同样的问题。
我正在尝试制作一个简单的文字游戏,我 运行 遇到了一个问题,我有一个主 class 和一个名为 "gameboard" 的 class我有一个这样定义的数组:
static GameBoard[] gameboard = new GameBoard[9];
现在,在我尝试更改这些数组对象中的单个对象的特征之前,它工作正常。我会做:
gameboard[input].setState(2);
并且应该更改的游戏板的特定实例不会是唯一的:当我这样做时,它们都会发生变化。有点奇怪。只有 gameboard[**input**]
应该改变,而不是所有 9 个游戏板实例。我拥有的每个变量和方法都是 "static",但是由于主要方法(public static void main...),一切似乎都必须是静态的。我如何摆脱所有这些静电?
游戏板Class
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;
}
}
主要class(称为游戏)
package com.name.tictactoe;
import java.util.Scanner;
public class Game {
static boolean turn, win;
static GameBoard[] gameboard;
static Scanner kb = new Scanner(System.in);
static int input;
public static void main(String[] args){
gameboard = new GameBoard[9];
reset();
displayStates();
askTurn();
displayStates();
askTurn();
}
public static void askTurn() {
System.out.println();
System.out.println();
System.out.println("Where do you want to go? Use the numbers shown, where the first segment is the top and the last is the bottom - left to right.");
input = kb.nextInt();
if(input > 8){
System.out.println("Input out of bounds. Game over by default.");
try {
Thread.sleep(1000000000);} catch (InterruptedException e) {e.printStackTrace();}
}
gameboard[input].setState(2);
}
public static void reset(){
for(int i = 0; i < 9; i++){
gameboard[i].setState(0);
}
}
public static void displayStates(){
for(int i = 0; i < 9; i++){
System.out.print(gameboard[i].getState() + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
for(int i = 0; i < 9; i++){
System.out.print(i + " ");
if(i ==2 || i ==5){
System.out.print(" II ");
}
}
System.out.println();
}
}
更新:当前答案无效。尽管 Eclipse 没有意识到这一点,但将 GameBoard 设为非静态会在引用其中的任何方法时导致空指针异常。
数组中的其他对象不应更改。您能否为更多上下文添加更多代码?
据我了解你,你正在做这样的事情:
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"。
How do I get rid of all this static?
只需在主函数中创建对象的实例。
GameBoard[] gameboard = new GameBoard[9];
一个static
变量属于class,而不是对象,所以当然你所有的GameBoard
都会受到影响!
仅仅因为您处于静态方法中并不意味着您不能操作实例变量。首先,使 GameBoard
class 中的所有内容都成为非静态的(除非您确实需要一些在所有实例之间共享的值)。这包括您的实例变量和您的 getter/setter 方法。
如果您的程序仅通过 main
方法运行,那么请保持您的 GameBoard[]
对象静态。然后,当您调用该方法时:
gameboard[input].setState(2);
这将仅更改索引 input
处的 GameBoard
的状态。
编辑:
要用其中的基本 GameBoard
对象实例化您的 GameBoard[]
,您可以在 main
方法的开头执行此操作:
for(int x=0; x<gameboard.length; x++) {
gameboard[x] = new GameBoard(); //Assuming you want to use the default constructor
}
对于你所描述的情况,gameboard 数组的所有元素都必须设置为同一个对象(与静态数组无关),请检查你的代码,其中你用新的实例填充 gameBoard 数组GameBoard class 可能导致将同一实例写入所有元素的错误(或 post 此处的代码,以便人们可以看到问题)。