4

I've written a program where users can choose between two games to play: Pig or Snake. I tried to use the following code within my main method to create the appropriate kind of game:

if (gameType == 'p')
    PigGame game = new PigGame();
else
    SnakeGame game = new SnakeGame();

My compiler points to the second line and gives the error: not a statement

I have managed to fix the problem by writing an abstract class "Game" and then making PigGame and SnakeGame subclasses of it:

Game game;
if (gameType == 'p')
    game = new PigGame();
else
    game = new SnakeGame();

But I don't understand why the first construct didn't work. (I'm preparing to teach a high school programming course, but I'm new to Java and OOP so I can use any insights you can provide.)

4

4 回答 4

3

问题是范围game在 if 和 else 之内

if (gameType == 'p')
    PigGame game = new PigGame();
else
    SnakeGame game = new SnakeGame();

所以你不能在其他任何地方使用它,这就是你的第二段代码有效的原因。

于 2013-08-11T05:11:27.473 回答
2

“猪游戏游戏 = 新猪游戏();” 是声明,不是声明。if 需要声明,而不是声明。您可以创建一个包含它的语句块:

{
    PigGame game = new PigGame();
}

这在语法上是正确的。它仍然毫无意义,因为游戏将是语句块的本地。您需要以更广泛的范围声明游戏。

于 2013-08-11T05:18:32.873 回答
1

这就是我要求所有新手不要跳过花括号的原因,因为它在范围上提供了很多清晰度。

当你做

if (gameType == 'p')
    PigGame game = new PigGame();
else
    SnakeGame game = new SnakeGame();

进入

if (gameType == 'p') {
    PigGame game = new PigGame();
}
else {
    SnakeGame game = new SnakeGame();
}

范围变得更加清晰,两者

PigGame game = new PigGame();SnakeGame game = new SnakeGame();

仅存在于它们各自的块内(即)各自的花括号内,

所以这意味着你不能使用game它们各自块之外的任何地方,编译器会看到这一点并抛出一个错误来帮助你。

于 2013-08-11T05:38:56.850 回答
1

这实际上是一个相当重要的问题

if (gameType == 'p')
    PigGame game = new PigGame();
else
    SnakeGame game = new SnakeGame();

仅由于 Java 语法不能编译,该语法指出变量声明不是声明。事实上,可以想象一段代码,他实际上不需要这个变量“游戏”,只是想在 if 语句中运行构造函数。

if (gameType == 'p')
    new PigGame();
else
    new SnakeGame();

这将编译

if (gameType == 'p'){
    PigGame game = new PigGame();
}else{
    SnakeGame game = new SnakeGame();
}

这也将编译

自然在这两种情况下 - 我们无法访问括号外的变量,但仍然拒绝用户对其进行编码

if (gameType == 'p')
    PigGame game = new PigGame();
else
    SnakeGame game = new SnakeGame();

有点武断,AFAIK 旨在“确保”用户知道他在做什么。一般来说 - 变量的分数是由它的括号括起来的声明定义的,所以如果你写

{
Integer x=3;
System.out.println(x); //this works
}
System.out.println(x); //but this does not

同样的事情也适用于这里 - 您可以Game在 if 语句中声明一个对象,但变量在它之外是无法访问的game。但这取决于你的代码,你可以有类似的东西

public class Game{
   public static Game lastCreatedGame;
   public Game(){
    lastCreatedGame=this;
   }
}

然后,运行

if (gameType == 'p')
    new PigGame();
else
    new SnakeGame();

仍然可以让您按Game.lastCreatedGame字段访问游戏

于 2013-08-11T05:21:50.630 回答