(Parte 4 de 5)

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:

3.12 - Um pouco mais...

1) Vimos apenas os comandos mais usados para controle de fluxo. O Java ainda possui o do..while e o switch. Pesquise sobre eles e diga quando é interessante usar cada um deles.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Um bloco dentro do outro - Página 25

Material do Treinamento Java e Orientação a Objetos

2) Algumas vezes temos vários laços encadeados. Podemos utilizar o break para quebrar o laço mais interno, mas se quisermos quebrar um laço mais externo, teremos de encadear diversos ifs e seu código ficará uma bagunça. O Java possui um artifício chamado labeled loops, pesquise sobre eles.

3) O que acontece se você tentar dividir um número inteiro por 0? E por 0.0?

4) Existe um caminho entre os tipos primitivos que indicam se há a necessidade ou não de casting entre os tipos. Por exemplo, int -> long -> double (um int pode ser tratado como um double, mas não o contrário). Pesquise (ou teste), e posicione os outros tipos primitivos nesse fluxo.

5) Existem outros operadores, como o %, <<, >>. Descubra para que servem.

6) Além dos operadores de incremento, existem os de decremento, como --i e i--. Além desses, você pode usar instruções do tipo i += x e i -= x, o que essas instruções fazem? Teste.

3.13 - Exercícios: Fixação de sintaxe

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 para 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 método main dentro dele:

class ExercicioX { public static void main(String[] args) { // seu exercicio vai aqui }

Não copie e cole de um exercício já existente! Aproveite para praticar.

1) Imprima todos os números de 150 a 300. 2) Imprima a soma de 1 até 1000. 3) Imprima todos os múltiplos de 3, entre 1 e 100.

O fatorial de um número n é n * n-1 * n-2até n = 1. Lembre-se de utilizar os parênteses. O fatorial de 0 é

Faça um for que inicie uma variável n (número) como 1 e fatorial (resultado) como 1 e varia n de 1 até 10:

5) Aumente a quantidade de números que terão os fatoriais impressos, até 20, 30, 40. Em um determinado momento, além desse cálculo demorar, vai começar a mostrar respostas completamente erradas. Porque? Mude de int para long, e você poderá ver alguma mudança.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Exercícios: Fixação de sintaxe - Página 26

Material do Treinamento Java e Orientação a Objetos

seguinte: 0, 1, 1, 2, 3, 5, 8, 13, 21, etcPara calculá-la, o primeiro e segundo elementos valem 1, daí por

6) (opcional) Imprima os primeiros números da série de Fibonacci até passar de 100. A série de Fibonacci é a diante, o n-ésimo elemento vale o (n-1)-ésimo elemento somando ao (n-2)-ésimo elemento (ex: 8 = 5 + 3).

7) (opcional) Escreva um programa que, dada uma variável x (com valor 180, por exemplo), temos y de acordo com a seguinte regra:

• imprime y

• O programa deve então jogar o valor de y em x e continuar até que y tenha o valor final de 1. Por exemplo, para x = 13, a saída será:

Imprimindo sem pular linha

Um detalhe importante do método que estamos usando até agora é que uma quebra de linha é impressa toda vez que chamado. Para não pular uma linha usamos o método a seguir:

System.out.print(variavel);

8) (opcional) Imprima a seguinte tabela, usando fors encadeados:

n n*2 n*3n*n

1) Faça o exercício da série de Fibonacci usando apenas duas variáveis.

Capítulo 3 - Variáveis primitivas e Controle de fluxo - Desafios: Fibonacci - Página 27

CAPÍTULO 4

Orientação a objetos básica

“Programação orientada à objetos é uma péssima idéia, que só poderia ter nascido na Califórnia.” – Edsger Dijkstra

Ao término deste capítulo, você será capaz de:

• dizer o que é e para que serve orientação a objetos; • conceituar classes, atributos e comportamentos;

• entender o significado de variáveis e objetos na memória.

4.1 - Motivação: problemas do paradigma procedural

Orientação a objetos é uma maneira de programar que ajuda na organização e resolve muitos problemas enfrentados pela programação procedural.

Consideremos o clássico problema da validação de um CPF. Normalmente, temos um formulário, no qual recebemos essa informação, e depois temos que enviar esses caracteres para uma função que irá validá-lo, como no pseudo código abaixo:

cpf = formulario->campo_cpf valida(cpf)

Alguém te obriga a sempre validar esse CPF? Você pode, inúmeras vezes, esquecer de chamar esse validador. Mais: considere que você tem 50 formulários e precise validar em todos eles o CPF. Se sua equipe tem 3 programadores trabalhando nesses formulários, quem fica responsável por essa validação? Todos!

A situação pode piorar: na entrada de um novo desenvolvedor, precisaríamos avisá-lo que sempre devemos validar o cpf de um formulário. É nesse momento que nascem aqueles guias de programação para o desenvolvedor que for entrar nesse projeto - às vezes é um documento enorme. Em outras palavras, todo desenvolvedor precisa ficar sabendo de uma quantidade enorme de informações, que, na maioria das vezes, não está realmente relacionado à sua parte no sistema, mas ele precisa ler tudo isso, resultando um entrave muito grande!

Outra situação onde ficam claros os problemas da programação procedural, é quando nos encontramos na necessidade de ler o código que foi escrito por outro desenvolvedor e descobrir como ele funciona internamente. Um sistema bem encapsulado não deveria gerar essa necessidade. Em um sistema grande, simplesmente não temos tempo de ler uma parte grande do código.

Considerando que você não erre aí e que sua equipe tenha uma comunicação muito boa (perceba que comunicação excessiva pode ser prejudicial e atrapalhar o andamento), ainda temos outro problema: imagine que, agora, em todo formulário, você também quer que a idade do cliente seja validada - precisa ser maior de

18 anos. Vamos ter de colocar um ifmas onde? Espalhado por todo seu código... Mesmo que se crie

Material do Treinamento Java e Orientação a Objetos outra função para validar, precisaremos incluir isso nos nossos 50 formulários já existentes. Qual é a chance de esquecermos em um deles? É muito grande.

A responsabilidade de verificar se o cliente tem ou não tem 18 anos, ficou espalhada por todo o seu código.

Seria interessante poder concentrar essa responsabilidade em um lugar só, para não ter chances de esquecer isso.

Melhor ainda seria se conseguissemos mudar essa validação e os outros programadores nem precisassem ficar sabendo disso. Em outras palavras, eles criariam formulários e um único programador seria responsável pela validação: os outros nem sabem da existência desse trecho de código. Um mundo ideal? Não, o paradigma da orientação a objetos facilita tudo isso.

O problema é que não existe uma conexão entre seus dados! Não existe uma conexão entre seus dados e suas funcionalidades! A idéia é ter essa amarra através da linguagem.

Quais as vantagens?

Orientação a objetos vai te ajudar em muito em se organizar e escrever menos, além de concentrar as responsabilidades nos pontos certos, flexibilizando sua aplicação, encapsulando a lógica de negócios. Outra enorme vantagem, onde você realmente vai economizar montanhas de código, é o polimorfismo das referências, que veremos em um posterior capítulo.

4.2 - Criando um tipo

Considere um programa para um banco, é bem fácil perceber que uma entidade extremamente importante para o nosso sistema é a conta. Nossa idéia aqui é generalizarmos alguma informação, juntamente com funcionalidades que toda conta deve ter.

O que toda conta tem e é importante para nós?

• número da conta • nome do cliente

• saldo

• limite

O que toda conta faz e é importante para nós? Isto é, o que gostaríamos de “pedir à conta”.

• saca uma quantidade x • deposita uma quantidade x

• imprime o nome do dono da conta

• devolve o saldo atual

• transfere uma quantidade x para uma outra conta y

• devolve o tipo de conta

Capítulo 4 - Orientação a objetos básica - Criando um tipo - Página 29

Material do Treinamento Java e Orientação a Objetos

Com isso, temos o projeto de uma conta bancária. Podemos pegar esse projeto e acessar seu saldo? Não.

O que temos ainda é o projeto. Antes, precisamos construir uma conta, para poder acessar o que ela tem, e pedir a ela que faça alguma coisa.

Repare na figura: apesar do papel do lado esquerdo especificar uma Conta, essa especificação é uma

Conta? Nós depositamos e sacamos dinheiro desse papel? Não. Utilizamos a especificação da Conta para poder criar instâncias que realmente são contas, onde podemos realizar as operações que criamos.

Apesar de declararmos que toda conta tem um saldo, um número e uma agência no pedaço de papel (como à esquerda na figura), são nas instâncias desse projeto que realmente há espaço para armazenar esses valores.

Ao projeto da conta, isto é, a definição da conta, damos o nome de classe. Ao que podemos construir a partir desse projeto, as contas de verdade, damos o nome de objetos.

A palavra classe vem da taxonomia da biologia. Todos os seres vivos de uma mesma classe biológica têm uma série de atributos e comportamentos em comum, mas não são iguais, podem variar nos valores desses atributos e como realizam esses comportamentos.

Homo Sapiens define um grupo de seres que possuem características em comum, porém a definição (a idéia, o conceito) de um Homo Sapiens é um ser humano? Não. Tudo está especificado na classe Homo Sapiens, mas se quisermos mandar algúem correr, comer, pular, precisaremos de uma instância de Homo Sapiens, ou então de um objeto do tipo Homo Sapiens.

Um outro exemplo: uma receita de bolo. A pergunta é certeira: você come uma receita de bolo? Não.

Precisamos instaciá-la, criar um objeto bolo a partir dessa especificação (a classe) para utilizá-la. Podemos criar centenas de bolos a partir dessa classe (a receita, no caso), eles podem ser bem semelhantes, alguns até idênticos, mas são objetos diferentes.

Podemos fazer milhares de analogias semelhantes. A planta de uma casa é uma casa? Definitivamente não. Não podemos morar dentro da planta de uma casa, nem podemos abrir sua porta ou pintar suas paredes. Precisamos, antes, construir instâncias a partir dessa planta. Essas instâncias, sim, podemos pintar, decorar ou morar dentro.

Pode parecer óbvio, mas a dificuldade inicial do paradigma da orientação a objetos é justo saber distinguir o que é classe e o que é objeto. É comum o iniciante utilizar, obviamente de forma errada, essas duas palavras como sinônimos.

Capítulo 4 - Orientação a objetos básica - Criando um tipo - Página 30

Material do Treinamento Java e Orientação a Objetos

4.3 - Uma classe em Java

Vamos começar apenas com o que uma Conta tem, e não com o que ela faz (veremos logo em seguida).

Um tipo desses, como o especificado de Conta acima, pode ser facilmente traduzido para Java:

class Conta { int numero; String nome; double saldo; double limite;

String

String é uma classe em Java. Ela guarda uma palavra, isso é um punhado de caracteres. Como estamos aprendendo o que é uma classe, entenderemos com detalhes a classe String apenas em capítulos posteriores.

Por enquanto, declaramos o que toda conta deve ter. Estes são os atributos que toda conta, quando criada, vai ter. Repare que essas variáveis foram declaradas fora de um bloco, diferente do que fazíamos quando tinha aquele main. Quando uma variável é declarada diretamente dentro do escopo da classe, é chamada de variável de objeto, ou atributo.

4.4 - Criando e usando um objeto

Agora, temos uma classe em Java que especifica o que todo objeto dessa classe deve ter. Mas como usá-la? Além dessa classe, ainda teremos o Programa.java e a partir dele é que iremos utilizar a classe Conta.

Para criar (construir, instanciar) uma Conta, basta usar a palavra chave new, utilizamos também os parênteses, que descobriremos o que são, exatamente, em um capítulo posterior:

class Programa { public static void main(String[] args) { new Conta(); }

Bem, o código acima cria um objeto do tipo Conta, mas como acessar esse objeto que foi criado? Precisamos ter alguma forma de nos referenciarmos a esse objeto. Precisamos de uma variável:

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

Conta minhaConta; minhaConta = new Conta(); }

Capítulo 4 - Orientação a objetos básica - Uma classe em Java - Página 31

Material do Treinamento Java e Orientação a Objetos

Pode parecer estranho escrevermos duas vezes Conta: uma vez na declaração da variável e outra vez no uso do new. Mas há um motivo, que entenderemos também posteriormente.

Através da variável minhaConta, agora, podemos acessar o objeto recém criado para alterar seu nome, seu saldo etc:

É importante fixar que o ponto foi utilizado para acessar algo em minhaConta. Agora, minhaConta pertence ao Duke, e tem saldo de mil reais.

Dentro da classe, também declararemos o que cada conta faz e como isto é feito - os comportamentos que cada classe tem, isto é, o que ela faz. Por exemplo, de que maneira que uma Conta saca dinheiro? Especificaremos isso dentro da própria classe Conta, e não em um local desatrelado das informações da própria Conta. É por isso que essas “funções” são chamadas de métodos. Pois é a maneira de fazer uma operação com um objeto.

Queremos criar um método que saca uma determinada quantidade e não devolve nenhuma informação para quem acionar esse método:

3 //outros atributos ...

A palavra chave void diz que, quando você pedir para a conta sacar uma quantia, nenhuma informação será enviada de volta a quem pediu.

Quando alguém pedir para sacar, ele também vai dizer quanto quer sacar. Por isso precisamos declarar o método com algo dentro dos parênteses - o que vai aí dentro é chamado de argumento do método (ou parâmetro). Essa variável é uma variável comum, chamada também de temporária ou local, pois, ao final da execução desse método, ela deixa de existir.

Dentro do método, estamos declarando uma nova variável. Essa variável, assim como o argumento, vai morrer no fim do método, pois este é seu escopo. No momento que vamos acessar nosso atributo, usamos a

Capítulo 4 - Orientação a objetos básica - Métodos - Página 32

Material do Treinamento Java e Orientação a Objetos

palavra chave this para mostrar que esse é um atributo, e não uma simples variável. (veremos depois que é opcional)

Repare que, nesse caso, a conta pode estourar o limite fixado pelo banco. Mais para frente, evitaremos essa situação, e de uma maneira muito elegante.

Da mesma forma, temos o método para depositar alguma quantia:

2 //outros atributos e métodos ...

Observe que, agora, não usamos uma variável auxiliar e, além disso, usamos a abreviação += para deixar o método bem simples. O += soma quantidade ao valor antigo do saldo e guarda no próprio saldo, o valor resultante.

Para mandar uma mensagem ao objeto e pedir que ele execute um método, também usamos o ponto. O termo usado para isso é invocação de método.

O código a seguir saca dinheiro e depois deposita outra quantia na nossa conta:

Uma vez que seu saldo inicial é 1000 reais, se sacarmos 200 reais, depositarmos 500 reais e imprimirmos o valor do saldo, o que será impresso?

4.6 - Métodos com retorno

(Parte 4 de 5)

Comentários