我在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
而不是true
或false
?
答案 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
中。
因此,b
和cf.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
值 - boolean
或true
4。步骤:返回主要方法以打印出false
cf.head
System.out.println("Head: "+cf.head);
----指向----&gt; cf
对象
CoinFlipping
----指向----&gt; cf.random
对象
Random
----指向----&gt; cf.head
null
----指向----&gt;一个b
值 - boolean
或true
如您所见,false
仍然指向cf.head
,因此正在打印null
。
解决方案:
要更改此设置,您可以让该方法返回一个布尔值,并将其分配给null
,以使cf.head
指向一个新的布尔值。