Как частные объекты передаются в Java? - PullRequest
0 голосов
/ 09 февраля 2012

Быстрый вопрос, я думаю, но у меня проблемы с получением четкого ответа от поиска в Google.

Итак, у меня есть 3 объекта.Карта, колода, игрок.И колода, и игрок имеют множество карт, и оба они объявлены в main.

Могу ли я сделать следующее в main (), чтобы получить ссылку на карту из колоды в игрок?1007 * deck.draw () возвращает карту, а getcard: player.getcard(Card card)

И да, я из c ++.

Ответы [ 3 ]

1 голос
/ 09 февраля 2012

Краткий ответ: да, при условии, что getcard фактически помещает свой параметр в какое-то приватное поле в классе Player.

Длинный (er) ответ: В Java вам доступны только две вещи - примитивы и ссылки. Примитивы - это числовые типы, символы и логические значения. Все остальное является объектом, а все объекты являются ссылками. Итак, когда вы пишете

Foo f = new Foo();

новый объект типа Foo создается в куче (для сбора мусора), а в стек помещается ссылка, которую вы также можете считать «указателем». Тем не менее, язык Java дает вам несколько реальных способов изучения этой ссылки (например, вы не можете привести ее к указателю или long), так что вы можете просто думать о ней как о непрозрачном дескрипторе.

Итак, когда вы пишете

player.getcard(deck.draw())

звонок

deck.draw()

возвращает ссылку на объект типа Card, и этот объект передается методу player.getcard. Затем, если класс Player выглядит примерно так:

public class Player {
    private List<Card> cards;
    // ...
    public void getcard(Card card) {
        cards.add(card);
    }
}

затем последующие вызовы методов в Player, которые обращаются к приватному полю cards, увидят, что возвращаемое значение deck.draw() было добавлено к cards.

1 голос
/ 09 февраля 2012

Строго говоря, если тип возвращаемого значения getcard() равен Card, то да, вы можете это сделать.Это должно выглядеть примерно так, чтобы оно правильно содержалось в объекте Player.Обратите внимание, что это предполагает, что метод getCard() из класса Deck объявлен как static, что означает, что вам не нужно создавать его экземпляр, чтобы получить карты от него.

public class Player {

    private Card[] hand;

    public Player(int handSize) {
        hand = new Card[handSize];
    }


    ...

    public void getCard(int pos) {
        // Some logic to handle behavior with 0 cards, handSize cards, etc...
        hand[pos] = Deck.getCard();
    }
}
1 голос
/ 09 февраля 2012

Да, при условии, что метод "draw" в классе Deck видим (пакет private и в том же пакете, что и класс с методом main, ИЛИ открытый метод).Сказав это, ваши методы могут иметь лучшие имена:

player.drawCard(Card aCard)

будет лучше, чем "getcard", из-за чего создается впечатление, что вы получаете карту от игрока.

...