私有对象如何在java中传递?

时间:2012-02-09 03:32:30

标签: java object reference parameter-passing

我想象的快速问题,但是我无法通过Google搜索获得明确的答案。

所以我有3个物体。卡,甲板,球员。 Deck和Player都有一系列卡片,两者都在main中声明。

我可以在main()中执行以下操作,以获取从卡片到播放器的卡片参考吗?

player.getcard(deck.draw())

deck.draw()返回一张卡片,getcard为:player.getcard(Card card)

是的,我来自c ++。

3 个答案:

答案 0 :(得分:1)

是的,假设Deck类中的“draw”方法是可见的(包私有,并且在与包含main方法的类相同的包中,或者是公共方法)。话虽如此,你的方法可以有更好的名字:

player.drawCard(Card aCard)

会比“getcard”更好,这让你觉得你从玩家那里得到了一张卡片。

答案 1 :(得分:1)

简短回答:是的,假设getcard实际上将其参数放入Player类中的某个私有字段。

长(呃)答案:在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

答案 2 :(得分:1)

严格来说,只要getcard()的返回类型为Card,那么是的,你就可以做到。它必须看起来像下面的内容才能正确包含在Player对象中。请注意,这假设Deck类中的getCard()方法声明为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();
    }
}