【问题标题】:Attempting to reference non-static field with non-static method results in error尝试使用非静态方法引用非静态字段会导致错误
【发布时间】:2015-06-20 14:15:32
【问题描述】:

我创建了一个类 Obstacle,它带有一个 Obstacle 构造函数和一个函数。

package environment;

import static java.lang.System.out;
import environment.WorldEnvironment;

public class Obstacle {

    private String obstacleType, setObstacleType;
    private int obstacleSize, obstacleXCoord, obstacleYCoord,   setObstacleSize, setObstacleXCoord, setObstacleYCoord;

public Obstacle(String getType, int getSize, int getXCoord, int getYCoord){

    obstacleType = getType;
    obstacleSize = getSize;
    obstacleXCoord = getXCoord;
    obstacleYCoord = getYCoord;

}

public void generateObstacle(int getPlayerCurrentXCoord, int   getPlayerCurrentYCoord){//code in generateObstacle}

在我的 main 方法中,我从不同的类调用 generateObstacle()(请注意,这个类和 Obstacle 类都在同一个包中)。

import environment.Obstacle;

public void main(String[] args){

    spawnPlayer();

    while(runGame){

        //one example of calling some Obstacle member variables and calling generateObstacle()
        switch((playerInput.nextLine()).toUpperCase()){

            case "W": 
                if(currentXCoord + 1 == Obstacle.obstacleXCoord && Obstacle.obstacleYCoord == currentYCoord){

                    out.println("There is a " + (Obstacle.obstacleType).toLowerCase() + " where you are trying to go.");
                    printPlayerCoords();

                }
                else{

                    movePlayerForward();
                    printPlayerCoords();
                    if(spawnObstacle.nextInt(8) == 3){

                        Obstacle.generateObstacle(currentXCoord, currentYCoord);

                    }

                }
                break;

全部

Obstacle.

变量引用抛出错误,说“不能对非静态字段进行静态引用。与

Obstacle.generateObstacle(currentXCoord, currentYCoord);

我不知道为什么会出现这个错误,因为 Obstacle 的成员变量都不是静态的,主方法也不是静态的。 generateObstacle() 方法本身也没有静态字段。这是 Obstacle 构造函数:

Obstacle newObstacle = new Obstacle(setObstacleType, setObstacleSize, setObstacleXCoord, setObstacleYCoord);

有人可以向我解释为什么我会收到此错误吗?是的,我环顾四周,但没有找到任何好的解释性解决方案。提前致谢。

【问题讨论】:

  • reference Obstacle 是静态的。它是一个类名。你需要一个实例。

标签: java oop object constructor static


【解决方案1】:

你不能像这样调用generateObstacle()方法-

 Obstacle.generateObstacle(currentXCoord, currentYCoord);

因为generateObstacle() 是另一个类中的非静态方法。

解决方案:
(1)generateObstacle()方法设为静态并使用类名调用-

Obstacle.generateObstacle(currentXCoord, currentYCoord);

(2)或者创建一个Obstacle的实例,比如anObstacle用它来调用方法-

 Obstacle anObstacle = new Obstacle(...);
 anObstacle.generateObstacle(currentXCoord, currentYCoord);  

注意:类的非静态类型成员(即方法或变量)存在于类的对象中。这意味着non-static 成员仅在创建对象时可用。这不适用于类的static 成员。您可以访问类的static 成员,而无需创建类的实例/对象。

【讨论】:

  • 好的,这似乎解决了问题。感谢您的反馈。
【解决方案2】:

如果您想从主方法调用它们,请保持您的主方法为静态,并将您的其他方法设为静态。

你必须让 JVM 的 main 方法是静态的

JVM 需要调用 main 方法作为应用程序的入口点,而不必创建包含类的实例。

【讨论】:

    【解决方案3】:

    您的generateObstacle 方法是一个非静态方法,这意味着障碍物的每个实例都有自己的,能够访问同一个实例的状态(字段)。

    在静态上下文中(这里是main 方法),没有实例可以调用该方法。所以试图在不实际构造实例的情况下调用非静态方法是没有意义的。

    以现实世界为例,这就像在没有汽车的情况下尝试驾驶汽车(在 Car 类的特定实例上调用 steer 方法)。

    您的问题有两种可能的解决方案: - 构造一个 Obstacle 类的实例(Obstacle o = new Obstacle()),然后在其上调用generateObstacle 方法; - 或者将generateObstacle 设为静态,如果它不依赖于任何特定实例的状态。

    看到你的 Obstacle 类有状态(字段),第一个是唯一的解决方案。

    【讨论】:

      【解决方案4】:
      Obstacle.generateObstacle(currentXCoord, currentYCoord);
      

      这是对非静态方法的静态调用。当您引用类名时,它是一个静态引用。您的 generateObstacle 方法不是静态的,因此会出现错误。

      尝试创建一个类的实例,然后引用它。

      Obstacle obstacle = new Obstacle(...arguments...);
      obstacle.generateObstacle(currentXCoord, currentYCoord);
      

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多