在C ++中,如果需要修改2个对象,可以通过引用传递。你如何在java中实现这一目标?假设2个对象是原始类型,例如int。
答案 0 :(得分:12)
你做不到。 Java不支持传递对变量的引用。一切都按价值传递。
当然,当通过值传递对象的引用时,它将指向同一个对象,但这不是通过引用调用。
答案 1 :(得分:2)
将它们包裹在一个对象中,然后将该对象作为参数传递给该方法。
例如,以下C ++代码:
bool divmod(double a, double b, double & dividend, double & remainder) {
if(b == 0) return false;
dividend = a / b;
remainder = a % b;
return true;
}
可以用Java重写为:
class DivRem {
double dividend;
double remainder;
}
boolean divmod(double a, double b, DivRem c) {
if(b == 0) return false;
c.dividend = a / b;
c.remainder = a % b;
return true;
}
虽然Java中更惯用的风格是从方法创建并返回此对象,而不是将其作为参数接受:
class DivRem {
double dividend;
double remainder;
}
DivRem divmod(double a, double b) {
if(b == 0) throw new ArithmeticException("Divide by zero");
DivRem c = new DivRem();
c.dividend = a / b;
c.remainder = a % b;
return c;
}
答案 2 :(得分:1)
Java没有通过引用传递,但你仍然可以改变那些引用中的对象(它们本身是按值传递的)。
java.util.Arrays.fill(int[] arr, int val)
- 填充具有给定int
值的int
数组java.util.Collections.swap(List<?> list, int i, int j)
- 交换列表中的两个元素StringBuilder.ensureCapacity(int min)
- 不言自明如您所见,您仍然可以修改对象(如果它们不是不可变的);你不能通过将它们传递给函数来修改引用或基元。
当然,您可以将它们设为对象的字段并传递这些对象并将它们设置为您想要的任何对象。但这仍未通过参考传递。
答案 3 :(得分:0)
使用泛型,你可以创建一个指针类,这将使这至少有点不那么痛苦。传入对象,更改它的value属性,当函数退出对象时,将包含新值。
MyPointerClass<int> PointerClass = new MyPointerClass<int>(5);
myFunction(PointerClass);
System.out.println(PointerClass.Value.toString());
// ...
void myFunction(myPointerClass<int> SomeValue)
{
SomeValue.Value = 10;
}