Criando uma matriz de objetos em Java

196

Eu sou novo em Java e, por enquanto, criei uma matriz de objetos em Java.

Eu tenho uma classe A, por exemplo -

A[] arr = new A[4];

Mas isso é apenas criar ponteiros (referências) para Ae não 4 objetos. Isso está correto? Vejo que, quando tento acessar funções / variáveis ​​nos objetos criados, recebo uma exceção de ponteiro nulo. Para poder manipular / acessar os objetos, tive que fazer isso:

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

Isso está correto ou estou fazendo algo errado? Se isso estiver correto, é realmente estranho.

Edição: Acho isso estranho, porque em C ++ você acabou de dizer novo A[4]e cria os quatro objetos.

user220201
fonte
17
Eu só queria dizer que essa era uma pergunta excepcionalmente útil; obrigado por perguntar.
Pandorym

Respostas:

262

Isto está certo.

A[] a = new A[4];

... cria 4 Areferências, semelhante a fazer isso:

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

Agora você não poderia fazer a1.someMethod()sem alocar a1assim:

a1 = new A();

Da mesma forma, com a matriz, você precisa fazer isso:

a[0] = new A();

... antes de usá-lo.

MeBigFatGuy
fonte
10
Essa resposta me salvou de um monte de confusão, obrigado por sua existência.
Pandorym
1
Eu também tinha essa confusão, já que sou do C ++ e sempre presumi que, como no C ++, a newpalavra-chave Java também chama o construtor e aloca a memória I. Eu acho que em Java newapenas cria as referências, não o objeto real, em comparação com o C ++. Obrigado pela resposta.
Krishna Oza
1
@Krishna_Oza, não há diferença em C ++ aqui. O primeiro newcria um objeto de matriz. Esses são objetos alocados dinamicamente ("heap"). Portanto, o código C ++ análogo seria A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov 03/04
1
Eu entendo que o novo cria referências, mas por que não inicializar também os construtores para cada elemento da matriz como em C ++. Isso pode ser bobo, mas quero perguntar, qualquer problema que teríamos, se fizermos isso? @MeBigFatGuy
Jasser
2
@Jasser - que construtor para os elementos você chamaria? E se o único construtor de elementos receber vários argumentos? Como você criaria esses objetos?
MeBigFatGuy
77

Isto está certo. Você também pode fazer:

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

Essa sintaxe também pode ser usada para criar e inicializar uma matriz em qualquer lugar, como em um argumento de método:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
Steve B.
fonte
34

Sim, ele cria apenas referências, que são definidas com seu valor padrão nulo. É por isso que você recebe uma NullPointerException. Você precisa criar objetos separadamente e atribuir a referência. Existem 3 etapas para criar matrizes em Java -

Declaração - Nesta etapa, especificamos o tipo de dados e as dimensões da matriz que vamos criar. Mas lembre-se, ainda não mencionamos os tamanhos das dimensões. Eles são deixados em branco.

Instanciação - Nesta etapa, criamos a matriz ou alocamos memória para a matriz, usando a nova palavra-chave. É nesta etapa que mencionamos os tamanhos das dimensões da matriz.

Inicialização - A matriz é sempre inicializada com o valor padrão do tipo de dados. Mas podemos fazer nossas próprias inicializações.

Declarando matrizes em Java

É assim que declaramos uma matriz unidimensional em Java -

int[] array;
int array[];

A Oracle recomenda que você use a sintaxe anterior para declarar matrizes. Aqui estão alguns outros exemplos de declarações legais -

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

E estes são alguns exemplos de declarações ilegais -

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

Instanciação

É assim que "instanciamos" ou alocamos memória para uma matriz -

int[] array = new int[5];

Quando a JVM encontra a newpalavra-chave, entende que deve alocar memória para alguma coisa. E, especificando int[5], queremos dizer que queremos uma matriz de ints, tamanho 5. Portanto, a JVM cria a memória e atribui a referência da memória recém-alocada à matriz à qual uma “referência” do tipoint[]

Inicialização

Usando um loop - Usar um loop for para inicializar elementos de uma matriz é a maneira mais comum de fazer a matriz funcionar. Não há necessidade de executar um loop for se você deseja atribuir o próprio valor padrão, porque a JVM faz isso por você.

Tudo em um..! - Podemos declarar, instanciar e inicializar nossa matriz de uma só vez. Aqui está a sintaxe -

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

Aqui, não mencionamos o tamanho, porque a JVM pode ver que estamos fornecendo 5 valores.

Assim, até instanciarmos as referências permanecem nulas. Espero que minha resposta tenha ajudado ..! :)

Fonte - Matrizes em Java

Vamsi Sangam
fonte
5

Aqui está um exemplo claro de criação de matriz de 10 objetos de funcionário, com um construtor que aceita o 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<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);
    }
}
user1923551
fonte
3

Você está certo. Além disso, se quisermos criar uma matriz de tamanho específico preenchida com elementos fornecidos por alguma "fábrica", desde o Java 8 (que introduz a API de fluxo ), podemos usar esta linha:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())é como fábrica para elementos A separados, criados da maneira descrita por lambda, () -> new A()que é a implementação de Supplier<A>- descreve como cada nova instância A deve ser criada.
  • limit(4)define a quantidade de elementos que o fluxo gerará
  • toArray(A[]::new)(também pode ser reescrito como toArray(size -> new A[size])) - permite decidir / descrever o tipo de array que deve ser retornado.

Para alguns tipos primitivos que você pode usar DoubleStream, IntStream, LongStreamque, adicionalmente, fornecer geradores como range rangeClosede alguns outros.

Pshemo
fonte
0

Sim, está correto em Java, existem várias etapas para criar uma matriz de objetos:

  1. Declarando e instanciando (crie memória para armazenar objetos '4'):

    A[ ] arr = new A[4];
  2. Inicializando os objetos (neste caso, você pode inicializar 4 objetos da classe A)

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

    ou

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

Agora você pode começar a chamar métodos existentes a partir dos objetos que acabou de criar, etc.

Por exemplo:

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

ou

  arr[1].setNumber(x);
Jeremy Levett
fonte
0

Para classe genérica, é necessário criar uma classe de wrapper. Por exemplo:

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

resulta em: "Não é possível criar uma matriz genérica"

Use em vez disso:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  
SzB
fonte
Essa linha significa que você está tentando criar uma matriz de conjuntos, onde o tipo de conjunto é String?
sofs1
0

A forma genaral para declarar uma nova matriz em java é a seguinte:

type arrayName[] = new type[numberOfElements];

Onde type é um tipo primitivo ou Objeto. numberOfElementsé o número de elementos que você armazenará na matriz e esse valor não pode ser alterado porque o Java não suporta matrizes dinâmicas (se você precisar de uma estrutura flexível e dinâmica para armazenar objetos, poderá usar algumas das coleções Java).

Permite inicializar uma matriz para armazenar os salários de todos os funcionários em uma pequena empresa de 5 pessoas:

int salaries[] = new int[5];

O tipo da matriz (neste caso int) se aplica a todos os valores na matriz. Você não pode misturar tipos em uma matriz.

Agora que temos nossa matriz de salários inicializada, queremos colocar alguns valores nela. Podemos fazer isso durante a inicialização assim:

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

Ou para fazer isso em um momento posterior como este:

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

Exemplo mais visual de criação de array: insira a descrição da imagem aqui

Para saber mais sobre matrizes, consulte o guia .

Johnny
fonte