Java:修改作为引用传递的参数

Java:修改作为引用传递的参数,java,reference,Java,Reference,我必须实现一个接口方法,其签名如下: public int runMethod(final int key, Reference <String> result); public int runMethod(最终int键,参考结果); 在方法返回之前,我必须更新result参数的值。例如,如果调用该方法时,result的值为ABC,我需要将其修改为DEF,然后返回调用者。有人能建议我如何做到这一点吗 java中的对象实际上是通过引用传递的。也就是说,runMethod中的参数“r

我必须实现一个接口方法,其签名如下:

public int runMethod(final int key, Reference <String> result);
public int runMethod(最终int键,参考结果);

在方法返回之前,我必须更新
result
参数的值。例如,如果调用该方法时,
result
的值为
ABC
,我需要将其修改为
DEF
,然后返回调用者。有人能建议我如何做到这一点吗

java中的对象实际上是通过引用传递的。也就是说,runMethod中的参数“result”似乎与调用方中的对象完全相同,而不是副本。因此,通过更新runMethod的Reference参数的内容,您将实现所描述的目标

但是,“result”本身实际上不是指向调用方传递的变量的指针,因此不可能覆盖对象本身,只更新对象的内容。

您不能修改传递给方法的变量。例如:

public int runMethod(final int key, Reference <String> result) {
    result = null; // Only changed the method's version of the variable, and not the variable that was passed to the method
}
...
Reference<String> ref = ...
runMethod(0, ref);
// ref is still what you originally assigned it to
public int runMethod(最终int键,参考结果){
result=null;//只更改了方法的变量版本,而没有更改传递给方法的变量
}
...
引用ref=。。。
runMethod(0,ref);
//ref仍然是您最初分配给它的对象
但是,您可以修改字段并调用所传递对象的方法

public int runMethod(final int key, Reference <String> result) {
    result.someField = ...; // Here we are changing the object, which is the same object as what was passed to the method.
}
...
Reference<String> ref = ...
runMethod(0, ref);
// ref.someField has now been changed
public int runMethod(最终int键,参考结果){
result.someField=…;//这里我们正在更改对象,该对象与传递给方法的对象相同。
}
...
引用ref=。。。
runMethod(0,ref);
//ref.someField现在已更改
另一种方法是将方法的返回类型更改为
Reference
,并返回更新后的值

public Reference<String> runMethod(final int key, Reference <String> result) {
    return ...;
}
...
Reference<String> ref = ...
ref = runMethod(0, ref);
// ref is now whatever you returned from the method
公共引用runMethod(最终int键,引用结果){
返回。。。;
}
...
引用ref=。。。
ref=运行方法(0,ref);
//ref现在是您从方法返回的内容

如果您真的想作为引用传递,这里有一种巧妙的方法,将其包装在一个数组中:

class TestRef{
  static void func(int[] arr){arr[0] = -arr[0];}
  public static void main(String[] args){
    int[] arrI = new int[1];
    arrI[0] = 250;

    System.out.println(arrI[0]); // 250
    func(arrI);
    System.out.println(arrI[0]); // -250
  }
}

在Java中,所有参数都是按值传递的。这包括参考文献。在runMethod中,
result
是作为参数提供的
Reference
引用的副本。这两个都是对同一个对象的独立引用,如果Java通过引用传递参数,这将是非常简单的。但事实并非如此。根据Java规范,您是正确的。但是,你能不能用一种简单的方式来解释这一点,而不是让这个简单的问题变得更加混乱?Java是按引用传递的(对于非原语类型),因为相同的对象引用被传递给方法,所以方法参数与传递给方法的实际变量没有任何链接。只能更改对象的内容,而不能更改传递的变量本身。这基本上是一个语义参数,对问题没有帮助。您能告诉我类引用是什么样子的吗?您指的是
java.lang.ref.Reference
?如果是这样的话,这不是该类的目的。是的,请更一般地看,Java总是按值传递,无论是对于primitive类型还是refenrene类型,这里的更多内容:这正确地解释了参数传递,但是无论是
Reference
接口还是标准库中的三个实现类中的任何一个都没有提供一种机制来更改实例引用的对象。它们并不是为OP想要让它们发挥的作用而设计的。@JohnBollinger啊,我没有意识到标准库中有一个
Reference
类型,并假设它是第三方类型。他不能将返回类型更改为与实现的类型不兼容的类型。@LaVloZMerrill这就是为什么我首先说如果可以更改返回类型,那么它是一个替代类型,如果不能,那么就不要这样做,正如我已经说过的。。。。。