正如我们所知,在将参数传递给方法时,两种语言都是按值传递的。但是C#支持ref
和out
个关键字来传递基本类型的引用。我在Java中寻找相同的关键字和技术?
我的猜测是在Java中使用Integer
包装类而不是int
来传入。
有任何建议和例子吗?
答案 0 :(得分:12)
你的猜测是正确的。需要一个包装器(但不是Integer,因为它是不可变的)。
有些人为此目的使用单个元素数组:
int[] x = { 0 };
int[] y = { 0 };
someMethod(x, y);
return x[0] + y[0];
很多人会用GOTO对那种技术进行排名。
有些人定义了一个通用的持有者类:
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();
有些人定义了专门建造的类型:
SomeMethodResult result = someMethod(x, y);
return result.getX() + result.getY();
有些人会安排在方法内完成工作,首先避免使用引用参数:
return someMethod(x, y);
这些技术中的每一种都有优点和缺点:
就个人而言,我认为Java搞砸了这个。我宁愿避免使用引用参数,但我希望Java允许来自方法的多个返回值。但是,说实话,我不经常绊倒这个。我不会为这个功能提供肾脏。 :)
答案 1 :(得分:5)
Java不支持此功能。
答案 2 :(得分:1)
Java不支持通过引用传递基本类型。
将int
包装为Integer
无济于事,因为它是一种不可变类型(即一旦创建就无法更改)。
答案 3 :(得分:1)
Java没有这个内置功能。 Integer
不会这样做,因为它是不可变的。你不能改变它的状态。
您必须创建自己的可变包装类。但这非常“危险”并可能导致意外结果,所以尽量避免它。
答案 4 :(得分:1)
传递值的唯一方法是将引用传递给像
这样的可变值public void calc(int[] value) { value[0] = 1; }
public void calc(AtomicInteger value) { value.set(1); }
然而,最简单的方法是返回所有更改的值
public int calc() { return 1; }
答案 5 :(得分:0)
Java没有此功能
这是Java vs C#比较的链接
http://www.harding.edu/fmccown/java_csharp_comparison.html
这就是为什么他们称Java为非纯OOP语言