麻烦实例化if块中的对象

时间:2013-08-11 05:07:50

标签: java scope

我编写了一个程序,用户可以在两个游戏中进行选择:Pig或Snake。我尝试在main方法中使用以下代码来创建适当类型的游戏:

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

我的编译器指向第二行并给出错误:not a statement

我设法通过编写一个抽象类“Game”然后制作它的PigGame和SnakeGame子类来解决问题:

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

但我不明白为什么第一个结构不起作用。 (我正准备教高中编程课程,但我是Java和OOP的新手,所以我可以使用你能提供的任何见解。)

4 个答案:

答案 0 :(得分:3)

问题是game的范围在if和else

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

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

答案 1 :(得分:2)

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

{
    PigGame game = new PigGame();
}

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

答案 2 :(得分:1)

这实际上是一个非常重要的问题

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

仅仅由于Java语法而无法编译,Java语法声明变量声明不是statemant。事实上,人们可以想象一个代码,他实际上不需要这个变量“游戏”,只是想在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

并且同样适用于此 - 您可以在if语句中声明一个Game对象,但game变量之外的对象是不可接受的。但这取决于你的代码,你可以有像

这样的东西
public class Game{
   public static Game lastCreatedGame;
   public Game(){
    lastCreatedGame=this;
   }
}

然后,运行

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

仍会通过Game.lastCreatedGame字段

让您访问游戏

答案 3 :(得分: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,编译器会看到这一点并抛出错误来帮助你。