(Parte 3 de 5)

3.1 - Declarando e usando variáveis

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 que declarado: tipoDaVariavel nomeDaVariavel;

Por exemplo, é possível ter uma idade que vale um número inteiro: int idade;

Com isso, você declara a variável idade, que passa a existir a partir deste momento. Ela é do tipo int, que guarda um número inteiro. A partir de agora você pode usá-la, primeiro atribuindo valores.

A linha a seguir é a tradução de “idade deve valer agora quinze”. idade = 15;

Comentários em Java

Para fazer um comentário em java, você pode usar o // para comentar até o final da linha, ou então usar o /* */ para comentar o que estiver entre eles.

/* comentário daqui, ate aqui */

//uma linha de comentário sobre a idade int idade;

Material do Treinamento Java e Orientação a Objetos

Além de atribuir, você pode utilizar esse valor. O código a seguir declara novamente a variável idade com valor 15 e imprime seu valor na saída padrão através da chamada a System.out.println.

//declara a idade int idade; idade = 15;

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.

//gera a idade no ano seguinte int idadeNoAnoQueVem; idadeNoAnoQueVem = idade + 1;

No momento 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 nada mais mais é que o resto de uma divisão inteira. Veja alguns exemplos:

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Declarando e usando variáveis - Página 15

Material do Treinamento Java e Orientação a Objetos

Onde testar esses códigos?

Você deve colocar esses trechos de código dentro do método main, que vimos no capítulo anterior. Isto é, isso deve ficar no miolo do programa. Use bastante System.out.println, dessa forma você pode ver algum resultado, caso contrário, ao executar a aplicação, nada aparecerá. Por exemplo, para imprimir a idade e a idadeNoAnoQueVem podemos escrever o seguinte programa de exemplo:

class TestaIdade { public static void main(String[] args) {

// declara a idade int idade; idade = 15;

// gera uma idade no ano seguinte int idadeNoAnoQueVem; idadeNoAnoQueVem = idade + 1;

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.

O tipo boolean armazena um valor verdadeiro ou falso, e só. boolean verdade = true;

O tipo char guarda um, e apenas um, caractere. Esse caractere 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!

3.2 - Tipos primitivos e valores

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.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Tipos primitivos e valores - Página 16

Material do Treinamento Java e Orientação a Objetos

Aqui, 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 da linha 2 fazer j = i, a partir desse momento essas variáveis não tem relação nenhuma: o que acontece com uma, não reflete em nada com a outra.

Outros tipos primitivos

Vimos aqui os tipos primitivos que mais aparecem. O Java tem outros, que são o byte, short, long e float. Cada tipo possui características especiais que, para um programador avançado, podem fazer muita diferença.

3.3 - Exercícios: Variáveis e tipos primitivos

1) Na empresa onde trabalhamos, há tabelas com o quanto foi gasto em cada mês. Para fechar o balanço do primeiro trimestre, precisamos somar o gasto total. Sabendo que, em Janeiro, foram gastos 15000 reais, em Fevereiro, 23000 reais e em Março, 17000 reais, faça um programa que calcule e imprima o gasto total no trimestre. Siga esses passos:

a) Crie uma classe chamada BalancoTrimestral com um bloco main, como nos exemplos anteriores; b) Dentro do main (o miolo do programa), declare uma variável inteira chamada gastosJaneiro e inicialize-a com 15000; c) Crie também as variáveis gastosFevereiro e gastosMarco, inicializando-as com 23000 e 17000, respectivamente, utilize uma linha para cada declaração; d) Crie uma variável chamada gastosTrimestre e inicialize-a com a soma das outras 3 variáveis:

int gastosTrimestre = gastosJaneiro + gastosFevereiro + gastosMarco; e) Imprima a variável gastosTrimestre.

2) (opcional) Adicione código (sem alterar as linhas que já existem) no programa a seguir para imprimir o resultado:

class ExercicioSimples { public static void main(String[] args) {

// imprime concatenando diversas variáveis

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Exercícios: Variáveis e tipos primitivos - Página 17

Material do Treinamento Java e Orientação a Objetos

3.4 - Discussão em aula: convenções de código e código legível

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 code conventions no campo de busca do site http://java.sun.com.)

3.5 - Casting e promoção

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 atribuir ele 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.

O mesmo ocorre no seguinte trecho: int i = 3.14;

O mais interessante, é que nem mesmo o seguinte código compila:

double d = 5; // ok, o double pode conter um número inteiro int i = d; // não compila

Apesar de 5 ser um bom valor para um int, o compilador não tem como saber que valor estará dentro desse double no momento da execução. Esse valor pode ter sido digitado pelo usuário, e ninguém vai garantir que essa conversão ocorra sem perda de valores.

Já no caso a seguir, é o contrário:

O código acima compila sem problemas, já 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 num 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.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Discussão em aula: convenções de código e código legível - Página 18

Material do Treinamento Java e Orientação a Objetos

O casting foi feito para moldar a variável d3 como um int. O valor de i agora é 3.

O mesmo ocorre entre valores int e long.

long x = 10000; int i = x; // nao compila, pois pode estar perdendo informação

E, se quisermos realmente fazer isso, fazemos o casting:

Casos não tão comuns de casting e atribuição Alguns castings aparecem também:

O código acima não compila pois todos os literais com ponto flutuante são considerados double pelo Java. E float não pode receber um double sem perda de informação, para fazer isso funcionar podemos escrever o seguinte:

A letra f, que pode ser máiscula ou minúscula, indica que aquele literal deve ser tratado como float. Outro caso, que é mais comum:

Você precisa do casting porque o Java faz as contas e vai armazenando sempre no maior tipo que apareceu durante as operações, no caso o double. E uma observação: no mínimo, o Java armazena o resultado em um int, na hora de fazer as contas. Até casting com variáveis do tipo char podem ocorrer. O único tipo primitivo que não pode ser atribuído a nenhum outro tipo é o boolean.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Casting e promoção - Página 19

Material do Treinamento Java e Orientação a Objetos

Castings possíveis

Abaixo estão relacionados todos os casts possíveis na linguagem Java, mostrando a conversão de um valor para outro. A indicação Impl. quer dizer que aquele cast é implícito e automático, ou seja, você não precisa indicar o cast explicitamente (lembrando que o tipo boolean não pode ser convertido para nenhum outro tipo).

Tamanho dos tipos Na tabela abaixo, estão os tamanhos de cada tipo primitivo do Java.

A sintaxe do if no Java é 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:

Capítulo 3 - Variáveis primitivas e Controle de fluxo - O If-Else - Página 20

Material do Treinamento Java e Orientação a Objetos

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:

System.out.println("Não pode entrar"); } else {

Você pode concatenar expressões booleanas através dos operadores lógicos “E” e “OU”. O “E” é representado pelo & e o “OU” é representado pelo |.

System.out.println("Não pode entrar"); } else {

Esse código poderia ficar ainda mais legível, utilizando-se o operador de negação, o !. Esse operador transforma uma expressão booleana de false para true e vice versa.

System.out.println("Não pode entrar"); } else {

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 valor, utilizamos o operador ==. Repare que utilizar o operador = vai retornar um erro de compilação, já que o operador = é o de atribuição.

System.out.println("Você deveria estar de férias"); }

Capítulo 3 - Variáveis primitivas e Controle de fluxo - O If-Else - Página 21

Material do Treinamento Java e Orientação a Objetos

Em alguns livros, logo será apresentado a você dois tipos de operadores de OU e de E. Você realmente não precisa saber distinguir a diferença entre eles por enquanto. O que acontece é que os operadores && e || funcionam como seus operadores irmãos, porém eles funcionam da maneira mais rápida possível: quando percebem que a resposta não mudará mais, eles param de verificar as outras condições booleanas. Por isso, eles são chamados de operadores de curto circuito (short circuit operators).

//

O valor de algumaCoisa será analisado, nesse caso. Repare que não precisaria, pois já temos um true. true ou qualquer outra coisa, dá sempre true.

//

Neste caso o algumaCoisa não será analisado. Pode não fazer sentido ter as duas opções, mas em alguns casos é interessante e útil usar um ou outro, além de dar diferença no resultado. Veremos mais adiante em outros capítulos.

O while é um comando usado para fazer um laço (loop), isto é, repetir um trecho de código algumas vezes. A idéia é que esse trecho de código seja repetido enquanto uma determinada condição permanecer verdadeira.

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 momento em que idade == 18, o que não o fará imprimir 18.

Já o while acima imprime de 0 a 9.

Outro comando de loop extremamente utilizado é o for. A idéia é 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 fiquem mais legíveis, as variáveis que são relacionadas ao loop:

Capítulo 3 - Variáveis primitivas e Controle de fluxo - O While - Página 2

Material do Treinamento Java e Orientação a Objetos

for (inicializacao; condicao; incremento) { codigo; }

Um exemplo é o a seguir:

Repare que esse for poderia ser trocado por:

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.

Pós incremento ++ i = i + 1 pode realmente ser substituído por i++ quando isolado, porém, em alguns casos, temos essa instrução envolvida em, por exemplo, uma atribuição:

Qual é o valor de x? O de i, após essa linha, é 6. O operador ++, quando vem após a variável, retorna o valor antigo, e incrementa (pós incremento), fazendo x valer 5. Se você tivesse usado o ++ antes da variável (pré incremento), o resultado seria 6:

3.9 - Controlando loops

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.

O código acima vai percorrer os números de x a y e parar quando encontrar um número divisível por 19, uma vez que foi utilizada a palavra chave break.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Controlando loops - Página 23

Material do Treinamento Java e Orientação a Objetos

Da mesma maneira, é possível obrigar o loop a executar o próximo laço. Para isso usamos a palavra chave continue.

O código acima não vai imprimir alguns números. (Quais exatamente?)

3.10 - Escopo das variáveis

No Java, podemos declarar variáveis a qualquer momento. Porém, dependendo de onde você as declarou, ela vai valer de um determinado ponto a outro.

//aqui a variável i não existe int i = 5; // a partir daqui ela existe

O escopo da variável é o nome dado ao trecho de código em que aquela variável existe e que é 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.

//aqui a variável i não existe int i = 5; // a partir daqui ela existe while (condicao) { // o i ainda vale aqui int j = 7; // o j passa a existir } // aqui o j não existe mais, mas o i continua a valer

No bloco acima, a variável j pára de existir quando termina o bloco onde ela foi declarada. Se você tentar acessar uma variável fora de seu escopo, ocorrerá um erro de compilação.

O mesmo vale para um if:

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Escopo das variáveis - Página 24

Material do Treinamento Java e Orientação a Objetos

Aqui a variável i não existe fora do if e do else! Se você declarar a variável antes do if, vai 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:

Uma situação parecida pode ocorrer com o for:

Neste for a variável i morre ao seu término, não podendo ser acessada de fora do for, gerando um erro de compilação. Se você realmente quer acessar o contador depois do loop terminar, precisa de algo como:

3.1 - Um bloco dentro do outro

(Parte 3 de 5)

Comentários