2012-02-01 3 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 и возвращает экземпляр Карты, который хранится в локальной переменной. Это помогает?

+0

Да, это очень помогает. Благодаря! – Vecta

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() 

ли назначение объекта карты на карту «» переменной. Когда вы видите примеры «новые», как:

CardDeck deck = new CardDeck(); 

Это просто назначая объект CardDeck к переменной 'палубы.

Главное отличие состоит в том, что вы создаете новый объект CardDeck, которого не было, и назначая его переменной «колода». Для deck.deal() вы получаете объект карты, который существует где-то и назначение его «карты»

Надежда, что помогает

+0

, смотря еще более подробно, кажется, что функция (это образованное предположение) deck.list() или конструктор, вероятно, создает карты, которые являются частью колоды, поэтому эта функция будет просто извлекать объекты Карты, которые уже часть колоды – jeffchong07

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 в массиве уже создан, вам не нужно создавать новый, вместо этого вы просто объявляете ссылку на него.

Смежные вопросы