Массив объектов в Java
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего "Самоучителя по Java"
Что такое массив
Ранее на нашем сайте уже была размещена статья, посвященная массивам в Java. В ней мы рассказывали, что массив - это такой "контейнер", который может вмещать в себя несколько однородных переменных.
У массивов есть несколько особенностей:
1. Они могут хранить переменные только одного типа;
2. Размер массива нельзя поменять;
3. Массив имеет длину;
4. Элементы массивов имеют индексы, по которым к ним и обращаются в случае необходимости;
5. Номер первого элемента массива - 0;
6. Можно создавать пустые массивы, и "положить" в них элементы потом.
А вот что такое "массивы объектов" мы ранее не рассматривали. Давайте разберемся что к чему.
Массив объектов
По сути, у массивов объектов очень много общего с обычными массивами, только у них другая "начинка". Тем не менее, как Вы знаете, объекты гораздо "сложнее", чем переменные, потому что у них есть больше составляющих.
Массив объектов объявляется так же, как и массив переменных:
Как вы видите, у нас не массив разных объектов (стульев, столов и жевательных резинок). Это массив объектов одного класса (массив стульев, например).
Тут тоже все начинается и заканчивается названием класса, а в конце в квадратных скобках указывается размер массива:
Распространенная ошибка
Массив объектов отличается одной особенностью - они состоят из ссылок на объекты:
То есть в массиве не содержатся все переменные и методы каждого объекта, как Вы могли бы подумать, а только ссылки на эти самые объекты. Но тут возникает одна опасность. Обычно переменные в массивах имеют значения по умолчанию - если не задать, например, значение переменной int, то она по умолчанию будет равна 0 (больше информации про значения по умолчанию можно найти здесь).
В случает с объектами, происходит по-другому. В массиве должна храниться ссылка на объект, но пока объекта не существует, - ссылки на него тоже быть не может.
Поэтому, в массиве хранится значение по умолчанию null. Если Вы попробуете вызвать метод не созданного объекта, возникнет распространенная ошибка NullPointerException. Обязательно создайте свои объекты перед тем, как обращаться к ним! 😉
Пример
Давайте создадим массив объектов. Допустим, у нас есть класс - ObjMass, и все, что в нем хранится - это массив объектов Cat из 3 элементов:
1 2 3 |
public class ObjMass { Cat[] name = new Cat [3]; } |
Ура! Но если класса Cat вы ранее не описывали (ну, не знает Java что такое Cat и откуда она должна вам его взять), тогда название объекта будет выделено красным. Так, в нашем случае, создадим параллельно класс Cat:
1 2 3 4 5 6 7 |
class ObjMass { Cat[] abc = new Cat [3]; } class Cat{ } |
Теперь все нормально - только, конечно, Cat совсем не Cat. Зачем нам массив пустых объектов? Для упрощения, давайте у кота будет только кличка:
1 2 3 4 5 6 7 8 9 10 11 |
class ObjMass { Cat[] abc = new Cat [3]; } class Cat{ String name; public Cat (String name){ this.name = name; } } |
Вот, класс Cat теперь имеет содержание.
Для того, чтобы показать, что случится если обратиться к объектам, которые еще не были созданы, расширим этот пример. Обратите внимание: перед массивом объектов Cat мы поставили модификатор static (подробнее о нем тут). Давайте добавим метод main:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class ObjMass { static Cat[] abc = new Cat [3]; public static void main (String[] args){ } } } class Cat{ String name; public Cat (String name){ this.name = name; } } |
Теперь, чтобы вывести массив на экран, как всегда, создадим цикл. Обратите внимание - мы выводим не имя кошки (abc[i].name), а объект - abc[i]:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class ObjMass { static Cat[] abc = new Cat [3]; public static void main (String[] args){ for (int i = 0; i<3; i++){ System.out.println(abc[i]); } } } class Cat{ String name; public Cat (String name){ this.name = name; } } |
Что Вы увидите на экране?
null
null
null
Это, как мы говорили раньше, значение по умолчанию (пока ничего другого не задали). Именно при ссылке на него возникает NullPointerException - т.е. "исключение - ссылка на null". Эта ошибка возникнет, если мы сошлемся на свойство null-ного объекта - например, давайте выведем на экран имена кошек (abc[i].name):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class ObjMass { static Cat[] abc = new Cat [3]; public static void main (String[] args){ for (int i = 0; i<3; i++){ System.out.println(abc[i].name); } } } class Cat{ String name; public Cat (String name){ this.name = name; } } |
Что будет? Выдаст от самый NullPointerException.
Чтобы такого не случилось, давайте "заполним" наш массив:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class ObjMass { static Cat[] abc = new Cat [3]; public static void main (String[] args){ abc[0] = new Cat("Kitty"); abc[1] = new Cat("Molly"); abc[2] = new Cat("Lily"); for (int i = 0; i<3; i++){ System.out.println(abc[i].name); } } } class Cat{ String name; public Cat (String name){ this.name = name; } } |
Видим результат выполнения кода:
Kitty
Molly
Lilly
Ура! Теперь Вы знаете основные особенности использования массива объектов в Java. В остальных аспектах, они работают так же как и массивы примитивных типов.
Данная статья написана Vertex Academy. Также Вы можете пройти у нас обучение по Java. Детальнее у нас на сайте.