Я новичок в Java и в то время создал массив объектов в Java.
У меня есть класс А, например -
A[] arr = new A[4];
Но это только создание указателей (ссылок), A
а не 4 объектов. Это верно? Я вижу, что когда я пытаюсь получить доступ к функциям / переменным в созданных объектах, я получаю исключение нулевого указателя. Чтобы иметь возможность манипулировать / получать доступ к объектам, я должен был сделать это:
A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
arr[i] = new A();
}
Это правильно или я что-то не так делаю? Если это правильно, это действительно странно.
РЕДАКТИРОВАТЬ: я нахожу это странным, потому что в C ++ вы просто говорите новый, A[4]
и он создает четыре объекта.
Ответы:
Это верно.
... создает 4
A
ссылки, похожие на это:Теперь вы не можете обойтись
a1.someMethod()
без выделенияa1
следующим образом:Точно так же с массивом вам нужно сделать это:
... перед его использованием.
источник
new
ключевое слово Java также вызывает конструктор и выделяет память I. Я предполагаю, что в Javanew
создаются только ссылки, а не реальный объект по сравнению с C ++. Спасибо за ответ.new
создает объект массива. Это динамически размещаемые объекты («куча»). Таким образом, аналогичный код C ++ будетA **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }
.Это верно. Вы также можете сделать:
Этот синтаксис также можно использовать для создания и инициализации массива где угодно, например, в аргументе метода:
источник
Да, он создает только ссылки, для которых по умолчанию установлено значение null. Вот почему вы получаете NullPointerException. Вам нужно создавать объекты отдельно и назначать ссылку. Есть 3 шага для создания массивов в Java -
Итак, до тех пор, пока мы не создадим ссылки, они останутся нулевыми. Я надеюсь, что мой ответ помог вам ..! :)
Источник - Массивы в Java
источник
Вот ясный пример создания массива из 10 объектов сотрудника с конструктором, который принимает параметр:
источник
Ты прав. Помимо этого, если мы хотим создать массив определенного размера, заполненный элементами, предоставленными некоторой «фабрикой», начиная с Java 8 (которая представляет потоковый API ), мы можем использовать эту однострочную строку:
Stream.generate(() -> new A())
это как фабрика для отдельных элементов A, созданных способом, описанным lambda,() -> new A()
который является реализациейSupplier<A>
- он описывает, как должны создаваться каждый новый экземпляр A.limit(4)
устанавливает количество элементов, которые будет генерировать потокtoArray(A[]::new)
(также можно переписать какtoArray(size -> new A[size])
) - это позволяет нам решить / описать тип массива, который должен быть возвращен.Для некоторых примитивных типов , которые можно использовать
DoubleStream
,IntStream
,LongStream
которые дополнительно обеспечивают генераторы , какrange
rangeClosed
и некоторые другие.источник
Да, в Java правильно сделать несколько шагов, чтобы создать массив объектов:
Объявление, а затем создание экземпляра (создание памяти для хранения объектов «4»):
Инициализация объектов (в этом случае вы можете инициализировать 4 объекта класса A)
или
Теперь вы можете начать вызывать существующие методы из только что созданных объектов и т. Д.
Например:
или
источник
Для универсального класса необходимо создать класс-оболочку. Например:
приводит к: «Не удается создать универсальный массив»
Используйте вместо этого:
источник
Общая форма объявления нового массива в Java выглядит следующим образом:
type arrayName[] = new type[numberOfElements];
Где тип - это примитивный тип или объект.
numberOfElements
это количество элементов, которые вы будете хранить в массиве, и это значение не может быть изменено, поскольку Java не поддерживает динамические массивы (если вам нужна гибкая и динамическая структура для хранения объектов, вы можете использовать некоторые из коллекций Java).Давайте инициализируем массив для хранения зарплат всех сотрудников в небольшой компании из 5 человек:
int salaries[] = new int[5];
Тип массива (в данном случае
int
) применяется ко всем значениям в массиве. Вы не можете смешивать типы в одном массиве.Теперь, когда у нас инициализирован массив salaries, мы хотим добавить в него некоторые значения. Мы можем сделать это либо во время инициализации следующим образом:
int salaries[] = {50000, 75340, 110500, 98270, 39400};
Или сделать это позже, как это:
Более наглядный пример создания массива:
Чтобы узнать больше о массивах, ознакомьтесь с руководством .
источник