"Péssima ideia a de que não se pode mudar." -- Montaigne Aprenderemos a trabalhar com os seguintes recursos da linguagem Java:
Dentro de um bloco, podemos declarar variáveis e usá-las. Em Java, toda variável tem um tipo que não pode ser mudado uma vez declarado: tipoDaVariavel nomeDaVariavel;Por exemplo, é possível ter uma idade que guarda um número inteiro: int idade;Com isso, você declara a variável idade, que passa a existir a partir daquela linha. Ela é do tipo int que guarda um número inteiro. A partir daí, você pode usá-la, primeiramente, atribuindo valores. A linha a seguir é a tradução de: "idade deve valer quinze". idade =15 ;
Além de atribuir, você pode utilizar esse valor. O código a seguir declara novamente a variável idade com valor 15 e o imprime na saída padrão por meio da chamada System.out.println. int idade; idade =15 ; System.out.println(idade);Por fim, podemos utilizar o valor de uma variável para algum outro propósito, como alterar ou definir uma segunda variável. O código a seguir cria uma variável chamada idadeNoAnoQueVem com valor de idade mais um. int idadeNoAnoQueVem; idadeNoAnoQueVem = idade +1 ;No mesmo momento em que você declara uma variável, também é possível inicializá-la por praticidade: int idade =15 ;Você pode usar os operadores +, -, / e * para operar com números, sendo eles responsáveis pela adição, subtração, divisão e multiplicação, respectivamente. Além desses operadores básicos, há o operador % (módulo), que é o resto de uma divisão inteira. Veja alguns exemplos: int quatro =2 +2 ;int tres =5 -2 ;int oito =4 *2 ;int dezesseis =64 /4 ;int um =5 %2 ;
Representar números inteiros é fácil, mas como guardar valores reais, tais como frações de números inteiros e outros? Outro tipo de variável muito utilizado é o double, que armazena um número com ponto flutuante (e que também pode armazenar um número inteiro). double pi =3.14 ;double x =5 *10 ;O tipo boolean armazena um valor verdadeiro ou falso: nada de números, palavras ou endereços como em algumas outras linguagens. boolean verdade =true ;As palavras true e false são reservadas ao Java. É comum que um boolean seja determinado por meio de uma expressão booleana. Isto é, um trecho de código que retorna um booleano, como o exemplo: int idade =30 ;boolean menorDeIdade = idade <18 ;O tipo char guarda um, e apenas um, caractere. Este deve estar entre aspas simples. Não se esqueça dessas duas características de uma variável do tipo char. Por exemplo, ela não pode guardar um código como '', pois o vazio não é um caractere! char letra ='a' ; System.out.println(letra);Variáveis do tipo char são pouco usadas no dia a dia. Veremos, mais à frente, o uso das Strings que usamos constantemente. Porém, estas não são definidas por um tipo primitivo. Esses tipos de variáveis são tipos primitivos do Java: o valor que elas guardam são o real conteúdo da variável. Quando você utilizar o operador de atribuição =, o valor será copiado. int 5 ;int j = i; i = i +1 ;Aqui, o i fica com o valor de 6. Mas, e j? Na segunda linha, j está valendo 5. Quando i passa a valer 6, será que j também muda de valor? Não, pois o valor de um tipo primitivo sempre é copiado. Apesar de a linha 2 fazer j = i, a partir desse momento, essas variáveis não têm relação nenhuma: o que acontece com uma não reflete em nada na outra.
Discuta com o instrutor e seus colegas sobre convenções de código Java. Por que existem? Por que são importantes? Discuta também as vantagens de se escrever código fácil de ler e se evitar comentários em excesso (dica: procure por java code conventions). Alguns valores são incompatíveis se você tentar fazer uma atribuição direta. Enquanto um número real costuma ser representado em uma variável do tipo double, tentar atribui-lo a uma variável int não funciona, porque é um código que diz: "i deve valer d", mas não se sabe se d realmente é um número inteiro ou não. double d =3.1415 ;int i = d;A mesma coisa ocorre no seguinte trecho: int i =3.14 ;O mais interessante é que nem mesmo o seguinte código compila: double d =5 ;int i = d;Apesar de 5 ser um bom valor para um int, o compilador não tem como saber qual valor estará dentro desse double no momento da execução. Esse valor pode ter sido digitado pelo usuário, e ninguém garantirá que essa conversão ocorra sem perda de valores. Já no caso a seguir é o contrário: int i =5 ;double d2 = i;O código acima compila sem problemas, uma vez que um double pode guardar um número com ou sem ponto flutuante. Todos os inteiros representados por uma variável do tipo int podem ser guardados em uma variável double, então não existem problemas no código acima. Às vezes, precisamos que um número quebrado seja arredondado e armazenado em um número inteiro. Para fazer isso sem que haja o erro de compilação, é preciso ordenar que o número quebrado seja moldado (casted) como um número inteiro. Esse processo recebe o nome de casting. double d3 =3.14 ;int i = (int ) d3;O casting foi feito para moldar a variável d3 como um int. O valor de i agora é 3. O mesmo caso ocorre entre valores int e long. long x =10000 ;int i = x;E se quisermos realmente fazer isso, fazemos o casting: long x =10000 ;int i = (int ) x;
No Java, a sintaxe do if é a seguinte: if (condicaoBooleana) { codigo; }Uma condição booleana é qualquer expressão que retorne true ou false. Para isso, você pode usar os operadores <, >, <=, >= e outros. Um exemplo: int idade =15 ;if (idade <18 ) { System.out.println("Não pode entrar" ); }Além disso, você pode usar a cláusula else para indicar o comportamento que deve ser executado no caso da expressão booleana ser falsa: int idade =15 ;if (idade <18 ) { System.out.println("Não pode entrar" ); }else { System.out.println("Pode entrar" ); }Você pode concatenar expressões booleanas por meio dos operadores lógicos "E" e "OU". O "E" é representado pelo &&, e o "OU" é representado pelo ||. Um exemplo seria verificar se ele tem menos de 18 anos e se não é amigo do dono: int idade =15 ;boolean amigoDoDono =true ;if (idade <18 && amigoDoDono ==false ) { System.out.println("Não pode entrar" ); }else { System.out.println("Pode entrar" ); }Esse código poderia ficar ainda mais legível, utilizando-se do operador de negação, o !. Esse operador transforma o resultado de uma expressão booleana de false em true, e vice-versa. int idade =15 ;boolean amigoDoDono =true ;if (idade <18 && !amigoDoDono) { System.out.println("Não pode entrar" ); }else { System.out.println("Pode entrar" ); }Repare na linha 3 que o trecho amigoDoDono == false virou !amigoDoDono. Eles têm o mesmo valor. Para comparar se uma variável tem o mesmo valor que outra variável ou que um valor, utilizamos o operador ==. Repare que utilizar o operador = dentro de um if retornará um erro de compilação, já que o operador = é o de atribuição. int mes =1 ;if (mes ==1 ) { System.out.println("Você deveria estar de férias" ); }O while é um comando usado para fazer um laço (loop), isto é, repetir um trecho de código algumas vezes. A ideia é que esse trecho de código seja repetido enquanto uma determinada condição permanecer verdadeira. int idade =15 ;while (idade <18 ) { System.out.println(idade); idade = idade +1 ; }O trecho dentro do bloco do while será executado até o momento em que a condição idade < 18 passe a ser falsa. E isso ocorrerá exatamente no instante em que idade == 18, o que não o fará imprimir 18. int i =0 ;while (i <10 ) { System.out.println(i); i = i +1 ; }Já o while acima imprime de 0 a 9. Outro comando de loop extremamente utilizado é o for. A ideia é a mesma do while: fazer um trecho de código ser repetido, enquanto uma condição continuar verdadeira. Mas, além disso, o for isola também um espaço para inicialização de variáveis e o modificador dessas variáveis. Isso faz com que as variáveis relacionadas ao loop fiquem mais legíveis: for (inicializacao; condicao; incremento) { codigo; }Um exemplo é: for (int i =0 ; i <10 ; i = i +1 ) { System.out.println("olá!" ); }Repare que esse for poderia ser trocado por: int i =0 ;while (i <10 ) { System.out.println("olá!" ); i = i +1 ; }Porém, o código do for indica claramente que a variável i serve, em especial, para controlar a quantidade de laços executados. Quando usar o for? Quando usar o while? Depende do gosto e da ocasião.
Apesar de termos condições booleanas nos nossos laços, em algum momento, podemos decidir parar o loop por algum motivo especial sem que o resto do laço seja executado. for (int i = x; i < y; i++) {if (i %19 ==0 ) { System.out.println("Achei um número divisível por 19 entre x e y" );break ; } }O código acima percorrerá os números de x a y e irá parar quando encontrar um número divisível por 19, uma vez que foi utilizada a palavra-chave break. Da mesma maneira, é possível obrigar o loop a executar o próximo laço. Para isso, usamos a palavra-chave continue. for (int i =0 ; i <100 ; i++) {if (i >50 && i <60 ) {continue ; } System.out.println(i); }O código acima não imprimirá alguns números. (Quais exatamente?) No Java, podemos declarar variáveis a qualquer momento. Porém, dependendo de onde você as declarou, ela valerá de um determinado ponto a outro. int i =5 ;O escopo da variável é o nome dado ao trecho de código em que aquela variável existe e o lugar onde é possível acessá-la. Quando abrimos um novo bloco com as chaves, as variáveis declaradas ali dentro só valem até o fim daquele bloco. int i =5 ;while (condicao) {int j =7 ; }No bloco acima, a variável j para de existir quando termina o bloco no qual ela foi declarada. Se você tentar acessar uma variável fora do escopo dela, ocorrerá um erro de compilação. O mesmo vale para um if: if (algumBooleano) {int i =5 else {int i =10 ; } System.out.println(i);Aqui a variável i não existe fora do if e do else! Se você declarar a variável antes do if, haverá outro erro de compilação: dentro do if e do else, a variável está sendo redeclarada. Então, o código para compilar e fazer sentido fica: int i;if (algumBooleano) { i =5 ; }else { i =10 ; } System.out.println(i);Uma situação parecida pode ocorrer com o for: for (int i =0 ; i <10 ; i++) { System.out.println("olá!" ); } System.out.println(i);Nesse for, a variável i morre ao seu término, não podendo ser acessada de fora do fore gerando um erro de compilação. Se você realmente quer acessar o contador depois do loop terminar, precisa de algo como: int i;for (i =0 ; i <10 ; i++) { System.out.println("olá!" ); } System.out.println(i);Um bloco também pode ser declarado dentro de outro. Isto é, um if dentro de um for, ou um for dentro de um for, algo como: while (condicao) {for (int i =0 ; i <10 ; i++) { } }
Mais exercícios de fixação de sintaxe. Para quem já conhece um pouco de Java, pode ser muito simples, mas recomendamos fortemente que você faça os exercícios a fim de se acostumar com erros de compilação, mensagens do javac, convenção de código, etc. Apesar de extremamente simples, precisamos praticar a sintaxe que estamos aprendendo. Para cada exercício, crie um novo arquivo com extensão .java e declare aquele estranho cabeçalho, dando nome a uma classe e com um bloco main dentro dele: class ExercicioX {public static void main(String[] args) { } }Não copie e cole de um exercício já existente! Aproveite para praticar.
Orientação a Objetos Básica |