2012-02-01 12 views
1

私はJavaの本を読んでいますが、これまでほとんどのことを理解してきました。しかし、私は理解できないようないくつかのコードを実行しました。これは単純なブラックジャックのゲームからです:いくつかのコードについてJava-Confusedを学ぶ

public class CardDeckTest { 

    public static void main(String args[]) { 
     CardDeck deck = new CardDeck(); 
     System.out.println("Deck Listing:"); 
     deck.list(); 
     Card card = deck.deal(); 
     System.out.println("Dealt " + card); 
     card = deck.deal(); 
     System.out.println("Dealt " + card); 
     System.out.println("Top index: " + deck.getTopIndex()); 
     deck.reset(); 
     System.out.println("Reset deck... Top index: " + deck.getTopIndex()); 
     card = deck.deal(); 
     System.out.println("Dealt " + card); 
     System.out.println("The last card is " + deck.getCard(deck.getNumCards() - 1)); 
    } 
} 

私には混乱ラインがCard card = deck.deal();これまでのところ、私はそれで「新」で、二番目のような行を見てきましたさ。この行は何をしていますか?なぜそこに「新しい」ものがないのですか?

私はそれが

CardDeck

public Card deal() { 
     Card dealt = cards[top]; 
     top ++; 
     if (top >= cards.length) reset(); 
     return dealt; 
    } 
でこれに言及だと信じてありがとうございました!

答えて

2

CardDeckの特定のインスタンスでdealメソッドを呼び出し、ローカル変数カードに格納されているCardのインスタンスを返します。それは役に立ちますか?

+0

これは大いに役立ちます。ありがとう! – Vecta

2

あなたは

return dealt; 

このCardインスタンスがcardに割り当てられているラインで見ることができるようにCardインスタンスを返すdeal()方法。

0

デッキは、コードの先頭にカードオブジェクトを割り当てています。この方法では、デッキ上の一番上のカードへの参照を返してから、デッキの上をインクリメントします。これにより、後続のコールでカードが再描画されることを防ぎます。トップがデッキの限界の外にあるときは、トップをリセットして、カードを再びドローすることができます。

0

Cardはすでにcards[top]に存在します。それはすでに作成されました。は、次の行がそれを参照するタイプCardcardという名前の変数が発生します。Javaでは

Card card = deck.deal(); 

、多くの変数が同じオブジェクトをを参照することができます。

Deck gameDeck = new Deck(); // same deck 

Deck bobDeck = gameDeck; 
Deck aliceDeck = gameDeck; // two players 
0

ライン

Card card = deck.deal() 

は、変数「カード」にカードオブジェクトを割り当てることです:あなたが参照を宣言するという理由だけで、あなたがnewオブジェクトが必要というわけではありません。

CardDeck deck = new CardDeck(); 

これは、変数 'deck'にCardDeckオブジェクトを割り当てるだけです。

2つの主な違いは、存在しなかった新しいCardDeckオブジェクトを作成し、それを変数 'deck'に割り当てることです。 deck.dealについて()あなたはどこかに存在しているカードのオブジェクトを取得しているとCardDeckクラスが推定できるランダムな順序で、カードの配列を維持

+0

さらに詳しく見ると、関数(これは推測された推測です)deck.list()またはコンストラクタはおそらくデッキの一部であるカードを作成するため、この関数は既にすでに存在するCardオブジェクトをフェッチしますデッキの一部 – jeffchong07

1

役立ちます「カード」

希望に割り当てます。

Card card = deck.deal(); 

それは、アレイ内の次のカードを取得するためのメンバ関数を呼び出して、次のカードへのデッキポインタを進め:あなたのコード行を打つ

public Card deal() { 
     Card dealt = cards[top]; // get card from top (initially 0). 
     top ++;      // advance top so next time we get next card. 
     if (top >= cards.length) // deck empty, then reshuffle. 
      reset(); 
     return dealt;    // give card to caller. 
    } 
1

どこかに、私はあなたが

new CardDeck() 

を呼び出すとき、それはcards[]を作成し、内容を移入していることを推測しているnewが存在する必要があります。適切なコメントと

機能、。配列内のCardはすでに作成されているため、新しい配列を作成する必要はなく、参照を宣言するだけです。

関連する問題