Можно ли обменять две переменные на Java?
Возможный дубликат:
Можно ли написать метод swap в Java?
Учитывая два значения x и y, я хочу передать их в другую функцию, обменять их значение и просмотреть результат. Возможно ли это на Java?
Ответы
Ответ 1
Не с примитивными типами (int
, long
, char
и т.д.). Java передает материал по значению, что означает, что переменная, передаваемая вашей функцией, является копией оригинала, и любые изменения, внесенные вами в копию, не будут влиять на оригинал.
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
// a and b are copies of the original values.
// The changes we made here won't be visible to the caller.
}
Теперь объекты немного отличаются друг от друга, поскольку "значение" объектной переменной на самом деле является ссылкой на объект - и копирование ссылки делает ее точкой для одного и того же объекта.
class IntHolder { public int value = 0; }
void swap(IntHolder a, IntHolder b)
{
// Although a and b are copies, they are copies *of a reference*.
// That means they point at the same object as in the caller,
// and changes made to the object will be visible in both places.
int temp = a.value;
a.value = b.value;
b.value = temp;
}
Ограничение: вы по-прежнему не можете изменять значения a
или b
сами (то есть вы не можете указывать их на разные объекты) любым способом, который может видеть вызывающий. Но вы можете поменять содержимое объектов, на которые они ссылаются.
Кстати, вышесказанное довольно отвратительно с точки зрения ООП. Это просто пример. Не делайте этого.
Ответ 2
Это невозможно сделать в Java, без использования каких-либо объектов или массивов.
fooobar.com/questions/118495/...
Ответ 3
Я собираюсь быть reallllyyyy раздражающим и педантичным здесь, потому что слово "значение" имеет очень специфический смысл в Java, который люди часто часто не понимают, особенно когда переменные содержат ссылки на объекты.
Я собираюсь предположить, что вопрос задает такое поведение:
x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;
Это невозможно, потому что Java передает все аргументы методам по значению. Вы никогда не сможете изменить фактическое значение, сохраненное внутри x
и y
таким образом.
Тем не менее, если x
и y
содержат ссылки на объекты, измените свойства этих двух объектов таким образом, чтобы печатные значения выглядели как друг с другом начальные значения:
x = initialValueForX;
y = initialValueForY;
swap(x, y);
System.out.println(x); prints what looks like initialValueForY
System.out.println(y); prints what looks like initialValueForX
Это работает, если ваше понимание ценности - это то, чем выглядит объект, а не то, что является идентификатором объекта. Обычно это приемлемо.
(Собирался дать хороший пример здесь, но cHao уже сделал. Плюс другие отметили, что это был дублированный вопрос.)