Java中“ByRef”的等价物是什么?

Java中“ByRef”的等价物是什么?,java,vb.net,Java,Vb.net,我正在将一些代码从VisualBasic翻译成Java,在VB中使用ByRef关键字时遇到了一个障碍。这在Java中是不存在的 我应该如何在Java中模拟ByRef调用 编辑:只是为了澄清那些不懂VB的人,ByRef在调用函数后在括号中标识了一个变量,并使其在函数内部发生更改时,该变量在被调用的位置也会发生更高的更改,而不是只记住变量值的ByVal。在方法中更改ByVal变量不会影响调用它的变量。您不能。Java中的所有内容都是按值传递的,包括对象引用。但是,您可以创建一个holder对象,并在

我正在将一些代码从VisualBasic翻译成Java,在VB中使用ByRef关键字时遇到了一个障碍。这在Java中是不存在的

我应该如何在Java中模拟ByRef调用


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

您不能。Java中的所有内容都是按值传递的,包括对象引用。但是,您可以创建一个holder对象,并在方法中修改其值

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中的所有内容都是按值传递的,包括对象引用。但是,您可以创建一个holder对象,并在方法中修改其值

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没有等效的

您需要从方法返回对象,并将其重新分配,例如

 myInteger = doSomething(myInteger);
或者,您需要创建一个包装器对象,这些对象通常是名称持有者。 如果您有一个名为myInteger的变量,希望某些方法进行更改,则 将其作为Holder类的成员传递给该方法

e、 g.这可以自然地制成通用的

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没有等效的

您需要从方法返回对象,并将其重新分配,例如

 myInteger = doSomething(myInteger);
或者,您需要创建一个包装器对象,这些对象通常是名称持有者。 如果您有一个名为myInteger的变量,希望某些方法进行更改,则 将其作为Holder类的成员传递给该方法

e、 g.这可以自然地制成通用的

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在某些场景中,它可以很容易地被模拟。值得一提的是,它是对象引用的传递值。还值得一提的是,引用的传递值是我听过的最愚蠢、最冗余的事情。关于:这个主题。@BrianRoach如何准确地描述行为愚蠢或冗余?在java中,一切都是传递值,你不知道,因为Java只是通过值进行调用。好吧,你们并没有错,但你们也没有帮助:p在某些场景中,它可以很容易地被模拟。而且,值得一提的是,它是对象引用的传递值。还值得一提的是,引用的传递值是我听过的最愚蠢、最冗余的事情。关于:这个话题。@BrianRoach如何准确地描述行为愚蠢或冗余?这是一个很好的回答,但像这样明显重复的问题:应该关闭。因为你还没有投票关闭的能力,所以它应该被标记。@SteveP。符合事实的我是Sun/Oracle论坛最近的难民,几乎没有人能处理这些信息,所以我还在学习诀窍。@SteveP。它是复制品吗?虽然问题的关键可能是相同的,但这个问题似乎只是有一大堆关于Java如何只允许一个参数传递机制的讲座,似乎没有解决CLR ref概念在Java中很容易模拟的事实。当然,这些答案很长,我没有深入阅读,但是页面上的搜索没有找到holder、proxy甚至simulate的点击率,只有1个不是这个答案。@Joel重复的问题和重复的答案是有区别的。这个问题肯定是重复的。不管怎么说,至少有一个人提到了这一点。@SteveP。在这个网站上,大约50-99%的声誉是通过重复答案获得的。我并不是说它应该是这样的,但你正在进行一场艰苦的战斗:p,而这场战斗甚至不是其中之一。这是一个很好的答案,但像这样的问题应该结束。因为你还没有投票关闭的能力,所以它应该被标记。@SteveP。符合事实的我是Sun/Oracle论坛最近的难民,几乎没有人能处理这些信息,所以我还在学习诀窍。@SteveP。它是复制品吗?虽然问题的关键可能是相同的,但这个问题似乎只是有一大堆关于Java如何只允许一个参数传递机制的讲座,似乎没有解决CLR ref概念在Java中很容易模拟的事实。当然,这些答案很长,我没有深入阅读,但页面上的搜索没有找到holder、proxy甚至simulate的点击率,只有1个不是这个答案。@Joel重复的问题之间有区别
和重复的答案。这个问题肯定是重复的。不管怎么说,至少有一个人提到了这一点。@SteveP。在这个网站上,大约50-99%的声誉是通过重复答案获得的。我并不是说它应该是这样的,但你正在打一场艰苦的战斗:p,这场甚至不是其中之一。