2013-08-07 222 views
0

我正在将一些代码从VisualBasic转换为Java,并且在VB中使用ByRef关键字时遇到了麻烦。这在Java中不存在!什么是Java中的“ByRef”等价物?

我该如何模拟Java中的ByRef调用?

编辑:只是为了澄清那些不知道VB的人,ByRef在调用一个函数后在括号中标识一个变量,并使得当该变量在函数内部发生变化时,它也会变得更高它被调用的地方与ByVal相对,只有变量的值被记住。在方法中更改ByVal变量不会影响其调用的变量。

+2

在java中,一切都是按值传递 –

+1

您不这样做,因为Java只是按值调用。 –

+5

嗯,你们并没有错,但你们也没有帮助:p在某些情况下,它很容易被模拟。而且,值得一提的是它是对象的参考值的传递。 – keyser

回答

8

你不能。 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); 
} 
+4

这是一个很好的答案,但是像这样的问题(明显的重复:[是Java pass by reference](http://stackoverflow.com/questions/40480/is-java-pass-by-reference))应该关闭。既然你还没有投票结束的能力,它应该被标记。 –

+1

@SteveP。真正。我最近是来自Sun/Oracle论坛的难民,而且很少有人能够处理这些消息,所以我仍然在学习绳索。 – Kayaman

+1

@SteveP。它是重复的吗?虽然问题的关键可能是相同的,但这个问题似乎只是讲了一堆关于Java如何只允许一个参数传递机制的讲座,而且似乎没有解决CLR'ref'概念很容易实现的事实用Java进行模拟。诚然,这些答案很长,我没有深入阅读,但在页面上搜索没有提供“持有人”,“代理”,甚至“模拟”的命中只有1不是这个答案。 – Joel

1

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; 
} 
相关问题