Создание массивов в Java (стиль С++)
Почему мы не можем создавать массивы в Java следующим образом:
int marks[5];
И присваивать значения после этого объявления?
Любой, пожалуйста, объясните терминологию или разницу.
Ответы
Ответ 1
Это связано с тем, что в Java нет массивов стеков. Вот эквивалент Java:
int[] marks = new int[5];
Он очень похож на распределение массивов динамического размера в С++. Конечно, вам не нужно беспокоиться о вызове delete[]
, потому что он собрал мусор.
Ответ 2
Поскольку синтаксис, который вы цитируете, выделяет массив в стеке, а массивы Java - это объекты, а все объекты Java выделяются в куче (по модулю недавних оптимизаций JVM, но они неявные).
И это в значительной степени должно быть таким образом на языке без ручного управления памятью, потому что материал, распределенный по стекам, исчезает, когда вызов возвращается, что приводит к оборванным указателям, а фундаментальная особенность Java - не допускать подобных вещей.
Конечно, можно утверждать, что Java должен использовать синтаксис выделения стека для выделения кучи, но это могло бы смутить черт из всех, кто знал C - нехорошо.
Ответ 3
В Java размер массива определяется выражением, которое его создает, например:
int[] marks = new int[5];
или
int[] marks = {1,2,3,4,5};
Отметьте также, что хотя синтаксис int marks[]
разрешен в Java (у Java есть несколько таких правил для совместимости с С++), это не рекомендуется, синтаксис int[] marks
более идиоматичен и, следовательно, предпочтительным.
Ответ 4
int[] marks = new int[]{1, 2, 3};
Ответ 5
Поскольку массивы Object
-s (наследуются от класса Object
). А для создания объекта вам нужно использовать ключевое слово new
. (В большинстве случаев).
Я думаю, что причина ключевого слова new
заключается в том, чтобы обозначить, что переменные являются ссылками на динамически распределенные экземпляры.