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

Leo*_*ang 2 php java variables object

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

所有方法参数都通过Java中的值传递.但是,由于所有对象实际上都是引用,因此在传递对象时传递引用的值.这意味着如果您操纵传递给方法的对象,操作将会粘住.

从这里:PHP和Java有什么区别?

这是什么意思?这是否意味着foo=blah在Java中就像$foo=&$blah在PHP中一样?我怎样才能传递Java中的值?

Ant*_*ram 5

这意味着什么,给定

 class Foo { 
     private int bar; 

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

     public int getBar() {
         return bar;
     }
 }
Run Code Online (Sandbox Code Playgroud)

public void doSomethingToFoo(Foo foo) {
     foo.setBar(42);
}
Run Code Online (Sandbox Code Playgroud)

对这种变化bar将是为调用可见.是一种坚持的操纵.传入了对原始对象的引用.为该对象调用了setter,因此callsite的getter将返回bar的新值.

Foo foo = new Foo();
doSomethingToFoo(foo);
int bar = foo.getBar(); // gets 42
Run Code Online (Sandbox Code Playgroud)

但是,给定

public void doSomethingElseWithFoo(Foo foo) {
     foo = new Foo(); // assigning new instance to variable
     foo.setBar(117);
}
Run Code Online (Sandbox Code Playgroud)

此更改在调用点上可见,因为foo方法中的变量已被重新分配.引用只是通过值传递,变量实际上没有以任何方式链接或连接,它们只是有一个共同的值(引用).我们现在已经覆盖了一个变量在方法内部的引用,callsite中的变量具有与之前相同的引用.

Foo foo = new Foo();
foo.setBar(7);
doSomethingElseWithFoo(foo);
int bar = foo.getBar(); // still is 7!
Run Code Online (Sandbox Code Playgroud)

那有意义吗?