2014-02-27 106 views
0

好使用非靜態對象,我不知道如何來解決這個。當對象不是靜態的,沒有使用的方法或變量,Java只是不會編譯它們。但是,當我將該對象設置爲靜態時,JVM返回錯誤,並拋出一個彈出警報並通過錯誤消息向控制檯發送垃圾郵件。下面是斷碼的嚴重削減版本:在靜態方法

public class Main { 

public Hero hero = new Hero(); 

private static boolean newGuy; 

public static void main(String[] args){ 

    areYouNew(); 

    if(newGuy){ 
     createGame(); 
    }else{ 
     loadGame(); 
    } 
    saveGame(); 

} 

private static void createGame() { 

} 

private static void loadGame() { 

    System.out.println("Ah yes, sorry. What is your name again?"); 

    //blah blah code here 

    hero.setName(); 


    if(hero.getName().length() > 0){ 

    }else{ 
     System.out.println("Sorry? You need to type your name"); 
     loadGame(); 
    } 
} 

private static void areYouNew() { 

    System.out.println("Are you new?"); 

    String newTest = sc.nextLine(); 
    if(newTest.toLowerCase().contains("yes")){ 

     newGuy = true; 

    }else if(newTest.toLowerCase().contains("no")){ 

     newGuy = false; 

    }else{ 
     System.out.println("Oops, it's a yes or no question."); 
     areYouNew(); 
    } 
    } 
} 

hero.whatevers工作,除非我設置的英雄靜態無。有任何解決這個問題的方法嗎? 我已經嘗試過製造含有的引用方法英雄非靜態的,但我就不能使用主)這些方法(

+7

好像你不知道你在做什麼。我知道你想嘗試一下,但我建議回到教程,筆記,書籍等,並學習靜態變量和方法的工作原理。 –

+0

這是「嚴重削減」版本。非常感謝你的善良:-) – Coffee

+1

爲什麼你不希望英雄是靜態的?非靜態(實例)變量不能在靜態(類)變量中看到。 – markg

回答

0

程序的static部分是不使用你的Main類的一個實例上運行的代碼。當調用main方法時,還沒有Main類的實例。

通常,對象實例具有某些字段。在你的情況下,只有public Hero hero。靜態字段,如private boolean newGuy不是實例的一部分,但更像是全局變量。由於目前還沒有對象實例Main,因此無法訪問hero字段。

它是使用面向對象編程,Java中的良好做法。您應該儘可能快地創建遊戲的新實例(使用Main game = new Main())。然後調用此實例的方法(game.createGame()game.loadGame())。然後,您不需要將這些方法設爲靜態,並且可以訪問非靜態字段。此外,這將讓你在同一兩個時間Main情況下,每一個都有自己hero領域,如果將在項目中的某個時刻需要這樣的事。

你可以,當然,也使hero現場靜。這是一個代碼風格的問題,我想。