Создание массива объектов в Java

Я новичок в Java и за время создал массив объектов на Java.

У меня есть класс A, например -

A[] arr = new A[4];

Но это только создает указатели (ссылки) на A, а не на 4 объекта. Это верно? Я вижу, что, когда я пытаюсь получить доступ к функциям/переменным в создаваемых объектах, я получаю исключение с нулевым указателем. Чтобы иметь возможность манипулировать/получать доступ к объектам, которые я должен был сделать, -

A[] arr = new A[4];
for( int i=0; i<4; i++ )
    arr[i] = new A();

Является ли это правильным или я делаю что-то неправильно? Если это правильно, это действительно странно.

EDIT: Я нахожу это странным, потому что на С++ вы просто говорите новый A [4] и он создает четыре объекта.

Ответ 1

Это правильно.

A[] a = new A[4];

создает 4 ссылки, похожие на это

A a1;
A a2;
A a3;
A a4;

теперь вы не можете сделать a1.someMethod() без выделения a1 как

a1 = new A();

аналогично, с массивом, который вам нужно сделать

a[0] = new A();

прежде чем использовать его.

Ответ 2

Это верно. Вы также можете сделать:

A[] a = new A[] { new A("args"), new A("other args"), .. };

Этот синтаксис также можно использовать для создания и инициализации массива в любом месте, например, в аргументе метода:

someMethod( new A[] { new A("args"), new A("other args"), . . } )

Ответ 3

Да, он создает только ссылки, для которых установлено значение по умолчанию null. Вот почему вы получаете исключение NullPointerException. Вам нужно создавать объекты отдельно и назначать ссылку. Существует 3 шага для создания массивов в Java -

Декларация. На этом шаге мы укажем тип данных и размеры массива, которые мы собираемся создать. Но помните, мы пока не упоминаем размеры размеров. Они оставлены пустыми.

Instantiation. На этом этапе мы создаем массив или выделяем память для массива с использованием нового ключевого слова. На этом этапе мы указываем размеры размеров массива.

Инициализация. Массив всегда инициализируется значением по умолчанию для типов данных. Но мы можем сделать свои собственные инициализации.

Объявление массивов в Java

Так мы объявляем одномерный массив в Java -

int[] array;
int array[];

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!

Инстанцирование

Вот как мы "создаем экземпляр" или выделяем память для массива -

int[] array = new int[5];

Когда JVM встречает ключевое слово new, он понимает, что он должен выделять память для чего-то. И, указав int[5], мы подразумеваем, что нам нужен массив int s, размер 5. Таким образом, JVM создает память и присваивает ссылку вновь выделенной памяти массиву, который является "ссылкой" типа int[]

Инициализация

Использование цикла. Использование цикла for для инициализации элементов массива является наиболее распространенным способом получения массива. Нет необходимости запускать цикл for, если вы собираетесь назначить значение по умолчанию, потому что JVM делает это за вас.

Все в одном..!. Мы можем объявить, создать и инициализировать наш массив за один раз. Heres синтаксис -

int[] arr = {1, 2, 3, 4, 5};

Здесь мы не упоминаем размер, потому что JVM может видеть, что мы даем 5 значений.

Итак, до тех пор, пока мы не создадим экземпляр, ссылки остаются пустыми. Надеюсь, мой ответ помог вам...!:)

Источник - Массивы в Java

Ответ 4

Вот явный пример создания массива из 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<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}

Ответ 5

Ты прав. Помимо этого, если мы хотим создать массив определенного размера, заполненный элементами, предоставленными некоторыми "фабриками", поскольку Java 8 (который вводит поток API), мы можем использовать этот однострочный интерфейс:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() → new A()) похож на фабрику для отдельных элементов A, созданных способом, описанным lambda, () → new A() который является реализацией Supplier<A> - он описывает, как каждый новый Необходимо создать экземпляры.
  • limit(4) устанавливает количество элементов, которые будут генерироваться потоком
  • toArray(A[]::new) (также может быть переписан как toArray(size → new A[size])) - он позволяет нам определять/описывать тип массива, который должен быть возвращен.

Для некоторых примитивных типов вы можете использовать DoubleStream, IntStream, LongStream, которые дополнительно обеспечивают генераторы, такие как range rangeClosed и несколько других.

Ответ 6

Да, правильно в Java существует несколько шагов для создания массива объектов:

  • Объявление и последующее создание (создание памяти для хранения объектов "4" ):

    A[ ] arr = new A[4];
    
  • Инициализация объектов (в этом случае вы можете инициализировать 4 объекта класса A)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();
    

    или

    for( int i=0; i<4; i++ )
      arr[i] = new A();
    

Теперь вы можете начать вызов существующих методов из объектов, которые вы только что создали, и т.д.

Например:

  int x = arr[1].getNumber();

или

  arr[1].setNumber(x);

Ответ 7

Для универсального класса необходимо создать класс-оболочку. Например:

Set<String>[] sets = new HashSet<>[10]

приводит к: "Невозможно создать общий массив"

Используйте вместо этого:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  

Ответ 8

Общая форма объявления нового массива в Java выглядит следующим образом:

type arrayName[] = new type[numberOfElements];

Где тип - это примитивный тип или объект. numberOfElements - это количество элементов, которые вы будете хранить в массиве, и это значение не может быть изменено, поскольку Java не поддерживает динамические массивы (если вам нужна гибкая и динамическая структура для хранения объектов, вы можете захотеть использовать некоторые из коллекций Java).

Позволяет инициализировать массив для хранения зарплат всех сотрудников в небольшой компании из 5 человек:

int salaries[] = new int[5];

Тип массива (в данном случае int) применяется ко всем значениям в массиве. Вы не можете смешивать типы в одном массиве.

Теперь, когда у нас инициализирован массив salaries, мы хотим добавить в него некоторые значения. Мы можем сделать это либо во время инициализации следующим образом:

int salaries[] = {50000, 75340, 110500, 98270, 39400};

Или сделать это позже, как это:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

Более наглядный пример создания массива: enter image description here

Чтобы узнать больше о массивах, ознакомьтесь с руководством.