Передача ссылкой в Java?

В C++, если у Вас должно быть 2 измененные объекта, можно передать ссылкой. Как Вы выполняете это в Java? Предположите, что 2 объекта являются типами примитивов, такими как интервал.

5
задан SIr Codealot 24 March 2010 в 00:05
поделиться

4 ответа

Вы не можете. Java не поддерживает передачу ссылок на переменные. Все передается по стоимости.

Конечно, когда ссылка на объект передается по значению, она будет указывать на тот же объект, но это не вызов по ссылке .

12
ответ дан 18 December 2019 в 11:55
поделиться

В Java нет передачи по ссылке, но вы все равно можете изменять объекты из этих ссылок (которые сами передаются по значению).

Как видите, вы все еще можете изменять объекты (если они не являются неизменяемыми); вы просто не можете изменить ссылки или примитивы, передав их функции.

Конечно, вы можете сделать их полями объекта и передать эти объекты вокруг и установить для них все, что захотите. Но это все равно не пройти по ссылке.

1
ответ дан 18 December 2019 в 11:55
поделиться

Оберните их в объект, а затем передайте этот объект в качестве параметра методу.

Например, следующий код 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
ответ дан 18 December 2019 в 11:55
поделиться

Используя дженерики, вы можете создать класс указателей, который сделает это хотя бы немного менее болезненным. Вы передаете объект, изменяете его свойство value, и при выходе из функции ваш объект будет содержать новое значение.

MyPointerClass<int> PointerClass = new MyPointerClass<int>(5);
myFunction(PointerClass);
System.out.println(PointerClass.Value.toString());

// ...

void myFunction(myPointerClass<int> SomeValue)
{
  SomeValue.Value = 10;
}
0
ответ дан 18 December 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: