C#和#x27;Java中的s ref和out

C#和#x27;Java中的s ref和out,java,pass-by-reference,Java,Pass By Reference,正如我们所知,在将参数传递给方法时,这两种语言都是按值传递的。但是C#支持ref和out关键字通过引用原语类型传递。我正在寻找Java中相同的关键字和技术 我猜是用Java中的Integer包装类而不是int来传递 有什么建议和示例吗?Java不支持此功能。Java不支持通过引用传递基元类型 将int包装为Integer不会有帮助,因为它是一种不可变类型(即,一旦创建就不能更改) Java没有这种内置功能Integer不行,因为它是不可变的。你不能改变它的状态 您必须创建自己的可变包装器类。但是

正如我们所知,在将参数传递给方法时,这两种语言都是按值传递的。但是C#支持
ref
out
关键字通过引用原语类型传递。我正在寻找Java中相同的关键字和技术

我猜是用Java中的
Integer
包装类而不是
int
来传递


有什么建议和示例吗?

Java不支持此功能。

Java不支持通过引用传递基元类型


int
包装为
Integer
不会有帮助,因为它是一种不可变类型(即,一旦创建就不能更改)

Java没有这种内置功能
Integer
不行,因为它是不可变的。你不能改变它的状态


您必须创建自己的可变包装器类。但是这是非常“危险”的,可能会导致意外的结果,所以请尽量避免它。

Java没有这个功能

这里有一个指向Java与C的比较的链接


这就是为什么他们称Java为一种非纯OOP语言的原因。

传递回值的唯一方法是传递对可变值的引用,如

public void calc(int[] value) { value[0] = 1; }
public void calc(AtomicInteger value) { value.set(1); }
但是,最简单的方法是返回所有更改的值

public int calc() { return 1; }

你的猜测是正确的。需要一个包装器(但不是整数,因为它是不可变的)

有些人为此使用单元素数组:

int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];
许多人将这种技术与后藤并列

有些人定义了一个通用holder类:

public class Holder<T> {
    private T _value;
    private Holder(T value) { _value = value; }
    public static of(T value) { return new Holder<T>(value); }
    public T getValue() { return _value; }
    public void setValue(T value) { _value = value; }
}

...

Holder<String> x = Holder.of("123");
Holder<String> y = Holder.of("456");
someMethod(x, y);
return x.getValue() + y.getValue();
有些人会安排在方法内部完成工作,避免首先需要引用参数:

return someMethod(x, y);
这些技术各有优缺点:

  • 数组:简单与丑陋,依赖于数组只有一个元素
  • 持有者:安全与冗长,拳击
  • 专用型:安全型与冗长型,可能过度杀戮
  • 改变方法:安全、清洁与不可能

就我个人而言,我认为Java在这个问题上搞砸了。我宁愿避免引用参数,但我希望Java允许一个方法返回多个值。但是,说实话,我不经常被这件事绊倒。我不会因为这个功能而放弃肾脏。:)

我喜欢
int[]
技术。我试过了,效果很好。谢谢。+1全面的回答,我非常同意最后一段。IMO
int[]
很难看,但离“
goto
-level”还差得远。它以最简单的方式绕过了缺乏语言功能(真正的按引用传递)的问题,这使得它与C中的“按指针传递”几乎完全相同。我们在Java中不像在C中那样经常需要它,但这基本上只是因为这两种语言处理内存管理的方式,而且在更概念的层面上,“对象管理”…实际上…再考虑一下…真正的问题是“为什么要通过引用传递原语?”在一种提供多个返回值(或者,等价地,匿名元组构造)的语言中,原因非常少。值得一提的是,仅在方法调用期间暂时将原语/引用包装在其中一个包装器中不足以修改原始值,只有包装器中的值在方法返回后才会被修改。您必须在之后询问包装器以进行修改拉出修改后的值,并可能希望将其分配给原始变量(除非包装器是存储变量的唯一位置)。
return someMethod(x, y);