В C++, если у Вас должно быть 2 измененные объекта, можно передать ссылкой. Как Вы выполняете это в Java? Предположите, что 2 объекта являются типами примитивов, такими как интервал.
Вы не можете. Java не поддерживает передачу ссылок на переменные. Все передается по стоимости.
Конечно, когда ссылка на объект передается по значению, она будет указывать на тот же объект, но это не вызов по ссылке .
В 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)
- не требует пояснений Как видите, вы все еще можете изменять объекты (если они не являются неизменяемыми); вы просто не можете изменить ссылки или примитивы, передав их функции.
Конечно, вы можете сделать их полями объекта и передать эти объекты вокруг и установить для них все, что захотите. Но это все равно не пройти по ссылке.
Оберните их в объект, а затем передайте этот объект в качестве параметра методу.
Например, следующий код 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;
}
Используя дженерики, вы можете создать класс указателей, который сделает это хотя бы немного менее болезненным. Вы передаете объект, изменяете его свойство value, и при выходе из функции ваш объект будет содержать новое значение.
MyPointerClass<int> PointerClass = new MyPointerClass<int>(5);
myFunction(PointerClass);
System.out.println(PointerClass.Value.toString());
// ...
void myFunction(myPointerClass<int> SomeValue)
{
SomeValue.Value = 10;
}