我想象的快速问题,但是我无法通过Google搜索获得明确的答案。
所以我有3个物体。卡,甲板,球员。 Deck和Player都有一系列卡片,两者都在main中声明。
我可以在main()中执行以下操作,以获取从卡片到播放器的卡片参考吗?
player.getcard(deck.draw())
deck.draw()返回一张卡片,getcard为:player.getcard(Card card)
是的,我来自c ++。
答案 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();
}
}