无法引用已声明的对象字段

时间:2015-04-21 15:52:07

标签: java object field main

我有一个Obstacle类,其中包含一个Obstacle对象的构造函数:

public class Obstacle {

    public String obstacleType;
    public int obstacleSize, obstacleXCoord, obstacleYCoord;

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

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

    }

}

在另一个类中,我导入Obstacle类并定义方法generateObstacle,创建一个名为Obstacle的新newObstacle。我还在这里引用了几个不引用任何错误的newObstacle字段:

public static void generateObstacle(){

    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

    //randomly generates a 1 or 0
    switch(spawnObstacle.nextInt(2)){

        //if 0
        case 0:
            //newObstacle type is tree
            newObstacle.obstacleType = "TREE";
            break;

        //if 1
        case 1:
            //newObstacle type is rock
            newObstacle.obstacleType = "ROCK";
            break;

    }

    //randomly generates 0, 1, or 2
    switch(spawnObstacle.nextInt(3)){

        //if 0
        case 0:
            //newObstacle size is 1
            newObstacle.obstacleSize = 1;
            break;

        //if 1
        case 1:
            //newObstacleSize is 2
            newObstacle.obstacleSize = 2;
            break;

        //if 2
        case 2:
            //newObstacle size is 3
            newObstacle.obstacleSize = 3;
            break;

    }

}

等等。但是,在我的main()方法中,我无法引用newObstaclenewObstacle本身的任何字段:

public static void main(String[] args){

    spawnPlayer();

    while(runGame){

        switch((playerInput.nextLine()).toUpperCase()){

            case "W": 
                for(int x = 0; x < allExistingObstacles.size(); x++){

                    if(newObstacle.obstacleXCoord == currentXCoord){                        

                    }                       
                }

参考

newObstacle.obstacleXCoord

抛出错误并说

  

newObstacle无法解析为变量

为什么我可以在代码中的其他位置引用障碍字段,但不能在此处引用?

5 个答案:

答案 0 :(得分:2)

newObstacle的范围仅限于函数generateObstacle(),因此定义

 static Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

在函数外部,以便引用(newObstacle)可以在全局范围内,并且可以在该类的任何函数中访问。

同样newObstacle应为static,以便在静态方法中可以访问,这要归功于@chrylis指出这一点。

答案 1 :(得分:1)

它是因为实例仅存在于方法范围内 generateObstacle

public static void generateObstacle(){

    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

因此,在此方法之外的变量:newObstacle不可见。

我猜你需要返回这个实例

public static Obstacle generateObstacle(){
  // ...
  return newObstacle;
}

答案 2 :(得分:0)

您已在Obstacle内为generateObstacle()课程创建了对象。所以对象的范围在方法中。

您无法使用它来引用声明其声明的块之外的变量

答案 3 :(得分:0)

generateObstacle中,它有效,因为您在方法开头有Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

main缺乏它。

答案 4 :(得分:0)

问题是newObstacle上下文中的main尚未初始化。

您需要将其分配给generateObstacle

的结果
public static void main(String[] args){
    Obstacle newObstacle = generateObstacle();
    // ...
}

您的generateObstacle方法应该返回障碍:

public static void generateObstacle() {
    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);
    // ...
    return newObstacle;
}