Если вы явно инициализируете массив Object в Java, включает в себя "новый объект []", отличный от того, что он не включает его?

Предисловие: этот вопрос задан здесь, но мне интересно конкретно о конкретном значении автора.

Я читаю "Мышление в Java", 3-е изд. Версия 4.0 и Eckel показывает этот фрагмент в главе 4 "Инициализация и очистка":

public class ArrayInit
{
  public static void main(String[] args)
  {
    Integer[] a =
    {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };

    Integer[] b = new Integer[]
    {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };
  }
}

И указывает следующее:

Первая форма полезна время от времени, но ее более ограниченная, так как размер массива определяется во время компиляции.
Вторая форма обеспечивает удобный синтаксис для создания и вызова методов, которые могут создавать тот же эффект, что и списки переменных переменных Cs (так называемые" varargs" на C). Они могут включать неизвестные количества аргументов, а также неизвестные типы.

Я никогда не знал, что они отличаются друг от друга, как описывает Эккель. Насколько я понимаю, это оба массива статического размера. Я не понимаю, как первый более "ограничен", чем второй.

О чем он говорит?

Ответ 1

Я думаю, что это может быть то, о чем автор ссылается.

Начиная с Java 5, мы можем объявлять функции с переменными списками аргументов.

public static int newStyleSum(final int... numbers) {
    int sum = 0;
    for (final int number : numbers) {
        sum += number;
    }
    return sum;
}

Их можно использовать как:

int s = newStyleSum(1, 2, 3, 4);

Эта функция - просто синтаксический сахар. Внутри анонимный массив передается функции.

Перед тем, как мы получили этот синтаксис, приведенный выше пример должен быть записан как:

public static int oldStyleSum(final int[] numbers) {
    int sum = 0;
    for (int i = 0; i < numbers.length; ++i) {
        sum += numbers[i];
    }
    return sum;
}

и называется

int s = oldStyleSum(new int[]{1, 2, 3, 4});  // "second" form

но не как

int s = oldStyleSum({1, 2, 3, 4});  // "first" form (syntax error)

который даже сегодня является синтаксической ошибкой.

И это действительно может быть то, о чем он говорит. Java 5 появилась в 2004 году, поэтому для книги 2002 года она имеет смысл.

Новый синтаксис более гибкий и, что важно, обратно совместимый, поэтому мы все еще можем

int s = newStyleSum(new int[]{1, 2, 3, 4});

или, что более важно,

int[] numbers = {1, 2, 3, 4};
int s = newStyleSum(numbers);

если мы хотим.

Ответ 2

Кажется, он обращается к инициализатору массива, в частности new Integer[]. Из указывается одна и та же глава с использованием явного инициализатора

Other.main(new String[]{ "fiddle", "de", "dum" }); 

чтобы показать полезность передачи массива методу, который невозможен без выражения инициализатора массива

Ответ 3

Вы правы, это не имеет никакого смысла.

Здесь то, что говорило rev 2:

Это время от времени полезно, но оно более ограничено, так как размер массива определяется во время компиляции. Окончательная запятая в списке инициализаторов является необязательной. (Эта функция упрощает обслуживание длинных списков.)

"This" здесь ссылается на "инициализировать массивы объектов с помощью вложенного в фигурные скобки списка", что верно. Похоже, что кто-то сделал плохое редактирование, думая, что "this" относится к "первой форме".

Далее говорится, что вторая форма - полезный способ моделирования varargs, который был истинным в то время, но Java с тех пор получил актуальные varargs. (Первая форма может использоваться только в объявлениях массива, а не в вызовах методов и поэтому не полезна для varargs).