在静态方法中使用非静态对象

时间:2014-02-27 00:45:06

标签: java object methods static

好的,我无法弄清楚如何解决这个问题。当对象不是静态的时,所使用的方法或变量都不起作用,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都不起作用。有任何解决这个问题的方法吗? 我已经尝试制作包含英雄非静态引用的方法但是我不能在main()中使用那些方法

1 个答案:

答案 0 :(得分: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字段设为静态。我想这是代码风格的问题。