Enhanced for

[code]public class Casa
{
Porta[] portas = new Porta[10];
int totalDePortas = 0;

void adicionaPorta()
{
portas[this.totalDePortas++] = new Porta();
}

int metodoBla
{
for(int i : this.portas)
{
System.out.println(“Olá”);
}
}
}[/code]

Tá dando erro nesse this.portas…
Onde to errando?

Java != Javascript (onde o foreach fornece um índice, não um valor).

O correto é:

       for(Porta p : this.portas)  
       {  
          System.out.println("Olá");  
       }  

Voce tá usando alguma IDE pra programar? Se não, recomendo usar…

Algumas correções:

[code]public class Casa
{
Porta[] portas = new Porta[10];
int totalDePortas = 0;

void adicionaPorta()
{
portas[this.totalDePortas++] = new Porta();
}

// seu metodo retorna um int? nao… mudei pra void
// e como eh um metodo, deve ter parenteses ()
void metodoBla()
{
// this.portas nao eh um array de int, o correto seria isso:
// (para cada Porta ‘i’ no array de Porta this.portas)
for(Porta i : this.portas)
{
System.out.println(“Olá”);
}
}
}[/code]

No caso o for percorrerá todo o array ou somente as posições inicializadas?

Todo o array - ele não checa se uma posição é inicializada ou não.

Eu tenho que saber quantos índices eu quero antes de inicializá-los?

Todas… veja um teste:

[code]public class Casa {
Porta[] portas = new Porta[10];
int totalDePortas = 0;

public Casa(){
	metodoBla();
}

void adicionaPorta() {
	portas[this.totalDePortas++] = new Porta();
}

void metodoBla() {
	portas[0] = new Porta();
	portas[3] = new Porta();
	portas[6] = new Porta();
	for (Porta i : this.portas) {
		System.out.println(i);
	}
}

public static void main(String[] args) {
	new Casa();
}

}[/code]

O resultado:

tests.Porta@42e816 null null tests.Porta@9304b1 null null tests.Porta@190d11 null null null

Mas tipo…

Eu tenho q reservar essas 10 portas antes de saber de quantas portas eu vou precisar?
Não tem como ir reservando à medida q for sendo preciso inicializá-las?

No caso do array, sim… por isso se usa listas, interface List, é bem mais prático que arrays…

[quote=cake]Eu tenho q reservar essas 10 portas antes de saber de quantas portas eu vou precisar?
Não tem como ir reservando à medida q for sendo preciso inicializá-las?[/quote]

Infelizmente arrays não te dão a opção de alocação dinâmica… ele começa e termina com um tamanho fixo… use listas, elas são a sua salvação!

// crie a lista List<Porta> portas = new ArrayList<Porta>(); // adicione novos objetos Porta, dessa maneira: portas.add(new Porta()); //ou dessa: Porta porta = new Porta(); portas.add(porta);

Tem como me explicar exatamente como funciona esse enhanced for?
Digo… passo a passo se não for pedir muito… ^^’

[quote=cake]Tem como me explicar exatamente como funciona esse enhanced for?
Digo… passo a passo se não for pedir muito… ^^’[/quote]

Basta entender a maneira de se “ler” esse tipo de ‘for’… a sintaxe é essa:

[code]// dada uma Collection c

List c = new ArrayList();
for (Object o : c){
// faz algo
}[/code]

O que temos ai em cima, se lê assim:
“Para cada Object, na Collection(lista) de Object’s c, crie uma variavel chamada o

Seria praticamente a mesma coisa se você fizesse isso:

[code]// dada uma Collection c

List c = new ArrayList();
for (int i = 0; i < c.size(); i++){
Object o = (Object)c.get(i);
// faz algo
}[/code]

Fica feio né?