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(inti=0;i<dogs.length;i++){dogs[i]=newDog();}
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?
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
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?
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
lucas_kriesel
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!