我正在将一些代码从VisualBasic转换为Java,并且在VB中使用ByRef关键字时遇到了麻烦。这在Java中不存在!什么是Java中的“ByRef”等价物?
我该如何模拟Java中的ByRef调用?
编辑:只是为了澄清那些不知道VB的人,ByRef在调用一个函数后在括号中标识一个变量,并使得当该变量在函数内部发生变化时,它也会变得更高它被调用的地方与ByVal相对,只有变量的值被记住。在方法中更改ByVal变量不会影响其调用的变量。
我正在将一些代码从VisualBasic转换为Java,并且在VB中使用ByRef关键字时遇到了麻烦。这在Java中不存在!什么是Java中的“ByRef”等价物?
我该如何模拟Java中的ByRef调用?
编辑:只是为了澄清那些不知道VB的人,ByRef在调用一个函数后在括号中标识一个变量,并使得当该变量在函数内部发生变化时,它也会变得更高它被调用的地方与ByVal相对,只有变量的值被记住。在方法中更改ByVal变量不会影响其调用的变量。
你不能。 Java中的所有东西都是按值传递的,包括对象引用。但是,您可以创建一个“持有者”对象,并在方法内修改其值。
public class Holder<T> {
T value;
public Holder(T value) {
this.value = value;
}
// getter/setter
}
public void method(Holder<Foo> foo) {
foo.setValue(something);
}
这是一个很好的答案,但是像这样的问题(明显的重复:[是Java pass by reference](http://stackoverflow.com/questions/40480/is-java-pass-by-reference))应该关闭。既然你还没有投票结束的能力,它应该被标记。 –
@SteveP。真正。我最近是来自Sun/Oracle论坛的难民,而且很少有人能够处理这些消息,所以我仍然在学习绳索。 – Kayaman
@SteveP。它是重复的吗?虽然问题的关键可能是相同的,但这个问题似乎只是讲了一堆关于Java如何只允许一个参数传递机制的讲座,而且似乎没有解决CLR'ref'概念很容易实现的事实用Java进行模拟。诚然,这些答案很长,我没有深入阅读,但在页面上搜索没有提供“持有人”,“代理”,甚至“模拟”的命中只有1不是这个答案。 – Joel
Java没有equivialent。
您需要从您的方法中返回对象并将其分配回来,例如,
myInteger = doSomething(myInteger);
或者你需要做一个包装对象,这些通常是一个名称持有人。 如果您有一个名为myInteger
的变量,您想要某种方法更改,则您将 作为“Holder”类的成员传递给该方法。
例如(这当然也可以做成一个通用)
class IntegerHolder {
public Integer myInteger;
}
IntegerHolder myHolder;
myHolder.myInteger = myInteger;
doSomething(myHolder);
//use the possibly altered myHolder.myInteger now.
里面DoSomething的,你现在可以改变myHolder.myInteger,并呼吁 DoSomething的(方法)可以看到的变化,例如
void doSomething(IntegerHolder holder)
{
holder.myInteger = holder.myInteger * 100;
}
在java中,一切都是按值传递 –
您不这样做,因为Java只是按值调用。 –
嗯,你们并没有错,但你们也没有帮助:p在某些情况下,它很容易被模拟。而且,值得一提的是它是对象的参考值的传递。 – keyser