我是Java新手,但我对PHP非常有经验。当我编写Java程序时,我注意到变量不是我所期望的。
所有方法参数都是通过Java中的值传递的。但是,因为所有 对象实际上是引用,你传递的是值 传递对象时的引用。这意味着如果你操纵一个 传递给方法的对象,操作会坚持下去。
从这里开始:What are the differences between PHP and Java?
这是什么意思?这是否意味着Java中的foo=blah
与PHP中的$foo=&$blah
类似?
我怎样才能传递Java中的值?
答案 0 :(得分:5)
这意味着什么,给定
class Foo {
private int bar;
public void setBar(int value) {
bar = value;
}
public int getBar() {
return bar;
}
}
并且
public void doSomethingToFoo(Foo foo) {
foo.setBar(42);
}
在呼叫网站上可以看到对bar
的更改。 这个是坚持的操纵。传入了对原始对象的引用。为该对象调用了setter,因此调用点的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!
这有意义吗?
答案 1 :(得分:1)
Anthony Pegram完美地解释道。 我想补充一点。
您永远不能按值传递对象。
在java中,每个Object都在堆中创建。 你有参考或我们可以说梯子去对象。 在函数调用的情况下,您将引用(按值)作为参数传递。 所以你有另一个引用或梯形图到你的函数中的同一个对象。 您可以通过此引用转到对象并进行更改。 现在如果你像安东尼那样更改你的功能中的引用
foo = new Foo();
会发生什么,您刚刚在堆中创建了一个新对象,并且您拥有该对象的引用。在此步骤中,您将通过新创建的对象的引用替换现有引用(引用旧对象)。所以在你的函数中,你失去了转向旧Object的方法。如果你做了任何改变,你正在改变新创建的对象,而不是调用者函数的对象。
由于