4

私は、ユーザーが 2 つのゲーム (Pig または Snake) から選択できるプログラムを作成しました。メイン メソッド内で次のコードを使用して、適切な種類のゲームを作成しようとしました。

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

私のコンパイラは2行目を指し、エラーを出します:not a statement

抽象クラス「ゲーム」を作成し、そのサブクラスである PigGame と SnakeGame を作成することで、問題を解決できました。

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

しかし、最初の構成が機能しなかった理由がわかりません。(私は高校のプログラミング コースを教える準備をしていますが、Java と OOP は初めてなので、提供できる洞察を使用できます。)

4

4 に答える 4

3

問題は、 のスコープがgameif と else の内部にあることです

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

したがって、他の場所では使用できません。そのため、2 番目のコードが機能します。

于 2013-08-11T05:11:27.473 に答える
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 に答える