2012-02-01 121 views
1

我正在阅读一本关于Java的书,到目前为止我已经了解了它的大部分内容。不过,我碰到了一些我似乎无法弄清楚的代码。这是从一个简单的21点游戏:学习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的特定实例的交易方法,并返回存储在本地变量卡中的卡实例。这有帮助吗?

+0

是的,这有很大的帮助。谢谢! – Vecta 2012-02-01 21:02:42

2

deal()返回Card例如,你可以在该行

return dealt; 

Card实例在分配给card看到的方法。

0

甲板已经在代码顶部分配了卡片对象。这种方法只是返回一个对甲板上顶牌的引用,然后递增甲板的顶部。这样可以防止在随后的调用中重新绘制卡。当顶部超出甲板限制时,它会重置顶部,以便您可以再次抽取卡片。

0

Card已在cards[top];它已经创建。下面的行导致命名Card类型的card引用它变量:

Card card = deck.deal(); 

在Java中,许多变量可以参考至相同的对象。仅仅因为你声明的引用,并不意味着你需要一个new对象:

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

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

线

Card card = deck.deal() 

是分配Card对象将变量“卡”。当你看到的“新”像实例:

CardDeck deck = new CardDeck(); 

它只是分配一个CardDeck对象变量“甲板”。

两者之间的主要区别是您正在创建一个不存在的新CardDeck对象,并将其分配给变量“deck”。对于deck.deal()你正在某处存在卡对象,并将其分配给“卡”

希望帮助

+0

更详细地看,看起来该函数(这是一个受过教育的猜测)deck.list()或构造函数可能会创建属于卡组的一部分的卡,所以这个函数将只读取已经存在的卡对象甲板的一部分 – jeffchong07 2012-02-01 20:50:26

1

CardDeck类维护卡的阵列,推测可能以随机顺序。

当你的代码撞击行:

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的地方,我猜,当你调用

new CardDeck() 

它是创建cards[]和填充内容。因为数组中的Card已经创建,所以不需要创建新的,而只需声明对其的引用即可。