gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:43:52 29 4
gpt4 key购买 nike

我已经在这里四处寻找解决方案,但找不到。我试过 these ones和许多其他人,我遇到了同样的问题。

我正在尝试制作一个简单的文字游戏,但我遇到了一个问题,我有一个主类和一个名为“gameboard”的类,我将其定义为一个数组,如下所示:

static GameBoard[] gameboard = new GameBoard[9];

现在,在我尝试更改这些数组对象中的单个对象的特征之前,它工作正常。我会做:

gameboard[input].setState(2);

并且应该更改的游戏板的特定实例不会是唯一的:当我这样做时,它们都会发生变化。有点奇怪。只有 gameboard[**input**] 应该改变,而不是所有 9 个游戏板实例。我拥有的每个变量和方法都是“静态的”,但是由于主要方法(public static void main ...),一切似乎都必须是静态的。如何消除所有这些静电?

游戏板类

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;
}
}

主类(称为游戏)

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 设为非静态会在引用其中的任何方法时导致空指针异常。

最佳答案

static 变量属于,而不是对象,所以当然您所有的GameBoard都会受到影响!

仅仅因为您处于静态方法中并不意味着您不能操作实例变量。首先,将 GameBoard 类中的所有内容设为非静态(除非您确实需要在所有实例之间共享某些值)。这包括您的实例变量和您的 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
}

关于java - 从静态调用非静态方法(在不同的类中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37930606/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com