Вопрос по java – Можно ли поменять местами две переменные в Java? [Дубликат]

19

Possible Duplicate:
Is it possible to write swap method in Java?

Учитывая два значения x и y, я хочу передать их в другую функцию, поменять их местами и просмотреть результат. Это возможно в Java?

Вы проверяли этоProgram to Swap two variables or number. ARJUN
Увидетьstackoverflow.com/questions/2393906/… Raedwald
вы можете подойти ближе, как это видно по крайней мере из 2 ответовstackoverflow.com/questions/3624525/… Chris
Is this possible in Java? и ответ:YES Harry Joy
& quot; Поменять их значение & quot ;? Ты имеешь ввидуvariables х и у? И вы хотите, чтобы две переменные имели значение друг друга после вызова? Ray Toal

Ваш Ответ

3   ответа
6
5

потому что слово «значение» в Java имеет очень специфическое значение, которое люди часто не понимают, особенно когда переменные содержат ссылки на объекты.

Я собираюсь предположить, что вопрос требует такого поведения:

x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;

Это невозможно, потому что Java передает все аргументы в методы по значению. Вы никогда не сможете изменить фактическое значение, хранящееся внутриx а такжеy сюда.

ВыcanОднако, если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

Это работает, если ваше понимание ценности - это то, как выглядит объект, а не какова идентичность объекта. Обычно это приемлемо.

(Was going to give a good example here, but cHao already did. Plus others pointed out that this was a duplicate question anyway.)

31

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.
}

Теперь объекты немного различаются в том смысле, что & quot; значение & quot; Переменная объекта на самом деле является ссылкой на объект - и копирование ссылки указывает на тот же объект.

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 сами по себе (то есть вы не можете указывать их на разные объекты) любым способом, который может видеть вызывающий. Но вы можете поменять содержимое объектов, на которые они ссылаются.

Кстати, вышесказанное довольно отвратительно с точки зрения ООП. Это всего лишь пример. Не делай этого.

Error: User Rate Limit ExceededswapError: User Rate Limit ExceededIntHolderError: User Rate Limit Exceededsuper.swap(b);Error: User Rate Limit Exceededjust to avoid breaking swap(b)Error: User Rate Limit ExceededandError: User Rate Limit Exceededall threeError: User Rate Limit Exceeded
Error: User Rate Limit ExceededaError: User Rate Limit ExceededbError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededwhole other functionError: User Rate Limit ExceededIntHolderError: User Rate Limit ExceededvalueError: User Rate Limit ExceededswapError: User Rate Limit ExceededbackwardsError: User Rate Limit Exceeded

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