在Java中如何按值传递变量?

在Java中如何按值传递变量?,java,php,variables,object,Java,Php,Variables,Object,我也是Java新手,但我对PHP很有经验。当我编写Java程序时,我注意到变量不是我所期望的 在Java中,所有方法参数都是通过值传递的。但是既然 对象实际上是引用,您正在传递 传递对象时的引用。这意味着如果你操纵一个 对象传递到方法中时,操作将保持不变 从这里开始: 这是什么意思?这是否意味着Java中的foo=blah就像PHP中的$foo=&$blah? 如何在Java中只传递值?它的意思是,给定 class Foo { private int bar; pub

我也是Java新手,但我对PHP很有经验。当我编写Java程序时,我注意到变量不是我所期望的

在Java中,所有方法参数都是通过值传递的。但是既然 对象实际上是引用,您正在传递 传递对象时的引用。这意味着如果你操纵一个 对象传递到方法中时,操作将保持不变

从这里开始:

这是什么意思?这是否意味着Java中的
foo=blah
就像PHP中的
$foo=&$blah

如何在Java中只传递值?

它的意思是,给定

 class Foo { 
     private int bar; 

     public void setBar(int value) {
         bar = value;
     }

     public int getBar() {
         return bar;
     }
 }

条的更改将在调用站点可见。这就是坚持的操纵。已传入对原始对象的引用。为该对象调用了setter,因此callsite的getter将返回新的bar值

Foo foo = new Foo();
doSomethingToFoo(foo);
int bar = foo.getBar(); // gets 42
然而,鉴于

public void doSomethingElseWithFoo(Foo foo) {
     foo = new Foo(); // assigning new instance to variable
     foo.setBar(117);
}
由于方法中的
foo
变量已被重新分配,因此此更改在调用站点上不可见。引用仅通过值传递,变量实际上没有以任何方式链接或连接,它们只是有一个共同的值(引用)。我们现在已经覆盖了一个变量在方法中的引用,callsite中的变量具有与以前相同的引用

Foo foo = new Foo();
foo.setBar(7);
doSomethingElseWithFoo(foo);
int bar = foo.getBar(); // still is 7!

这有意义吗?

安东尼·佩格拉姆解释得很好。 我想补充一点

永远不能按值传递对象

在java中,每个对象都是在堆中创建的。 你有一个参考或一个我们可以说的梯子去的对象。 在函数调用的情况下,将引用(按值)作为参数传递。 因此,在函数中有另一个指向同一对象的引用或阶梯。 您可以通过此引用转到对象并对其进行更改。 现在如果你像Anthony那样改变函数中的引用

 foo = new Foo();
发生的情况是,您刚刚在堆中创建了一个新对象,并且您拥有该对象的引用。在此步骤中,您将用新创建对象的引用替换现有引用(对旧对象的引用)。因此,在函数中,您失去了前往旧对象的途径。现在,如果您进行任何更改,您将更改新创建的对象,而不是调用方函数的对象


谢谢

这里有一个例子说明它是如何工作的:Java中没有“按引用传递”。Java总是按值传递。我会读书。虽然Java只实现了
按值调用
,但传递对象值的语义可以理解为
按对象调用共享
。(实际上:当你传递一个对象时,你传递的是那个对象,而不是一个副本。)Java完全没有PHP所具有的变量引用的概念,这与
按引用调用类似,但不同。回答不错。正如您所知,关于引用类型的Java参数是对象的按引用传递,还是引用的按值传递,争论一直很激烈。我发现避免整个争论是最容易的,除非你在回答问题时不站在一边。
 foo = new Foo();