java中如何传递私有对象?

java中如何传递私有对象?,java,object,reference,parameter-passing,Java,Object,Reference,Parameter Passing,我想这是一个很快的问题,但我很难从谷歌上得到一个明确的答案 我有三个物体。牌、牌、牌手。 牌组和玩家都有一组牌,并且都在主牌中声明 我可以在main()中执行以下操作以将一张牌的引用从牌组中获取到玩家中吗 player.getcard(deck.draw()) deck.draw()返回一张卡,getcard是:player.getcard(Card Card) 是的,我来自C++。< / P> < P>是的,假设甲板类中的“Dead”方法是可见的(包私有,在与主方法类相同的包中,或者公共方法

我想这是一个很快的问题,但我很难从谷歌上得到一个明确的答案

我有三个物体。牌、牌、牌手。 牌组和玩家都有一组牌,并且都在主牌中声明

我可以在main()中执行以下操作以将一张牌的引用从牌组中获取到玩家中吗

player.getcard(deck.draw())
deck.draw()返回一张卡,getcard是:
player.getcard(Card Card)

是的,我来自C++。< / P> < P>是的,假设甲板类中的“Dead”方法是可见的(包私有,在与主方法类相同的包中,或者公共方法)。话虽如此,您的方法可以有更好的名称:

player.drawCard(Card aCard)
比“getcard”更好,它让你看起来像是从玩家那里得到了一张牌。

是的,假设Deck类中的“draw”方法是可见的(包私有的,与具有主方法的类或公共方法的类在同一个包中)。话虽如此,您的方法可以有更好的名称:

player.drawCard(Card aCard)

比“getcard”更好,它让你看起来像是从玩家那里得到了一张卡。

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

长(er)回答:在Java中,只有两件东西可用——原语和引用。原语是数字类型、字符和布尔值。其他一切都是对象,所有对象都是引用。所以,当你写作的时候

Foo f = new Foo();
player.getcard(deck.draw())
一个类型为
Foo
的新对象被创建并放在(垃圾收集的)堆上,一个引用(您也可以认为是“指针”)被放在堆栈上。Java语言为您提供了一些真正的方法来检查该引用,但是(例如,您不能将其转换为指针或
long
),因此您可以将其视为不透明句柄

所以,当你写作的时候

Foo f = new Foo();
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

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

长(er)回答:在Java中,只有两件东西可用——原语和引用。原语是数字类型、字符和布尔值。其他一切都是对象,所有对象都是引用。所以,当你写作的时候

Foo f = new Foo();
player.getcard(deck.draw())
一个类型为
Foo
的新对象被创建并放在(垃圾收集的)堆上,一个引用(您也可以认为是“指针”)被放在堆栈上。Java语言为您提供了一些真正的方法来检查该引用,但是(例如,您不能将其转换为指针或
long
),因此您可以将其视为不透明句柄

所以,当你写作的时候

Foo f = new Foo();
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
严格来说,只要
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();
    }
}

严格地说,只要
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();
    }
}

是的,你能做到。你试过了吗?如果你看不到这些方法的定义,这会有帮助。是的,你当然可以这样做。“简言之:Java有指针,严格按值传递。没有古怪的规则。它简单、干净、清晰。”。阅读斯科特在《无法测试》杂志上的精彩解释。我已经有一周左右的时间无法使用电脑了,我一直在使用没有编译器的学校电脑。我决定在纸上定义我的一些类。在做了相当多的工作之后,我意识到我不确定是否能通过这样的物体。谢谢。Java传递总是引用的副本。是的,你可以这样做。你试过了吗?如果你看不到这些方法的定义,这会有帮助。是的,你当然可以这样做。“简言之:Java有指针,严格按值传递。没有古怪的规则。它简单、干净、清晰。”。阅读斯科特在《无法测试》杂志上的精彩解释。我已经有一周左右的时间无法使用电脑了,我一直在使用没有编译器的学校电脑。我决定在纸上定义我的一些类。在做了相当多的工作之后,我意识到我不确定是否能通过这样的物体。谢谢。Java传递总是
引用的副本
。我编了一个例子,但是是的,我想“get”应该保留给