Страницы

Поиск по вопросам

среда, 10 октября 2018 г.

Инициализация массивов

Почему такая инициализация массива допустима:
int[] array = {1,2,3};
а вот такая нет:
int[] array; array = {1,2,3};
Вроде бы можно сказать, что способы вполне эквиваленты.


Ответ

Так определено в языке.
Синтаксис int[] array = {1,2,3}; — это инициализация, целостное выражение, которое не есть «присваивание array значения {1, 2, 3}», а «инициализация массива значениями 1, 2, 3».
А array = {1, 2, 3}; — это присваивание. Но правая часть тут вовсе не определена в языке, инициализатор не имеет самостоятельного смысла.
Вы можете, однако, присвоить так:
int[] array; array = new int[] {1, 2, 3};
Здесь правая часть new int[] {1, 2, 3} — нормальный, инициализированный объект.

В принципе, язык мог бы определить {1, 2, 3} как литерал массива, то есть, чтобы это имело такое же значение, как new int[] {1, 2, 3}. Но дизайнеры языка посчитали это излишним.
Мне кажется, они руководствовались таким соображением: для литералов целых чисел (типа 5) нет особой разницы, писать ли
int x = 5; int y = 5;
или
int x = 5; int y = x;
А вот для литералов массива (который есть ссылочный тип) разница была бы: вот такой гипотетический код
int[] x = {1, 2, 3}; int[] y = {1, 2, 3}; x[0] = 10; System.out.println(y[0]);
и
int[] x = {1, 2, 3}; int[] y = x; x[0] = 10; System.out.println(y[0]);
вели бы себя по-разному! И это приводило бы к ошибкам и недопониманию. Но это лишь мои догадки.

Комментариев нет:

Отправить комментарий