Ich habe mich hier um eine Lösung gekümmert, aber ich kann keine finden. Ich habe versucht these ones und viele andere, und ich laufe auf das gleiche Problem.Aufruf der nicht statischen Methode (in einer anderen Klasse) als statische
Ich versuche, ein einfaches Text-Spiel zu machen, und ich laufe in die Frage, wo ich eine Hauptklasse habe, und eine Klasse namens „Spielfeld“, die ich als ein Array habe wie folgt definiert:
static GameBoard[] gameboard = new GameBoard[9];
Jetzt funktioniert das gut, bis ich versuche, die Eigenschaften eines einzelnen dieser Array-Objekte zu ändern. Ich werde tun:
gameboard[input].setState(2);
und die spezifische Instanz von Spielplatte, die sein wird, nicht die einzige verändern sollte: sie alle ändern, wenn ich dies tun. Es ist komisch. Nur gameboard[**input**]
sollte sich ändern, nicht alle 9 der GameBoard-Instanzen. JEDE Variable und Methode, die ich habe, ist "statisch", aber wegen der Hauptmethode (public static void main ...) scheint alles statisch zu sein. Wie kann ich all diese statische Elektrizität loswerden?
Game Klasse
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;
}
}
Hauptklasse (genannt Spiel)
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();
}
}
UPDATE: Die aktuellen Antworten nicht funktionieren. Obwohl Eclipse dies nicht erkennt, verursacht GameBoard nicht-statisch Nullzeiger-Ausnahmen, wenn auf eine Methode verwiesen wird.
"Jede Variable und Methode, die ich habe, ist" statisch "" - das ist keine gute Idee, wenn Sie wollen, dass verschiedene Instanzen einen anderen Zustand haben. Verstehst du was "statisch" bedeutet? –
Ihr Problem ist, Sie versuchen, "statische" Instanzen zu haben, was ein Widerspruch ist. 'setState' ändert nicht alle von ihnen, Sie haben nur einen Satz von statischen Variablen zu aktualisieren. – Grayson
Nicht vollständig, obwohl ich Java vor über 2 Jahren gelernt habe. Ich habe in letzter Zeit nicht viel Java benutzt, aber ich erinnere mich nicht, jemals "statisch" gelernt zu haben. Englisch sagt mir, "statisch" ist unveränderlich, aber ich denke, das ist _leicht_ aus, da sich der Wert ändern kann. – Bobdabiulder