Crear una matriz de objetos en Java


196

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 está creando punteros (referencias) Ay no 4 objetos. ¿Es esto correcto? Veo que cuando intento 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: Encuentro esto extraño porque en C ++ solo dices nuevo A[4]y crea los cuatro objetos.


17
Solo quería decir que esta era una pregunta excepcionalmente útil; Gracias por preguntar.
pandorym

Respuestas:


262

Esto es correcto.

A[] a = new A[4];

... crea 4 Areferencias, similar a hacer esto:

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

Ahora no podría a1.someMethod()prescindir de asignar a1así:

a1 = new A();

Del mismo modo, con la matriz necesita hacer esto:

a[0] = new A();

... antes de usarlo.


10
Esta respuesta me salvó un montón de confusión, gracias por su existencia.
pandorym

1
También tuve esta confusión, ya que soy de C ++, siempre asumí que, como en C ++, la newpalabra clave de Java también llama al constructor y asigna la memoria I. Supongo que en Java newsolo crea las referencias, no el objeto real en comparación con C ++. Gracias por responder.
Krishna Oza

1
@ Krishna_Oza, no hay diferencia de C ++ aquí. El primero newcrea un objeto de matriz. Estos son objetos asignados dinámicamente ("montón"). Entonces el código análogo de C ++ sería A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov

1
Entiendo que las nuevas crea referencias, pero ¿por qué no también inicializar los constructores para cada elemento de la matriz como en C ++? Esto puede ser una tontería, pero quiero preguntar, ¿cualquier problema que tendríamos si lo hacemos? @MeBigFatGuy
Jasser

2
@Jasser: ¿a qué constructor de los elementos llamarías? ¿Qué pasa si el único constructor de elementos toma un montón de argumentos? ¿Cómo crearías esos objetos?
MeBigFatGuy

77

Esto es correcto. También puedes hacer:

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

Esta sintaxis 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"), . . } )

34

Sí, solo crea 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, todavía no mencionamos los tamaños de las dimensiones. Se dejan vacíos.

Creación de instancias : 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.

Declarar matrices en Java

Así es como declaramos una matriz unidimensional en Java:

int[] array;
int array[];

Oracle recomienda que utilice la sintaxis anterior para declarar matrices. Aquí hay 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 newpalabra clave, comprende que debe asignar memoria para algo. Y al especificar int[5], queremos decir que queremos una matriz de ints, de tamaño 5. Entonces, la JVM crea la memoria y asigna la referencia de la memoria recién asignada a la matriz que es una "referencia" de tipoint[]

Inicialización

Uso de un bucle : usar un bucle for para inicializar elementos de una matriz es la forma más común de poner en marcha 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, instanciar e inicializar nuestra matriz de una vez. Aquí está la sintaxis:

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 creemos una instancia, las referencias permanecerán nulas. Espero que mi respuesta te haya ayudado..! :)

Fuente: matrices en Java


5

Aquí está el claro ejemplo de cómo crear una matriz de 10 objetos de empleados, con un constructor que toma parámetros:

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);
    }
}

3

Estás en lo correcto. Aparte de eso, si queremos crear una matriz de tamaño específico lleno de elementos proporcionados por alguna "fábrica", desde Java 8 (que introduce la API de flujo ) podemos usar esta línea:

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

Para algunos tipos primitivos se pueden utilizar DoubleStream, IntStream, LongStreamque además proporcionan generadores como range rangeClosedy algunos otros.


0

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

  1. Declarar y luego crear instancias (Crear memoria para almacenar objetos '4'):

    A[ ] arr = new A[4];
  2. Inicializando los objetos (en este caso puede 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 hacer, etc.

Por ejemplo:

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

o

  arr[1].setNumber(x);

0

Para la clase genérica es necesario crear una clase de contenedor. Por ejemplo:

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

da como resultado: "No se puede crear una matriz genérica"

Use en su lugar:

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

¿Significa esta línea que está intentando crear una matriz de Conjuntos, donde el tipo de Conjunto es Cadena?
sofs1

0

La forma genaral para declarar una nueva matriz en java es la siguiente:

type arrayName[] = new type[numberOfElements];

Donde type es un tipo u objeto primitivo. numberOfElementses la cantidad de elementos que almacenará en la matriz y este valor no puede cambiar porque Java no admite matrices dinámicas (si necesita una estructura flexible y dinámica para contener objetos, puede utilizar algunas de las colecciones de Java).

Inicialicemos una matriz para almacenar los salarios de todos los empleados en una pequeña empresa de 5 personas:

int salaries[] = new int[5];

El tipo de matriz (en este caso int ) se aplica a todos los valores de la matriz. No puede mezclar tipos en una matriz.

Ahora que tenemos nuestra matriz de salarios inicializada, queremos ponerle algunos valores. Podemos hacer esto durante la inicialización así:

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

O para hacerlo en un momento posterior como este:

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

Más ejemplo visual de creación de matriz: ingrese la descripción de la imagen aquí

Para obtener más información sobre las matrices, consulte la guía .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.