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:[code]Dog[] dogs = new Dog[5];
for(Dog dog : dogs) {
dog = new Dog();
}[/code]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!
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.
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?
[quote=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.
[/quote]
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.
[quote=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?[/quote]
Mas não é o mesmo caso do segundo loop?
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.
[quote=lucas_kriesel][quote=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.
[/quote]
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.
[quote=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?[/quote]
Mas não é o mesmo caso do segundo loop?[/quote]
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.
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!