不能静态引用非静态方法?

时间:2012-10-11 14:14:18

标签: java static-methods instance-methods

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

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()进行静态引用。 我确定我错过了一些简单但却找不到的东西。 谢谢!

7 个答案:

答案 0 :(得分:7)

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

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

只能使用类名作为perfix来访问静态方法。

答案 1 :(得分:2)

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;
    }
}

答案 2 :(得分: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;
    }

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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

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

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

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

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

Cake是表示对象的类。

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

答案 6 :(得分:0)

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