Java:方法中的值传递引用

时间:2014-07-17 17:12:18

标签: java pass-by-reference pass-by-value

我在Stackoverflow中阅读了一些文章和类似的问题;但是,我没有完全回答我的问题。 这是代码:

public class CoinFlipping {

    Random random = new Random();

    Boolean head = null;

    public void flip(Boolean b){
        b = random.nextBoolean();
    //      head = b; 
    }

    public static void main(String [] args){
        CoinFlipping cf = new CoinFlipping();
        cf.flip(cf.head);
        System.out.println("Head: "+cf.head);
    }

    }

我指的是这个问题:Is Java "pass-by-reference" or "pass-by-value"? 我可以理解为什么这段代码表现得像它一样。当我们调用new dog()时,我们基本上创建了一个新的Dog对象。我知道了。但是,我提供的示例似乎有点令人困惑。在这种情况下我不是在创建一个对象(不是吗?)。我正在改变一个价值观。那么为什么在这种情况下,当我打印结果时,我得到null而不是truefalse

2 个答案:

答案 0 :(得分:2)

参数b按值传递,即使b本身就是引用。因此,当您致电flip时,flip方法会将b视为一个本地变量,即您传入其中的副本。更改此副本不会更改cf.head

如果b是对可变对象的引用,则可以更改b引用的对象,并且flip返回后,程序的其余部分将看到该更改。但是对b本身的更改是对副本的更改,并且程序的其余部分将不会看到任何此类更改。 (Boolean不可变。)

答案 1 :(得分:1)

回答你的问题:

  

那么为什么在这种情况下,当我打印结果时,我得到 null 而不是 true false

我已经创建了代码的逐步walktrough ,以向您显示特定变量的指针(引用),并回答最终打印出null的原因:

1。步骤:使用默认字段值

创建新的CoinfFlipping对象
CoinFlipping cf = new CoinFlipping();

CoinFlipping班级内:

Random random = new Random();
Boolean head = null;

cf ----指向----> CoinFlipping对象
cf.random ----指向----> Random对象
cf.head ----指向----> null


2。步骤:使用flip对象<{1}}作为参数调用cf.head方法

cf

当唤起此方法时,会在cf.flip(cf.head); 方法的范围内创建变量b。 来自flip的指针(引用)被复制到变量cf.head中。 因此,bcf.head指向同一事物。

b

public void flip(Boolean b){ ----指向----&gt; cf对象
CoinFlipping ----指向----&gt; cf.random对象
Random ----指向----&gt; cf.head
null ----指向----&gt; b


3。步骤:正在重新分配null方法flip

b

b = random.nextBoolean(); ----指向----&gt; cf对象
CoinFlipping ----指向----&gt; cf.random对象
Random ----指向----&gt; cf.head
null ----指向----&gt;一个b值 - booleantrue


4。步骤:返回主要方法以打印出false

cf.head

System.out.println("Head: "+cf.head); ----指向----&gt; cf对象
CoinFlipping ----指向----&gt; cf.random对象
Random ----指向----&gt; cf.head
null ----指向----&gt;一个b值 - booleantrue

如您所见,false仍然指向cf.head,因此正在打印null

解决方案:
要更改此设置,您可以让该方法返回一个布尔值,并将其分配给null,以使cf.head指向一个新的布尔值。