[英]Calling non-static method (in a different class) from static
我已經在這里四處尋找解決方案,但是找不到。 我嘗試了這些以及其他許多方法,但遇到了同樣的問題。
我試圖制作一個簡單的文字游戲,但遇到一個問題,我有一個主類和一個名為“ gameboard”的類,該類作為數組定義如下:
static GameBoard[] gameboard = new GameBoard[9];
現在,這很好用,直到我嘗試更改這些數組對象中單個對象的特征為止。 我會做:
gameboard[input].setState(2);
並且應該更改的游戲板的特定實例將不是唯一的實例:當我這樣做時,它們都將更改。 有點奇怪。 僅應更改gameboard[**input**]
,而不更改所有9個實例。 我擁有的每個變量和方法都是“靜態”的,但是由於main方法(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
}
數組中的其他對象不應更改。 您可以添加更多代碼以獲得更多上下文嗎?
據我了解,您正在執行以下操作:
public class Main {
public static String[] strings = new String[2];
public static void main(String[] args) {
strings[0] = "test";
System.out.println(strings[1]);
}
}
在我的示例中,輸出為預期的“空”。
我如何擺脫所有這些靜電?
只需在main函數中創建對象的實例。
GameBoard[] gameboard = new GameBoard[9];
對於您描述要發生的事情,必須將游戲板數組的所有元素都設置為同一對象(與靜態數組無關),檢查用GameBoard類的新實例填充gameBoard數組的代碼是否存在錯誤這可能導致將同一實例寫入所有元素(或在此處發布該代碼,以便人們可以看到問題)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.