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 A
e 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.
Respostas:
Isto está certo.
... cria 4
A
referências, semelhante a fazer isso:Agora você não poderia fazer
a1.someMethod()
sem alocara1
assim:Da mesma forma, com a matriz, você precisa fazer isso:
... antes de usá-lo.
fonte
new
palavra-chave Java também chama o construtor e aloca a memória I. Eu acho que em Javanew
apenas cria as referências, não o objeto real, em comparação com o C ++. Obrigado pela resposta.new
cria um objeto de matriz. Esses são objetos alocados dinamicamente ("heap"). Portanto, o código C ++ análogo seriaA **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }
.Isto está certo. Você também pode fazer:
Essa sintaxe também pode ser usada para criar e inicializar uma matriz em qualquer lugar, como em um argumento de método:
fonte
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 -
Assim, até instanciarmos as referências permanecem nulas. Espero que minha resposta tenha ajudado ..! :)
Fonte - Matrizes em Java
fonte
Aqui está um exemplo claro de criação de matriz de 10 objetos de funcionário, com um construtor que aceita o parâmetro:
fonte
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:
Stream.generate(() -> new A())
é como fábrica para elementos A separados, criados da maneira descrita por lambda,() -> new A()
que é a implementação deSupplier<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 comotoArray(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
,LongStream
que, adicionalmente, fornecer geradores comorange
rangeClosed
e alguns outros.fonte
Sim, está correto em Java, existem várias etapas para criar uma matriz de objetos:
Declarando e instanciando (crie memória para armazenar objetos '4'):
Inicializando os objetos (neste caso, você pode inicializar 4 objetos da classe A)
ou
Agora você pode começar a chamar métodos existentes a partir dos objetos que acabou de criar, etc.
Por exemplo:
ou
fonte
Para classe genérica, é necessário criar uma classe de wrapper. Por exemplo:
resulta em: "Não é possível criar uma matriz genérica"
Use em vez disso:
fonte
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:
Exemplo mais visual de criação de array:
Para saber mais sobre matrizes, consulte o guia .
fonte