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