Массив — структура данных, которая описывает упорядоченную коллекцию фиксированного числа однородных элементов. Это значит, что все элементы в массиве имеют одинаковый тип. Позиция в массиве указывается неотрицательным целым значением, называемым индексом. Размер массива фиксирован и не может возрастать для размещения большего количества элементов.
В Java массивы являются объектами. Массивы могут быть примитивных типов или ссылочных типов. В первом случае все элементы массива относятся к определенному примитивному типу. Во втором случае все элементы являются ссылками определенного ссылочного типа. Ссылки в массиве могут указывать на объекты этого типа или его подтипов. Каждый объект-массив имеет неизменяемое (final)
поле, называемое length
, которое определяет размер массива, т.е. количество элементов, которое массив может содержать. Первый элемент всегда имеет индекс 0
, а последний элемент имеет индекс n - 1
, где n
является значением поля length
в массиве.
Простые массивы — это одномерные массивы, т.е. простая последовательность значений. Так как массивы могут хранить ссылки на объекты, то и объекты, на которые они ссылаются, могут также быть объектами-массивами. Это позволяет реализовывать массивы массивов.
Объявление переменной массива имеет либо следующий синтаксис:
<тип элемента>[] <имя массива>;
либо следующий:
<тип элемента> <имя массива>[];
где <тип элемента> может быть примитивным типом или ссылочным типом. Переменная массива <имя массива> имеет тип <тип элемента> [ ]. Обратите внимание, что размер массива не задается. Это значит, что переменной массива <имя массива> может быть присвоен массив любой длины, но его элементы должны иметь тип <тип элемента>.
Важно понимать, что объявление переменной реально не создает массив. Оно только описывает ссылку, которая может обозначать объект-массив.
int anIntArray[], oneInteger;
Pizza[] mediumPizzas, largePizzas;
Эти два объявления описывают переменные anIntArray
и mediumPizzas
, которые являются ссылочными переменными, обозначающими массив значений типа int
и массив объектов типа Pizza
соответственно. Переменная largePizzas
может указывать на массив пицц, а переменная onelnteger
не может обозначать массив значений типа int
— это просто переменная типа int
.
Если обозначение [ ]
следует за типом, то все переменные в объявлении являются массивами, в противном случае обозначение [ ]
должно следовать за каждым отдельным именем массива в объявлении. Переменная массива, которая объявлена как член класса, не инициализирована и не указывает на массив, будет инициализирована ссылочным значением по умолчанию null
. Такая инициализация по умолчанию не применяется к локальным ссылочным переменным и поэтому не применяется к локальным переменным-массивам. Это не следует путать с инициализацией элементов массива во время создания массива.
Массив может быть создан для определенного набора элементов одного типа при помощи оператора new
. Результирующая ссылка на массив может быть присвоена переменной массива соответствующего типа.
<имя массива> = new <тип элемента> [<размер массива>];
Минимальное значение <размер массива> равно 0
(т.е. в Java можно создавать пустые массивы). Если размер массива отрицательный, то будет выброшено исключение NegativeArraySizeException
.
Если даны следующие объявления массива:
int anIntArray[], oneInteger;
Pizza[] mediumPizzas, largePizzas;
массивы могут быть созданы следующим образом:
anIntArray = new int[10]; // массив из 10 целых
mediumPizzas = new Pizza[5]; // массив из 5 пицц
largePizzas = new Pizza[3]; // массив из 3 пицц
Объявление и создание массива можно объединить.
<тип_элемента1>[] <имя_массива> = new <тип_элемента2>[<размер_массива>];
Однако здесь тип массива <тип элемента2> [ ] должен быть совместим пo присваиванию с типом массива <тип элемента1> [ ]. Когда массив создается, все его элементы инициализируются значениями по умолчанию для типа <тип элемента2>. Это верно при создании как массива-члена класса, так и локальных переменных-массивов.
Во всех примерах выше код создает массив, и элементы массива неявно инициализируются своим значением по умолчанию. Например, элемент с индексом 2 в массиве anIntArray
устанавливается в значение 0
, а элемент с индексом 3 в массиве mediumPizzas
получает значение null
, когда массив создается.
int[] anIntArray = new int[10]; // Значение по умолчанию: 0.
Pizza[] mediumPizzas = new Pizza[5]; // Значение по умолчанию: null.
// Pizza расширяет класс Object
Object objArray = new Pizza[3]; // Значение по умолчанию: null.
// Pizza реалзует интерфейс Eatable
Eatable[] eatables = new Pizza[2]; // Значение по умолчанию: null.
Значение поля length
в каждом массиве берется равным количеству элементов, определенных на этапе создания массива (например, mediumPizzas.length
имеет значение 5).
Как только массив создан, его элементы можно также проинициализировать явно и отдельно; например, в цикле. Остальные примеры в этом разделе интенсивно используют циклы, для прохода по всем элементам массива с разными целями.
Урок 4. Объявления и управление доступом | Инициализация и использование массивов |