好的,我无法弄清楚如何解决这个问题。当对象不是静态的时,所使用的方法或变量都不起作用,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()中使用那些方法
答案 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
字段设为静态。我想这是代码风格的问题。