Dúvida com o for-each loop

6 respostas
L

Olá amigos! Eu estava fazendo uns testes com o For-Each loop e me deparei com uma questão:

É possível criar objetos do tipo que estou manipulando em uma array, dentro de um loop for-each, utilizando a sintaxe do Java 1.5 (sem iterator)?

Por exemplo:
Dog[] dogs = new Dog[5];

for(Dog dog : dogs) {
   dog = new Dog();
}
O QUE EU ESPERAVA: criar a referência para o objeto Dog em todas as posições do array. RESULTADO: todas as posições do meu array são igual a null. É mais ou menos o que faço aqui, em um for-each com iterator:
for(int i = 0; i < dogs.length ; i++) {
   dogs[i] = new Dog();
}
RESULTADO: todas as posições do meu array possuem referência para o objeto Dog.

Eu imaginava que cada variável dog que eu estivesse manipulando no primeiro loop equivaleria a um iterator, mas acho que me enganei. Alguém conseguiria me explicar por que o primeiro caso retornou null, ao invés dos cinco objetos Dogs?

Grato!

6 Respostas

ebortolatto

Porque no primeiro caso você só criou um objeto do tipo Dog[], mas não o preencheu com Dogs dentro.
No seu for each ele percorreu a sua estrutura (que está nula), por isso veio null.

brunorota

Porque repare bem, na verdade no loop for each você não acessa o array diretamente

Aquela variável dog ela recebe o valor do array, não é o array de Dog que você criou

Entendeu?

L

ebortolatto:
Porque no primeiro caso você só criou um objeto do tipo Dog[], mas não o preencheu com Dogs dentro.
No seu for each ele percorreu a sua estrutura (que está nula), por isso veio null.

Eu pensei nisso, mas no segundo loop eu também só criei o objeto, e nesse loop eu consegui percorrer a estrutura (até então nula, como no primeiro loop) e preencher os objetos. Essa diferença que não entendi.

brunorota:
Porque repare bem, na verdade no loop for each você não acessa o array diretamente

Aquela variável dog ela recebe o valor do array, não é o array de Dog que você criou

Entendeu?


Mas não é o mesmo caso do segundo loop?

brunorota

Não pois no segundo caso você está acessando o array direto

dog[i] = new Dog();

O foreach funciona mais ou menos assim

Dog d = dog[i];

Dog d tem a referência para um valor nulo de dog[]

Porém quando vc faz d = new Dog(); essa referência é perdida, e a variável Dog d passa a apontar para outro referência na memória.

ebortolatto

lucas_kriesel:
ebortolatto:
Porque no primeiro caso você só criou um objeto do tipo Dog[], mas não o preencheu com Dogs dentro.
No seu for each ele percorreu a sua estrutura (que está nula), por isso veio null.

Eu pensei nisso, mas no segundo loop eu também só criei o objeto, e nesse loop eu consegui percorrer a estrutura (até então nula, como no primeiro loop) e preencher os objetos. Essa diferença que não entendi.

brunorota:
Porque repare bem, na verdade no loop for each você não acessa o array diretamente

Aquela variável dog ela recebe o valor do array, não é o array de Dog que você criou

Entendeu?


Mas não é o mesmo caso do segundo loop?

Mas o que ocorre é que quando você faz Dog[] dog = new Dog[5] você já criou um objeto do tipo Dog[], ou seja, um objeto do tipo array.
Como todo array é um tipo de objeto, ele possui diversas propriedades, tais como length, que retorna o tamanho do array.
Neste caso você fez um loop for usando como critério o tamanho do seu objeto array, e não quantos Dogs existem dentro desse objeto.

L

Agora entendi melhor amigos, as duas explicações. Eu imaginava que estava “navegando” em propriedades iguais do array em ambos os loops, por isso achava que não haveria diferenças entre um e outro, mas vejo que não é bem assim. Muito obrigado!

Criado 4 de maio de 2011
Ultima resposta 4 de mai. de 2011
Respostas 6
Participantes 3