2013-08-17 102 views
1

我正在寫一個簡單的二十一點程序,我打算隨着Java的進步而更好地進行擴展。我的課程沒有很好地涵蓋繼承,他們根本沒有討論子類。來自子類構造函數的調用實例方法

當玩家決定結束遊戲時,我想打印出玩家的總籌碼數。每當我寫的print語句中,我得到的錯誤:

Cannot make a static reference to the non-static field alice.

我不知道的Eclipse是指非靜態字段,因爲只有static我所熟悉的是在一個最高級的方法。我是否必須創建一個名爲Player的完全獨立的類來進行參考?

我已經附上了有關子類和整個主要方法的代碼片段。此外,這是個人項目,而不是家庭作業,以幫助建立我的投資組合,所以任何您認爲值得的建議,我很歡迎。謝謝您的幫助。

public class BlackJack 
{ 

public class Player extends BlackJack 
{ 
    public int wallet; 
    private int hand; 

    public Player(int playerHand, int playerWallet) 
    { 
     wallet = playerWallet; 
     hand = playerHand; 
    } 

    public int getWallet() 
    { return wallet; } 
} 

Player alice = new Player(0, 250); 

public static void main(String[] args) 
{ 
    System.out.println("Welcome to Black Jack. Type begin to get started."); 

    String begin = "begin"; 
    String end = "end"; 
    Scanner keyboard = new Scanner(System.in); 

    while (!keyboard.equals(end)) 
     { 

     } 
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!"); 
} 

}

+0

嘗試做'靜態播放器alice =新播放器(0,250);' –

回答

2

你的變量alicemain(),這是靜態的正在使用,main()不「存在」的對象裏面,但你的變量alice必須是內一個。這樣做改變了代碼執行非靜態方法run()「內部」的對象(運行具有相同的代碼爲主體,它只是改變了一個非靜態方法):

public static void main(String[] args) { 
    new BlackJack().run(args); 
} 

public void run(String[] args) { 
    System.out.println("Welcome to Black Jack. Type begin to get started."); 

    String begin = "begin"; 
    String end = "end"; 
    Scanner keyboard = new Scanner(System.in); 

    while (!keyboard.equals(end)) 
    { 

    } 
    System.out.println("You walked away with $" + alice.getWallet() + ". Thanks for playing!"); 
} 
+0

哇。我從來沒有那麼漂亮的小動作。非常感謝! – rice2007

0

你愛麗絲變量聲明非靜態的,但在靜態主方法正在使用,一個沒有沒有。有些人可能會建議你讓愛麗絲成爲一個靜態變量,但我建議不要這樣做。相反,考慮讓你的主要方法非常短 - 只需要讓程序啓動並運行,並且有另一個類,也許是一個Game類,其中一個具有非靜態方法和字段,實際運行遊戲。主要方法將創建一個Game實例,然後在該Game實例上調用一個方法來啓動整個遊戲。另外,我不明白你希望玩家如何擴展BlackJack類,因爲玩家的概念並不是「大酒杯」的一個更專門化的概念,不管它是什麼。

+0

'擴展BlackJack'是一個錯誤。我嘗試了一些東西,Eclipse選擇將其作爲修補程序添加。我忘了刪除它。 – rice2007

+0

@ rice2007:你似乎也在BlackJack類中嵌套了Player類,這是不應該做的。 –

+0

@ Hovercraft:什麼時候適合在課堂中嵌套另一個課程?我已經看到它發生了,這實際上是我第一次嵌套類。 – rice2007

0

您的變量alice聲明沒有static修飾符。這意味着只有在實例化包含類的實例時才能使用此對象。

但是,您在public static void main()方法中使用alice.getWallet(),即static。由於靜態意味着可以在不創建封閉類的對象的情況下調用此方法,這意味着該方法將嘗試訪問無法訪問的非靜態對象alice

如果你讓alice是靜態的,它就可以工作。

更好的方法是讓程序從main()方法開始,然後轉到非靜態的Game類或類似的東西。沒有靜態修飾符的麻煩。

0

移動Player alice = new Player(0, 250);裏面的主要方法!

相關問題