Передача по ссылке в Java? - PullRequest
5 голосов
/ 24 марта 2010

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

Ответы [ 4 ]

12 голосов
/ 24 марта 2010

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

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

2 голосов
/ 24 марта 2010

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

Например, следующий код 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;
}
1 голос
/ 24 марта 2010

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

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

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

0 голосов
/ 24 марта 2010

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

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

// ...

void myFunction(myPointerClass<int> SomeValue)
{
  SomeValue.Value = 10;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...