簡體   English   中英

從靜態調用非靜態方法(在不同的類中)

[英]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);

這只會更改索引inputGameBoard的狀態。

編輯:

要在其中包含基本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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM