尝试使用非静态方法引用非静态字段会导致错误

时间:2015-04-14 19:59:19

标签: java oop object constructor static

我创建了一个类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的成员变量是静态的,而main方法不是静态的。 generateObstacle()方法本身也没有静态字段。这是障碍构造者:

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

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

4 个答案:

答案 0 :(得分:3)

您无法像这样调用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成员。

答案 1 :(得分:2)

如果要从main方法调用它们,请将main方法保持为静态并将其他方法设置为静态。

  

您必须为JVM提供静态主方法

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

答案 2 :(得分:1)

Obstacle.generateObstacle(currentXCoord, currentYCoord);

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

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

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

答案 3 :(得分:1)

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

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

要进行一个真实世界的比喻,就像尝试驾驶汽车(在汽车类的特定实例上调用steer方法)而不实际拥有汽车。

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

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