Страницы

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

четверг, 5 декабря 2019 г.

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

#java #массивы


Почему такая инициализация массива допустима:

int[] array = {1,2,3};


а вот такая нет:

int[] array;
array = {1,2,3};


Вроде бы можно сказать, что способы вполне эквиваленты.
    


Ответы

Ответ 1



Так определено в языке. Синтаксис 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]); вели бы себя по-разному! И это приводило бы к ошибкам и недопониманию. Но это лишь мои догадки.

Ответ 2



Фактически, данное предложение array = {1,2,3}; не является инициализацией создаваемого массива. Это предложение выражения с оператором присваивания, причем в правой части имеется конструкция, которая не является выражением. А оператор присваивания требует в правой части от знака = некоторое выражение.

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

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