0

所以,简而言之。我有两节课。

package rpg;

public class Engine {
    public void main(String args[]) {
        Start.gameStart();
        System.out.println(menuResult);
    }
}

package rpg;
public class Start {
    int menuResult = 3;
    public int gameStart() 
    {
        return menuResult;
    }
    public int getMenuResult()
    {
        return Start.menuResult;
    }
}

它不断抛出错误“无法对非静态方法 gameStart() 进行静态引用”。我确定我错过了一些简单的东西,但找不到。谢谢!

4

7 回答 7

8

您需要创建Start类的实例并在该实例上调用gameStart()方法,因为gameStart()实例方法不是静态方法。

 public void main(String args[]) {
       new Start().gameStart();
       ..................
  }

使用类名作为前缀只能访问静态方法。

于 2012-10-11T14:15:08.370 回答
3
public int gameStart() <--- Instance method not static method

在实例上调用它

 Start start = new Start();
 start.gameStart();

所以最后你的课程应该如下所示

public static void main(String args[]) {
    Start start = new Start();
    start.gameStart();
    System.out.println(start.getMenuResult());
}

public class Start {
   private int menuResult = 3;
    public int gameStart() {
        return this.menuResult;//Don't know why there are two methods
    }
    public int getMenuResult() {
        return this.menuResult;
    }
}
于 2012-10-11T14:15:24.967 回答
2

首先主要的方法应该是

public static void main(String args[]) {

}

我假设您可以拥有多个游戏,因此您应该能够启动多个实例,因此您应该创建一个可以创建的非静态类,然后对其执行操作。

要回答您最初的问题,您需要有一个具有静态 getter 和 setter 的静态变量。

public class Start {
    private static int menuResult = 3;
    public static int gameStart() 
    {
        return menuResult;
    }
    public static int getMenuResult()
    {
        return Start.menuResult;
    }
于 2012-10-11T14:18:22.717 回答
0

如果您需要方法是静态的,只需在函数定义中添加关键字 static 即可。那将摆脱错误。但是如果你想保持 Start 类的原样,那么你应该在 main 函数中创建一个 Start 的实例,然后调用该方法。希望有帮助!

于 2012-10-11T14:17:37.590 回答
0

Start.gameStart()指一种方法,public static int gameStart()因为 Start 是类而不是对象的实例。

如果在对象上声明方法,则需要将其应用于对象的实例而不是其类。

何时使用静态或实例化方法?

  • 实例化:每当您需要将该方法应用于您所在的对象时。示例:mycake.cook();
  • static :当您在方法中执行的操作与特定对象无关时。例子 :Cake.throwThemAll();

mycake 是 Cake 的一个实例,以这种方式声明:Cake mycake = new Cake();

Cake 是代表对象的类。

我想,如果您仍然对对象、类和实例有疑问,您应该阅读一些面向对象的编程课程。

于 2012-10-11T14:25:12.470 回答
0

您正在尝试对其类名调用方法。你应该创建一个新对象并调用它的方法

public void main(String args[]) {
        new Start().gameStart();
        System.out.println(menuResult);
    }
于 2012-10-11T14:23:01.230 回答
0

虽然其他答案是正确的,但这仍然是为什么你不能直接从类名访问实例方法的问题,在 Java 中,所有静态(方法、字段)都与类名绑定,当类加载到内存(堆栈)时都是静态的成员正在加载到堆栈中,这次实例方法对类不可见。实例方法将加载到内存中的堆部分,并且只能通过对象引用访问。

于 2012-10-11T14:33:05.847 回答