Crear una matriz de objetos en Java

Soy nuevo en Java y, por el momento, creé una matriz de objetos en Java.

Tengo una clase A por ejemplo –

A[] arr = new A[4]; 

Pero esto solo crea punteros (referencias) a A y no a 4 objetos. ¿Es esto correcto? Veo que cuando bash acceder a funciones / variables en los objetos creados obtengo una excepción de puntero nulo. Para poder manipular / acceder a los objetos, tuve que hacer esto:

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

¿Es correcto o estoy haciendo algo mal? Si esto es correcto, es realmente extraño.

EDITAR: Me parece extraño porque en C ++ simplemente dices A [4] y crea los cuatro objetos.

Esto es correcto.

 A[] a = new A[4]; 

crea referencias de 4 A, similar a hacer esto

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

ahora no podría hacer a1.someMethod () sin asignar a1 como

 a1 = new A(); 

de manera similar, con la matriz que necesita hacer

 a[0] = new A(); 

antes de usarlo

Esto es correcto. También puedes hacer:

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

Esta syntax también se puede usar para crear e inicializar una matriz en cualquier lugar, como en un argumento de método:

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

Sí, crea solo referencias, que se establecen en su valor predeterminado nulo. Es por eso que obtienes una NullPointerException. Necesitas crear objetos por separado y asignar la referencia. Hay 3 pasos para crear matrices en Java:

Declaración : en este paso, especificamos el tipo de datos y las dimensiones de la matriz que vamos a crear. Pero recuerde, aún no mencionamos los tamaños de las dimensiones. Se dejan vacíos.

Instanciación : en este paso, creamos la matriz o asignamos memoria para la matriz utilizando la nueva palabra clave. Es en este paso que mencionamos los tamaños de las dimensiones de la matriz.

Inicialización : la matriz siempre se inicializa con el valor predeterminado del tipo de datos. Pero podemos hacer nuestras propias inicializaciones.

Declarando matrices en Java

Así es como declaramos una matriz unidimensional en Java:

 int[] array; int array[]; 

Oracle recomienda que utilice la syntax anterior para declarar matrices. Aquí hay algunos otros ejemplos de declaraciones legales:

 // 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[]; 

Y estos son algunos ejemplos de declaraciones ilegales:

 int[5] intArray; // Don't mention size! double{} doubleArray; // Square Brackets please! 

Instanciación

Así es como “instanciamos”, o asignamos memoria para una matriz –

 int[] array = new int[5]; 

Cuando la JVM encuentra la new palabra clave, entiende que debe asignar memoria para algo. Y al especificar int[5] , queremos decir que queremos una matriz de int s, de tamaño 5. Entonces, la JVM crea la memoria y asigna la referencia de la memoria recién asignada a la matriz que una “referencia” de tipo int[]

Inicialización

Uso de un bucle – El uso de un bucle for para inicializar elementos de una matriz es la forma más común de hacer funcionar la matriz. No es necesario ejecutar un bucle for si va a asignar el valor predeterminado en sí mismo, porque JVM lo hace por usted.

Todo en uno..! – Podemos declarar, crear instancias e inicializar nuestra matriz de una vez. Aquí está la syntax:

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

Aquí, no mencionamos el tamaño, porque JVM puede ver que estamos dando 5 valores.

Entonces, hasta que instanciamos las referencias permanecen nulas. Espero que mi respuesta te haya ayudado..! 🙂

Fuente – Arrays en Java

Aquí está el claro ejemplo de crear una matriz de 10 objetos de empleado, con un constructor que toma el parámetro:

 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 

Estás en lo correcto. Aparte de eso, si queremos crear una matriz de tamaño específico llena de elementos proporcionados por alguna “fábrica”, desde Java 8 (que introduce la API de transmisión ) podemos usar esta línea única:

 A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new); 
  • Stream.generate(() -> new A()) es como fábrica para elementos A separados creados de una manera descrita por lambda, () -> new A() que es implementación del Supplier – describe cómo cada nuevo Se deben crear instancias.
  • limit(4) establece la cantidad de elementos que la secuencia generará
  • toArray(A[]::new) (también se puede reescribir como toArray(size -> new A[size]) ) – nos permite decidir / describir el tipo de matriz que debe devolverse.

Para algunos tipos primitivos, puede usar DoubleStream , IntStream , LongStream que además proporcionan generadores como range rangeClosed y algunos otros.

Sí, es correcto en Java, hay varios pasos para hacer una matriz de objetos:

  1. Declarar y luego instanciar (Crear memoria para almacenar objetos ‘4’):

     A[ ] arr = new A[4]; 
  2. Inicializando los objetos (en este caso puedes inicializar 4 objetos de la clase A)

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

    o

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

Ahora puede comenzar a llamar a los métodos existentes desde los objetos que acaba de crear, etc.

Por ejemplo:

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

o

  arr[1].setNumber(x); 

Para la clase genérica, es necesario crear una clase contenedora. Por ejemplo:

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

resultados en: “No se puede crear una matriz genérica”

Use en su lugar:

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