Вызов по ссылке, путаницаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Вызов по ссылке, путаница

Сообщение Anonymous »

Мне дали этот гипотетический блок кода, в котором, хотя используется язык Java, а Java использует вызов по значению, в этом случае вызов по ссылке должен был использоваться для каждого вызова метода, и мне пришлось дайте вывод в формате:

Код: Выделить всё

y:[result]; y: [result]; y:[result]; x:[result]; a:[result]

Код: Выделить всё

public class Main {
static int x = 2;

public static void main(String[] args) {
int[] a = {17, 43, 12};
foo(a[x]);
foo(x);
foo(a[x]);
System.out.println("x:" + x);
System.out.println("a:" + Arrays.toString(a));
}

static void foo(int y) {
x = x - 1;
y = y + 2;
if (x < 0) {
x = 5;
} else if (x > 20) {
x = 7;
}
System.out.println("y:" + y);
}
}.
Я не уверен на 100 %, как в некоторых случаях работает вызов по ссылке, и не уверен, какой результат является правильным.
Во всяком случае, вот один:

Код: Выделить всё

foo(a[x])
вызывается с помощью [2] (12). y становится 12 + 2 = 14. x уменьшается до 1. вызывается с помощью x (который равен 1). И x, и y указывают на значение 1 x. x уменьшается до 0, а затем x становится 3, поскольку y=y+2 и y указывало на значение 1 x.

Код: Выделить всё

foo(a[x])
вызывается с помощью [3] (которого не существует). x уменьшается до 2.
Массив a преобразуется в 17,43,14.
Итак, результаты будут такими:

Код: Выделить всё

y : 14; y : 3; y : ?; x : 2; a : 17,43,14
Думаю, больше всего меня смущает случай с foo(x). Указывает ли y на переменную x или значение x в момент вызова метода?


Подробнее здесь: https://stackoverflow.com/questions/782 ... -confusion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»