Не удалось сослаться на уже объявленное поле объекта
У меня есть 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(
), я не могу сделать ссылку на какие-либо поля newObstacle
или же newObstacle
сам:
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 ответов
Объем newObstacle
ограничен функцией generateObstacle()
так определите
static Obstacle newObstacle = new Obstacle(null, 0, 0, 0);
вне функции, так что ссылка (newObstacle
) может находиться в глобальной области видимости и быть доступным для любой функции этого класса.
Также newObstacle
должно быть static
чтобы быть доступным внутри статических методов благодаря @chrylis
за указание на это.
Это потому, что экземпляр существует только внутри области действия метода generateObstacle
public static void generateObstacle(){
Obstacle newObstacle = new Obstacle(null, 0, 0, 0);
Поэтому вне этого метода переменная: newObstacle не видна.
Я думаю, вам нужно вернуть этот экземпляр
public static Obstacle generateObstacle(){
// ...
return newObstacle;
}
Вы создали объект для Obstacle
класс внутри generateObstacle()
, Таким образом, область действия объекта находится внутри метода.
Вы не можете использовать его для ссылки на переменную вне блока, где она была объявлена
В generateObstacle
это работает, потому что у вас есть Obstacle newObstacle = new Obstacle(null, 0, 0, 0);
в начале метода.
Вы main
недостаток этого.
Проблема в том, что 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;
}