Создание массива объектов в Java
Я новичок в Java и за время создал массив объектов на Java.
У меня есть класс A, например –
Но это только создает указатели (ссылки) на A, а не на 4 объекта. Это верно? Я вижу, что, когда я пытаюсь получить доступ к функциям/переменным в создаваемых объектах, я получаю исключение с нулевым указателем.
Чтобы иметь возможность манипулировать/получать доступ к объектам, которые я должен был сделать, –
A[] arr = new A[4]; for( int i=0; i
Является ли это правильным или я делаю что-то неправильно? Если это правильно, это действительно странно.
EDIT: Я нахожу это странным, потому что на С++ вы просто говорите новый A [4] и он создает четыре объекта.
создает 4 ссылки, похожие на это
теперь вы не можете сделать a1.someMethod() без выделения a1 как
аналогично, с массивом, который вам нужно сделать
прежде чем использовать его.
Это верно. Вы также можете сделать:
Этот синтаксис также можно использовать для создания и инициализации массива в любом месте, например, в аргументе метода:
Да, он создает только ссылки, для которых установлено значение по умолчанию null. Вот почему вы получаете исключение NullPointerException. Вам нужно создавать объекты отдельно и назначать ссылку. Существует 3 шага для создания массивов в Java –
Декларация. На этом шаге мы укажем тип данных и размеры массива, которые мы собираемся создать. Но помните, мы пока не упоминаем размеры размеров. Они оставлены пустыми.
Instantiation. На этом этапе мы создаем массив или выделяем память для массива с использованием нового ключевого слова. На этом этапе мы указываем размеры размеров массива.
Инициализация. Массив всегда инициализируется значением по умолчанию для типов данных. Но мы можем сделать свои собственные инициализации.
Объявление массивов в Java
Так мы объявляем одномерный массив в Java –
Oracle рекомендует использовать прежний синтаксис для объявления массивов. Вот еще несколько примеров юридических деклараций –
// One Dimensional Arrays int[] intArray; // Good double[] doubleArray; // One Dimensional Arrays byte byteArray[]; // Ugly! long longArray[]; // Two Dimensional Arrays int[][] int2DArray; // Good double[][] double2DArray; // Two Dimensional Arrays byte[] byte2DArray[]; // Ugly long[] long2DArray[];
И вот некоторые примеры незаконных объявлений –
int[5] intArray; // Don't mention size! double<> doubleArray; // Square Brackets please!
Инстанцирование
Вот как мы “создаем экземпляр” или выделяем память для массива –
Когда JVM встречает ключевое слово new , он понимает, что он должен выделять память для чего-то. И, указав int[5] , мы подразумеваем, что нам нужен массив int s, размер 5. Таким образом, JVM создает память и присваивает ссылку вновь выделенной памяти массиву, который является “ссылкой” типа int[]
Инициализация
Использование цикла. Использование цикла for для инициализации элементов массива является наиболее распространенным способом получения массива. Нет необходимости запускать цикл for, если вы собираетесь назначить значение по умолчанию, потому что JVM делает это за вас.
Все в одном. . Мы можем объявить, создать и инициализировать наш массив за один раз. Heres синтаксис –
Здесь мы не упоминаем размер, потому что JVM может видеть, что мы даем 5 значений.
Итак, до тех пор, пока мы не создадим экземпляр, ссылки остаются пустыми. Надеюсь, мой ответ помог вам…!:)
Вот явный пример создания массива из 10 объектов-сотрудников с конструктором, который принимает параметр:
public class MainClass < public static void main(String args[]) < System.out.println("Hello, World!"); //step1 : first create array of 10 elements that holds object addresses. Emp[] employees = new Emp[10]; //step2 : now create objects in a loop. for(int i=0; i> > class Emp < int eno; public Emp(int no)< eno = no; System.out.println("emp constructor called..eno is.."+eno); >>
Ты прав. Помимо этого, если мы хотим создать массив определенного размера, заполненный элементами, предоставленными некоторыми “фабриками”, поскольку Java 8 (который вводит поток API), мы можем использовать этот однострочный интерфейс:
A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
- Stream.generate(() → new A()) похож на фабрику для отдельных элементов A, созданных способом, описанным lambda, () → new A() который является реализацией Supplier – он описывает, как каждый новый Необходимо создать экземпляры.
- limit(4) устанавливает количество элементов, которые будут генерироваться потоком
- toArray(A[]::new) (также может быть переписан как toArray(size → new A[size]) ) – он позволяет нам определять/описывать тип массива, который должен быть возвращен.
Для некоторых примитивных типов вы можете использовать DoubleStream , IntStream , LongStream , которые дополнительно обеспечивают генераторы, такие как range rangeClosed и несколько других.
Да, правильно в Java существует несколько шагов для создания массива объектов:
- Объявление и последующее создание (создание памяти для хранения объектов “4” ):
arr[0] = new A(); arr[1] = new A(); arr[2] = new A(); arr[3] = new A();
Теперь вы можете начать вызов существующих методов из объектов, которые вы только что создали, и т.д.
Для универсального класса необходимо создать класс-оболочку. Например:
приводит к: “Невозможно создать общий массив”
class SetOfS set = new HashSet<>();> SetOfS[] sets = new SetOfS[10];
Общая форма объявления нового массива в Java выглядит следующим образом:
type arrayName[] = new type[numberOfElements];
Где тип – это примитивный тип или объект. numberOfElements – это количество элементов, которые вы будете хранить в массиве, и это значение не может быть изменено, поскольку Java не поддерживает динамические массивы (если вам нужна гибкая и динамическая структура для хранения объектов, вы можете захотеть использовать некоторые из коллекций Java).
Позволяет инициализировать массив для хранения зарплат всех сотрудников в небольшой компании из 5 человек:
Тип массива (в данном случае int ) применяется ко всем значениям в массиве. Вы не можете смешивать типы в одном массиве.
Теперь, когда у нас инициализирован массив salaries, мы хотим добавить в него некоторые значения. Мы можем сделать это либо во время инициализации следующим образом:
Или сделать это позже, как это:
salaries[0] = 50000; salaries[1] = 75340; salaries[2] = 110500; salaries[3] = 98270; salaries[4] = 39400;
Более наглядный пример создания массива:
Чтобы узнать больше о массивах, ознакомьтесь с руководством.
Как создать массив объектов класса java
Для создания массива объектов класса в Java можно использовать следующий синтаксис:
ClassName[] array = new ClassName[size];
Где ClassName - имя класса, а size - количество элементов в массиве. Затем можно инициализировать каждый элемент массива, создавая новые объекты с помощью оператора new:
array[0] = new ClassName(); array[1] = new ClassName(); // и т.д.
Можно также использовать цикл for для инициализации всех элементов массива:
for (int i = 0; i size; i++) array[i] = new ClassName(); >
Вместо пустого конструктора можно передать аргументы в конструктор класса для создания объектов с определенными значениями.
Массив объектов в Java. Как добавить объект в массив Java?
Мы уже рассказывали про массивы в Java. В этой статье поговорим про массив объектов и о том, как добавить объект в массив Java. Но сначала давайте вспомним, что массив — это своеобразный контейнер, где может храниться несколько однородных переменных.
Массивы имеют следующие особенности: 1. Хранят переменные лишь одного типа. 2. Имеют определённую длину. 3. Размер массива поменять нельзя. 4. Элементы массива имеют индексы, позволяющие обратиться к этим элементам в случае надобности. 5. Номер 1-го элемента массива — это 0, а не 1; 6. Всегда можно создать пустой массив, а поместить в него элементы можно и потом.
Впрочем, всё это вы уже знаете из предыдущей статьи. Но что такое массив объектов, мы не рассматривали. Впрочем, сейчас мы этот пробел устраним.
Массивы объектов в Java
Массив объектов похож на обычный массив, но имеет другую «начинку». Это связано с тем, что объекты сложнее переменных, т. к. имеют больше составляющих. Но объявление массива объектов происходит так же:
Как видите, мы создаём не массив разных объектов, а массив объектов одного класса. И в начале, и в конце мы указываем название класса, а в квадратных скобках в конце — размер массива.
Какие ошибки делают чаще всего?
У массива объектов есть важная особенность — он включает в себя не объекты сами по себе со всеми их методами и переменными, а лишь ссылки на объекты.
И вот это может стать причиной ошибок. Смотрите, если, к примеру, у нас в массиве есть переменная int и мы не задали её значение, то она по умолчанию станет равна 0. Когда речь идёт про массив объектов — всё иначе. В таком массиве, как уже было сказано, хранятся ссылки на объекты, но пока объект не существует, ссылки тоже не могут существовать. Именно поэтому в массиве объектов по умолчанию хранится значение null. И если вы попытаетесь вызвать метод объекта, который не создан/не существует, получите распространённую ошибку NullPointerException. Это значит, что перед тем, как обращаться к объектам, их обязательно нужно сначала создать, то есть добавить объект в массив Java.
Перейдём к практике
Приступим к созданию массива объектов. Представьте, что у нас есть класс ObjMass и всё, что в нём есть, — это массив объектов Dog из трёх элементов:
Прекрасно. Но так как класс Dog мы раньше не описывали (интерпретатор Java знать не знает, что такое Dog и откуда его взять), то название объекта выделится красным. Исправим это, создав параллельно класс Dog:
Так, хорошо. Но зачем нам массив, состоящий из пустых объектов? Пусть у собак будут хотя бы клички:
Вот, теперь Dog имеет содержание.
Давайте сейчас обратимся к объектам, которые ещё не созданы, как говорится, расширим пример. Обратите ваше внимание, что у нас перед массивом объектов Dog находится модификатор static. Также добавим метод main:
class ObjMass < static Dog[] abc = new Dog [3]; public static void main (String[] args)< >> > class Dog < String name; public Dog (String name)< this.name = name; >>Для вывода массива на экран создаём цикл. И выводим не имена собак (abc[i].name), а объекты — abc[i]:
class ObjMass < static Dog[] abc = new Dog [3]; public static void main (String[] args)< for (int i = 0; i> > class Dog < String name; public Dog (String name)< this.name = name; >>И увидим следующий результат:
Это и есть значения по умолчанию, при ссылке на которые возникнет ошибка NullPointerException. Она появляется, когда мы ссылаемся на свойство null-ного объекта. К примеру, давайте попробуем вывести на экран имена собак (abc[i].name):
class ObjMass < static Dog[] abc = new Dog [3]; public static void main (String[] args)< for (int i = 0; i> > class Dog < String name; public Dog (String name)< this.name = name; >>Результатом станет тот самый NullPointerException. Чтобы этого не допустить, массив объектов надо заполнить:
class ObjMass < static Dog[] abc = new Dog [3]; public static void main (String[] args)< abc[0] = new Dog("Billy"); abc[1] = new Dog("Tom"); abc[2] = new Dog("Jonny"); for (int i = 0; i> > class Dog < String name; public Dog (String name)< this.name = name; >>Результат выполнения кода:
Вот и всё, теперь вы знакомы с особенностями применения массива объектов в Java и знаете, как добавить объект в массив. В прочих аспектах всё функционирует практически так же, как и в массивах примитивных типов.
Массив объектов в Java
Ранее на нашем сайте уже была размещена статья, посвященная массивам в Java. В ней мы рассказывали, что массив - это такой " контейнер ", который может вмещать в себя несколько однородных переменных.
У массивов есть несколько особенностей:
1. Они могут хранить переменные только одного типа ;
2. Размер массива нельзя поменять;
4. Элементы массивов имеют индексы, по которым к ним и обращаются в случае необходимости;
5. Номер первого элемента массива - 0 ;
6. Можно создавать пустые массивы, и "положить" в них элементы потом .
А вот что такое "массивы объектов" мы ранее не рассматривали. Давайте разберемся что к чему.
Массив объектов
По сути, у массивов объектов очень много общего с обычными массивами, только у них другая "начинка". Тем не менее, как Вы знаете, объекты гораздо "сложнее", чем переменные, потому что у них есть больше составляющих.
Массив объектов объявляется так же, как и массив переменных:
Как вы видите, у нас не массив разных объектов (стульев, столов и жевательных резинок). Это массив объектов одного класса (массив стульев, например).
Тут тоже все начинается и заканчивается названием класса , а в конце в квадратных скобках указывается размер массива:
Распространенная ошибка
Массив объектов отличается одной особенностью - они состоят из ссылок на объекты:
То есть в массиве не содержатся все переменные и методы каждого объекта, как Вы могли бы подумать, а только ссылки на эти самые объекты. Но тут возникает одна опасность. Обычно переменные в массивах имеют значения по умолчанию - если не задать, например, значение переменной int, то она по умолчанию будет равна 0 (больше информации про значения по умолчанию можно найти здесь).
В случает с объектами, происходит по-другому. В массиве должна храниться ссылка на объект, но пока объекта не существует, - ссылки на него тоже быть не может .
Поэтому, в массиве хранится значение по умолчанию null. Если Вы попробуете вызвать метод не созданного объекта, возникнет распространенная ошибка NullPointerException . Обязательно создайте свои объекты перед тем, как обращаться к ним! 😉
Пример
Давайте создадим массив объектов. Допустим, у нас есть класс - ObjMass, и все, что в нем хранится - это массив объектов Cat из 3 элементов: