关于java:无法对非静态方法进行静态引用?

Can not make static reference to non static method?

本问题已经有最佳答案,请猛点这里访问。

简而言之。我有两个班。

1
2
3
4
5
6
7
8
package rpg;

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

1
2
3
4
5
6
7
8
9
10
11
12
package rpg;
public class Start {
    int menuResult = 3;
    public int gameStart()
    {
        return menuResult;
    }
    public int getMenuResult()
    {
        return Start.menuResult;
    }
}

它不断抛出错误"cannot make static reference to non-static method gamestart()"。我肯定我错过了一些简单的东西,但找不到。谢谢!


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

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

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


首先,主要的方法应该是

1
2
3
public static void main(String args[]) {

}

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

要回答原始问题,需要有一个静态变量,该变量具有静态getter和setter。

1
2
3
4
5
6
7
8
9
10
public class Start {
    private static int menuResult = 3;
    public static int gameStart()
    {
        return menuResult;
    }
    public static int getMenuResult()
    {
        return Start.menuResult;
    }


1
public int gameStart() <--- Instance method not static method

在实例中调用它

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

最后你的课程应该如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
    }
}


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


EDCOX1×3是指一个EDOCX1×4的方法,因为开始是类而不是对象的实例。

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

何时使用静态或已声明的方法?

  • 声明:每当你需要将方法应用于你所在的对象时。示例:mycake.cook();
  • 静态:当您在方法内部所做的操作与特定对象无关时。示例:Cake.throwThemAll();

我的蛋糕是蛋糕的一个例子,用这种方式宣布:Cake mycake = new Cake();

cake是表示对象的类。

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


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

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


如果您需要方法是静态的,只需在函数定义中添加关键字static即可。这样可以消除错误。但是,如果希望保持类的启动方式不变,那么应该在主函数中创建start实例,然后调用该方法。希望有帮助!