A declaração for
Agora que você pode construir aplicativos com instruções simples while e do-while, podemos expandir nossa discussão de loops para uma estrutura de controle de repetição mais complexa chamada loop for.
A partir do Java 5.0, existem dois tipos de declarações for. O primeiro é referido como o básico loop for, e o segundo é freqüentemente chamado de loop for aprimorado . Para maior clareza, vamos consultar o loop for aprimorado como a instrução for-each em todo o livro.
O declaração básica do for
Um loop básico tem a mesma expressão e instrução booleana condicional , ou bloco de declarações, como os outros loops que você viu, bem como duas novas seções: um bloco de inicialização e uma declaração de atualização. A figura 2.7 mostra como esses componentes são dispostos.
Embora a Figura 2.7 possa parecer um pouco confusa e quase arbitrária a princípio, a integração dos componentes e do fluxo nos permite criar declarações extremamente poderosas em uma quantidade muito pequena de espaço que de outra forma levaria várias linhas com um padrão, do loop while. Observe que cada seção é separada por um ponto-e-vírgula. A inicialização e atualização das instruções podem conter várias instruções, separadas por vírgulas.
Variáveis declaradas no bloco de inicialização de um loop for têm escopo e são acessíveis apenas dentro do loop for. Desconfie de qualquer questão do exame em que a variáveis declaradas dentro do bloco de inicialização de um for está disponível fora do loop. Alternativamente, variáveis declaradas antes do loop for e atribuídas um valor na inicialização do bloco de informação pode ser usado fora do loop for, porque seu escopo precede a criação do loop for.
Vamos dar uma olhada em um exemplo que imprime os números de 0 a 9 :
for(int i = 0; i < 10; i++) {
System.out.print(i + " ");
}
A variável local i é inicializada primeiro com 0 . A variável i está apenas no escopo da duração do loop e não está disponível fora do loop depois que o loop for concluído. Como um loop while, a condição booleana é avaliada em cada iteração do loop antes do loop executar. Como retorna true, o loop é executado e gera o 0 seguido de um espaço. Em seguida, o loop executa a seção de atualização, que neste caso aumenta o valor de i para 1 . O loop então avalia a expressão booleana uma segunda vez, e o processo repete várias vezes, imprimindo:
0 1 2 3 4 5 6 7 8 9
Na 10ª iteração do loop, o valor de i atinge 9 e é incrementado em 1 chegando em 10 . Na 11ª iteração do loop, a expressão booleana é avaliada e (10 < 10) retorna falso , o loop termina sem executar o corpo do loop de instruções.
Embora a maioria dos loops que você provavelmente encontrará na prática seja bem definida e semelhante ao exemplo anterior, há muitas variações e casos de borda que você poderia ver no exame. Você deve se familiarizar com os cinco exemplos a seguir: variações destes podem ser vistas no exame.
Vamos abordar alguns exemplos para fins ilustrativos:
1. Criando um Loop Infinito
for( ; ; ) {
System.out.println("Hello World");
}
Embora este loop for pareça que irá lançar um erro do compilador, ele irá de fato compilar e executar sem problema. Na verdade, é um loop infinito que irá imprimir a mesma declaração repetidamente. Este exemplo reforça o fato de que os componentes do loop for são cada um opcional. Observe que os pontos-e-vírgulas que separam as três seções são necessários, como for (;) e for() não irá compilar.
2. Adicionando vários termos à declaração for
int x = 0;
for(long y = 0, z = 4; x < 5 && y < 10; x++, y++) {
System.out.print(y + " ");
}
System.out.print(x);
Este código demonstra três variações do loop for que você pode não ter visto. Primeiro você pode declarar uma variável, como x neste exemplo, antes de iniciar o loop e usá-lo depois. Segundo, seu bloco de inicialização, expressão booleana e instruções de atualização pode incluir variáveis extras que podem não se referenciar. Por exemplo, z é definido no bloco de inicialização e nunca é usado. Finalmente, a instrução de atualização pode modificar várias variáveis. Este código irá imprimir o seguinte:
0 1 2 3 4
Tenha este exemplo em mente quando olharmos para os próximos três exemplos, nenhum irá compilar.
3. Redeclarando uma Variável no Bloco de Inicialização
int x = 0;
for(long y = 0, x = 4; x < 5 && y < 10; x++, y++) { // DOES NOT COMPILE
System.out.print(x + " ");
}
Este exemplo é semelhante ao anterior, mas não é compilado por causa da bloco de inicialização. A diferença é que x é repetido no bloco de inicialização depois de já ser declarado antes do loop, resultando na parada do compilador devido a uma declaração duplicada da variável. Podemos corrigir esse loop alterando a declaração de x e y da seguinte forma:
int x = 0;
long y = 10;
for(y = 0, x = 4; x < 5 && y < 10; x++, y++) {
System.out.print(x + " ");
}
Note que esta variação será agora compilada porque o bloco de inicialização simplesmente atribui um valor para x e não o declara.
4. Usando tipos de dados incompatíveis no bloco de inicialização
for(long y = 0, int x = 4; x < 5 && y<10; x++, y++) { // DOES NOT COMPILE
System.out.print(x + " ");
}
Este exemplo também se parece muito com o nosso segundo exemplo, mas como o terceiro exemplo não compila, embora desta vez por um motivo diferente. As variáveis no bloco de inicialização todos devem ser do mesmo tipo. No primeiro exemplo, y e z ambos são long, de modo que o código está livre de problemas, mas neste exemplo eles têm tipos diferentes, portanto o código não será compilado.
5. Usando Variáveis de Loop Fora do Loop
for(long y = 0, x = 4; x < 5 && y < 10; x++, y++) {
System.out.print(y + " ");
}
System.out.print(x); // DOES NOT COMPILE
A variação final do segundo exemplo não será compilada por um motivo diferente do exemplos anteriores. Se você notar, x é definido no bloco de inicialização do loop e então usado depois que o loop termina. Desde x têm escopo apenas para o loop, usando-o fora do loop lançará um erro do compilador.