我编写了一个程序,用户可以在两个游戏中进行选择: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的新手,所以我可以使用你能提供的任何见解。)
答案 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
,编译器会看到这一点并抛出错误来帮助你。