Você está na página 1de 121

Programao Orientada a Objetos Professores autores Adriano Bezerra Manuel Gomes Uir Kulesza Aula 1 Introduo Programao Orientada

da a Objetos Apresentao Nesta disciplina de Programao Orientada a Objetos(POO),voc vai estudar os conceitos necessrios para se aplicar o paradigma da Orientao a Objetos na programao de computadores. Nas primeiras aulas, voc vai estudar basicamente a teoria e no decorrer do curso iremos colocar em prtica os conceitos tericos aprendidos. Os exerccios prticos sero desenvolvidos usando a linguagem Java. natural e previsvel que, aps esse curso, voc no seja ainda um excelente programador, pois isso leva anos de prtica, mas podemos afirmar que voc ter uma base slida para construir sua carreira como programador utilizando esse que o principal paradigma de desenvolvimento de software atualmente, a Orientao a Objetos. Ah! Um conselho de um experiente amigo para vocs jovens iniciantes, se voc quer ser um timo profissional, veja nos problemas e desafios uma oportunidade de mostrar que voc capaz. Agarre as oportunidades. Aprendendo bem os fundamentos da Orientao a Objetos, voc com certeza j estar dando um grande passo.

Objetivos Ao final desta aula, voc ser capaz de: diferenciar Programao Estruturada e POO; conceituar Classes e Objetos; conceituar Atributos e Mtodos; entendera realidade sob o ponto de vista da POO.

Introduo

Ol pessoal, eu sou Dgito! E estarei com voc nessa grande aventura sobre a Programao Orientada a Objetos. Nossa misso explorar e descobrir os principais conceitos dessa tecnologia e juntos darmos os primeiros passos nesse admirvel mundo novo. Vem comigo!!! A Programao Orientada a Objetos (POO) um paradigma de programao de computadores que usa os conceitos de Objetos e Classes como elementos centrais para representar e processar dados usados nos programas.

Voc sabe o que um Paradigma? Segundo o dicionrio Houaiss, paradigma significa modelo, padro, exemplo. Assim um paradigma de POO a maneira como pensamos e iremos fazer nossos programas. E dessa maneira que iremos aprender a ver o mundo em nossa volta. O mundo dos objetos! Como tudo comeou De acordo com dados bibliogrficos, os conceitos da programao orientada a objetos (POO) surgiram no final da dcada de 1960, quando a linguagem Simula-68 introduziu os conceitos de objetos e troca de mensagens para construo de programas. Tais conceitos foram posteriormente amadurecidos e aprimorados durante a dcada de 1970 pela linguagem de programao Smalltalk, desenvolvida no laboratrio de pesquisa da Xerox, nos Estados Unidos. Entretanto, a popularizao da POO s se deu ao longo da dcada de 80 e 90, com as linguagens C++ e Java. Java uma das linguagens mais difundidas nos dias atuais e por conta disso foi escolhida para iniciarmos nossos estudos de POO. Ela surgiu, oficialmente, em 1995 e tambm tem uma historinha interessante... mas, essa histria s veremos na prxima aula. Um dos principais pesquisadores que introduziu os conceitos de POO, foi o cientista Alan Kay (veja a Figura 1) da Xerox, um dos criadores da linguagem Smalltalk. Durante suas pesquisas, Alan desenvolveu a idia de que poderamos construir um programa usando conceitos e abstraes do mundo real, como objetos, troca de mensagens. Houve um dia em que Alan Kay pensou:

Figura 1 Alan Kay Ento, a partir desses questionamentos, ele comeou a desenvolver suas ideias sobre um sistema de software fazendo uma comparao com o sistema de seres vivos, como ilustra aFigura 2.

Figura 2 Alan Kay pensando na programao OO Nossa! Quantas ideias!!! Mas, no se preocupe que iremos falar e aprender sobre cada uma delas ao longo das diversas aulas deste curso.

Conceitos da Programao Orientada a Objetos At aqui, voc aprendeu o conceito de programao estruturada, na qual um programa construdo por meio de funes e procedimentos. Na programao estruturada na linguagem C, um programa definido por meio de uma funo principal a qual faz chamadas a outras funes implementadas por ns, programadores. Na programao OO, a forma de pensar (o paradigma) diferente. Um programa visto como um conjunto de objetos que se comunicam atravs de mensagens. Perceba que a Figura 3 ilustra essa ideia. Cada objeto mantm dados internos, chamados de atributos. Dessa forma, um sistema (programa de computador) desenvolvido usando a POO possui objetos que colaboram entre si, executando tarefas especficas em busca de um objetivo comum.

Figura 3 Colaborao de Objetos A Programao Orientada a Objetos est sedimentada sobre quatro pilares derivados do princpio da abstrao, so eles: Encapsulamento, Herana, Composio e Polimorfismo. O Princpio da abstrao a nossa capacidade de abstrair a complexidade de um sistema e se concentrar em apenas partes desse sistema, que o tema central de nosso estudo ou foco em um dado momento. Por exemplo: quando um mdico torna-se um especialista em algum rgo do nosso corpo (exemplo, o corao), ele abstrai sem desconsiderar as influncias dos outros rgos e foca apenas sua ateno nesse rgo. Outro exemplo: quando um engenheiro civil projeta um edifcio, ele abstrai a complexidade como um todo e planeja seu projeto em partes: sistema eltrico, hidrulico, estrutural,etc. Veremos durante todo esse curso cada um desses pilares que compem a Orientao a Objetos.

Figura 4 Pilares da Orientao a Objetos

Objetos O que so objetos? Na programao OO, objetos so usados para representar entidades do mundo real ou computacional. Ou seja, os objetos so usados para representar aqueles elementos e abstraes que fazem parte da soluo do programa que estamos desenvolvendo. Se observarmos ao nosso redor, veremos vrias entidades ou abstraes as quais podem ser representadas como objetos no nosso programa. As pessoas e seus carros podem ser vistas como objetos. Na Figura 5, ilustramos, por exemplo, a

pessoa de nome Camila que tem um carro Ferrari. Os objetos possuem caractersticas pelas quais os identificamos e finalidades para as quais os utilizamos. Essas caractersticas so tipicamente chamadas de atributos, no linguajar da programao OO. Cada objeto Pessoa, por exemplo, possui um RG, um nome, uma data de nascimento, etc. J os objetos do tipo Carro possuem um tipo, uma cor, uma quantidade de portas. A Figura 3 mostra os diferentes atributos que os objetos Camila e Ferrari possuem, assim como os valores que esto assumindo. Finalmente, objetos podem tambm ter comportamentos associados. Objetos do tipo Pessoa, por exemplo, podem andar, correr ou dirigir carros. J os objetos do tipo Carro podem ter os seguintes comportamentos: ligar, desligar, acelerar, frear. A Figura 5tambm ilustra os comportamentos que objetos Pessoa e Carro podem ter. Assim, na POO os objetos possuem caractersticas e comportamentos. As caractersticas tambm podem ser chamadas de dados ou atributos. Enquanto os comportamentos tambm podem ser chamados de operaes ou mtodos.

Exemplos

Caractersticas: tipo: placa: cor: nmero de portas: 2 Comportamentos: ligar desligar acelerar frear Caractersticas: nome: Camila cor biotipo: magro Comportamentos: andar correr dirigir Carro

(dados,

atributos) Ferrari KZE1018 vermelha

(operaes,

mtodos)

do

cabelo: negro

Figura 5 Exemplos de objetos

Atividade 1 1. Observe os objetos a sua volta, escolha um deles e descreva de 3 a 5 caractersticas (atributos) e comportamentos (mtodos).

Classes Agora que voc aprendeu o conceito de Objetos em programao OO, podemos passar para outro ponto da nossa conversa. Podemos dizer que no fundo todos ns pensamos e organizamos o mundo segundo a nossa viso das caractersticas e finalidades das coisas, logo pensamos o mundo Orientado a Objetos. muito comum (e com muita frequncia o fazemos) criar grupos de objetos com base nas suas caractersticas e comportamento. Se pensarmos no universo de objetos Carro, por exemplo, vamos perceber que todos eles sempre possuem os atributos tipo, cor e nmero de portas. O mesmo vale para o universo de objetos Pessoa, que sempre vo possuir um nome, uma data de nascimento e, possivelmente, um RG. A modelagem e programao de um conjunto de objetos que possuem caractersticas (atributos) e comportamentos (mtodos) comuns feita na POO usando o conceito de Classe. Cada classe funciona no fundo como um molde para a criao de um dado objeto. Os objetos so vistos como representaes concretas (instncias) das classes. AFigura 6, por exemplo, ilustra uma classe que representa os objetos Carro. Como pode ser observado, a classe define que objetos devem ter tipo, cor, placa e nmero de portas, mas no indica explicitamente quais so seus valores. Tipo: ? Cor: ? Placa: ? Nmero de Portas: ? Figura 6 Classe Carro A Figura 7 mostra como a partir da classe (entidade abstrata) podemos criar vrios objetos diferentes (entidades concretas). Dois diferentes carros foram criados tomando como base a estrutura da classe. Outros objetos carro podem ser criados usando a classe Carro como molde.

Tipo: ? Cor: ? CLASSE Placa: ? Nmero de Portas: ?

OBJETOS

Tipo: Porsche Cor: Cinza Placa: MHZ-4345 Nmero de Portas: 2

Tipo: Ferrari Cor: Vermelho Placa: JKL-0001 Nmero de Portas: 4

Figura 7 Classe Carro e dois objetos concretos

Atividade 2 Observando o exemplo daFigura 7, imagine se a classe fosse: Livro, Celular, Mamferos, Aves e Flores. 1. Como seriam seus objetos? 2. Escreva apenas as caractersticas (ou atributos) das classes e objetos!

Ateno Em alguns livros, esses dois conceitos classes e objetos podem ser usados indistintamente.

Exemplos de classes e objetos Como vimos, diferentes classes (e seus respectivos objetos) podem ser criados em POO, para facilitar a programao do sistema. Na prtica, no existem limites ou restries sobre o que voc pode modelar e implementar. A seguir, apresentamos alguns exemplos de classes/objetos para representao de diferentes abstraes em sistemas:

objetos fsicos (um livro, uma mercadoria, uma nota fiscal); funes de pessoas para os sistemas (cliente, vendedor); eventos (uma compra, um telefonema); lugares (loja matriz, revenda norte).

Leituras complementares MASSAGO, Sadao; SCHTZER, Waldeck. Programao Java. Disponvel em:

<http://www.dm.ufscar.br/~waldeck/curso/java/>. Acesso em: 13 maio 2010. Material online introdutrio sobre Java.

Resumo Nesta aula, voc estudou o que a Programao Orientada a Objetos e o que a diferencia da Programao Estruturada. Conhecemos os conceitos de Classes, Objetos, Atributos e Mtodos. Alm disso, voc comeou a observar o mundo a nossa volta sob o ponto de vista da Programao Orientada a Objetos.

Autoavaliao 1. Quais as diferenas entre a Programao Estruturada e a POO? 2. Defina o conceito de classe e objetos. 3. Agora, seguindo o exemplo da Figura 3, descreva os possveis comportamentos (ou mtodos) para cada um desses objetos. 4. Para que servem atributos e mtodos? 5. Qual a diferena entre classe e objeto? 6. Identifique classes e objetos para um sistema escolar responsvel por controlar as turmas, professores, alunos, notas dos alunos etc. Apresente em detalhes tambm quem so os atributos e mtodos de cada classe que voc modelou.

Referencias BARNES, David J.; KLLING Michael.Programao orientada a objetos com Java. So Paulo: Editora Pearson Prentice Hall, 2004. DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003. LEMAY, Laura. Aprenda Java em 21 dias. Traduo: Daniel Vieira. Rio de Janeiro: Campos, 2003. SANTOS, Rafael. Introduo programao orientada a objetos usando Java. So Paulo: Editora Campus, 2003. SINTES, Anthony. Aprenda a programar orientada a objeto em 21 dias. Traduo: Joo Eduardo Nbrega Tortello. So Paulo: Pearson Education do Brasil, 2002. THE JAVA: tutorials. [Tutorial Oficial Java]. Disponvel <http://java.sun.com/docs/books/tutorial/>. Acesso em: 13 maio 2010. em:

Aula 2 Introduo Java

Apresentao Nesta aula, voc vai conhecer a linguagem Java e aprender um pouco mais sobre sua origem, desde seu surgimento at os dias atuais. Voc ver tambm um dos principais conceitos da Programao Orientada a Objetos a Classe. Vai aprender tambm como se representa esse conceito na linguagem Java, alm de criar caractersticas e comportamentos para uma classe.

Objetivos Ao final da aula, voc ser capaz de: conhecer um pouco da histria da linguagem Java e sua importncia no desenvolvimento de software da atualidade; entender a teoria sobre Classe; entender em detalhes uma classe codificada usando a linguagem Java; criar atributos e mtodos em classes Java.

Introduo linguagem Java Voc j conhece a linguagem Java? J pesquisou sobre isso? Bem, a linguagem Java atualmente uma das mais utilizadas e com maior nmero de programadores no mundo inteiro. Sua popularidade se deve principalmente s seguintes caractersticas: 1. a portabilidade capacidade de escrever cdigo capaz de ser executado em vrias plataformas e sistemas operacionais; 2. suporte a vrias tecnologias (redes, acesso a banco de dados etc.); 3. disponibilidade em vrios dispositivos mveis, como celular, palmtop e PDAs. Outra caracterstica fundamental ser uma linguagem aberta e que evolui de acordo com os desejos da sua comunidade de programadores, alm de possuir vrias ferramentas gratuitas disponveis para os desenvolvedores.

Para saber Funcionamento geral de programas Java

mais...

Um arquivo .java quando compilado, atravs do compilador Java, torna-se um arquivo .class. Esse .class contm cdigos bytecodes que a linguagem utilizada pela Mquina Virtual Java (JVM ou Java VM). Veja a Figura 1.

Figura 1 Converso de cdigo Java em Linguagem de mquina A Mquina Virtual Java converte os bytecodes em linguagem de mquina de acordo com o processador do computador que est sendo executado o programa. Assim, um mesmo arquivo .class pode ser executado em vrias plataformas diferentes, tais como Windows, Linux, Mac, como mostra a Figura 2. Desde claro, que o computador possua uma Mquina Virtual Java.

Figura 2 Java para os vrios Sistemas Operacionais

Histrico No inicio dos anos 1990,a Sun Microsystems estava implementando um projeto chamado Green Project cujo objetivo era gerar a interao, sem a participao humana, entre os eletrodomsticos comuns usados pelas pessoas. Para a execuo dessa ideia, James Gosling, um dos mentores do projeto, sentiu a necessidade de criar uma nova linguagem que superasse as limitaes encontradas na linguagem C. Essa linguagem foi chamada de OAK (em portugus significa carvalho) que, segundo conta-se, foi inspirado na rvore que James via janela de seu escritrio. Infelizmente, a ideia e o projeto original de Oakno obtiveram sucesso! Entretanto, a Internet estava crescendo e se apresentando como uma nova alternativa de interao. Em maio de 1995, James Gosling adaptou a linguagem OAK para Internet e batizou-a de Java. A linguagem que foi projetada para dispositivos heterogneos encontrou seu ambiente na rede mundial atravs de

aplicaes que podiam ser executada dentro dos browsers nosApplets Java. A partir da, usurios e fornecedores (como a IBM) cresceram de maneira assustadora eela tornou-se a linguagem que se expandiu mais que qualquer outra linguagem da histria da computao. Hoje, a linguagem Java referncia popular para o desenvolvimento de software na Internet, Celulares, Palmtops, Jogos, Solues de Negcios, Cartes Inteligentes etc. (Baseado em: <http://pt.wikipedia.org/wiki/Java e http://www.java.com/en/javahistory>. Acesso em: 4 fev. 2010.)

Criao de classes Falamos que objetos so entidades concretas que possuem caractersticas e comportamentos bem definidos, tais objetos podem ser organizados em grupos de caractersticas e comportamentos comuns. Esses grupos so chamados de classe. Porm, a classe no serve para organizar no sentido de guardar os objetos,ela serve de modelo de construo. Para os nossos exemplos, todos os carros (objetos) so da classe Carro, pois possuem as mesmas caractersticas e comportamentos.

A classe o modelo ou molde de construo de objetos. O modelo define as caractersticas e comportamentos que os objetos iro determinar seus valores e desempenhar suas aes, respectivamente. A classe abstrata (no existe concretamente).

Tipo: ? Cor: ? Placa: ? Nmero de Portas: ? Figura 3Exemplo da ideia de uma classe Carro

ATENO: j que as classes no existem concretamente, elas so abstratas, servem apenas para gerar os objetos.

Atividade 1 Vamos criar a classe Carro em Java? Ento, vamos l! 1. Abra um editor de texto qualquer e digite o cdigomostrado na Listagem 1. 2. Salve com o mesmo nome da classe mais .java

Palavra obrigatria para indicar a criao de uma classe.

Nome da classe escolhido pelo programador. Por padro, utilizase sempre a primeira letra maiscula.

Conjunto de caractersticas dos objetos da Classe Carro. Listagem 1 - Esquema de criao para classe "Carro" em Java Observao: Esse arquivo ser salvo como Carro.java

Perceba que no inserimos no cdigo nada sobre o comportamento dos carros, como andar para frente ou para trs, virar a esquerda/direita, frear etc. Devemos ter em mente que a linguagem de programao uma representao do mundo sob um ponto de vista. Voc se lembra do paradigma? Esse ponto de vista ou paradigma a orientao a objetos, porm, descrito nas regras da linguagem, que no nosso caso a linguagem Java. Na linguagem Java, as caractersticas so chamadas de atributos e so escritas informando o tipo de atributo e o nome do atributo. necessrio escrever um ponto-e-vrgula aps a declarao de cada atributo, pois uma exigncia da linguagem Java, bem como o espao em que so definidos os atributos e mtodos, que iro representar o comportamento, devero estar dentro de chaves { e }, outra exigncia da linguagem Java. Programar traduzir uma soluo de um problema para uma linguagem de programao. Logo, imprescindvel conhecer as regras da linguagem. O programador como um intrprete ou tradutor de um idioma para outro. Vamos a outro exemplo apresentado na Listagem 2 :

Cada atributo definido com o par TIPO e NOME. String significa tipo de texto. Int significa tipo numrico inteiro.

Listagem 2 Classe Pessoa em Java

Veja que uma pessoa, assim como um carro, possui milhares de caractersticas, porm, utilizando o princpio da abstrao, iremos deixar de fora tudo que no nos interessa, ou que no seja importante ou relevante para o sistema que estamos desenvolvendo. Ora, se formos programar um sistema para uma locadora de veculos, precisamos saber algumas informaessobre a pessoaque ir alugar o veculo, como o seu nome, habilitao de condutor, idade e oque mais acharmos relevante. Porm, muito pouco provvel que iremos exigir dados escolares das pessoas, como notas de uma disciplina etc. Para os carros, tambm h essa observao, pois um sistema de oficina mecnica dever conhecer mais detalhes internos do veculo, como numerao do motor, perodo das revises, marcas de componentes, como amortecedores, dentre outros. Mas, como saber o que relevante? Isso determinado no estudo do problema que pretendemos resolver e comumente chamamos esse contexto do problema de domnio.

Atividade 2 Na aula anterior, fizemos um exerccio que pedia para observar os objetos a sua volta, escolher um deles e descrever de 3 a 5 caractersticas (que agora chamamos de atributos). Faa o mesmo para dois outros objetos e identifique seus atributos. Em seguida, escreva o cdigo das classes que representam tais objetos na linguagem Java, conforme mostrado nas Listagens 1 e 2.

Adicionando comportamento Os objetos das classes que criamos, Carro e Pessoa, precisam no s de suas caractersticas, mas tambm de comportamentos que expressem as aes possveis de serem executadas, pois um carro precisa oferecer funes para que as pessoas os manobrem. E pessoas, por sua vez, precisam desempenhar suas atividades, como andar, correr, estudar etc. Percebam que falamos da capacidade dinmica do objeto atravs dos mtodos que possuem. Vamos dar aes aos nossos carros! Veja a Listagem 3 :

Listagem 3 Classe Carro com mtodos Observe que adicionamos novas linhas ao cdigo, agora com dois mtodos setCor(String cor) e getCor() .Esses mtodos servem, respectivamente, para definir ou mudar o valor do atributo cor e retornarao valor desse atributo. Situao onde levaramos o nosso carro a uma equipadora para modificar a sua cor. Atente para o fato de que os atributos so alterados por mtodos da sua classe. Atente para o fato de que adicionamos a palavra this antes do atributo cor. Essa palavra-chave serve para que o compilador possa entender que o atributo cor est recebendo a informao contida no parmetro cor. Outra maneira de implementar os mtodos sem usar a palavra chave this apresentado na Listagem 4 . Nesse caso, temos que mudar o nome do parmetro para c evitando um erro de compilao.

Listagem 4 Classe Carro com mtodos sem a palavra chave this

A regra Java para definirmos os mtodos :

Listagem 5 Exemplos de mtodos Logo, seno construmos outros mtodos que acessem e modifiquem os valores dos demais atributos do tipo placa e numPortas esses no podero ser vistos fora do objeto nem alterados. Com isso, o nosso cdigo ficar um pouco mais longo, veja a Listagem 6:

Listagem 6 Classe Carro completa

Atividade 3 1. Dando continuidade a Atividade 2, vamos agora acrescentar os comportamentos dos objetos nas classes, escrevendo o cdigo de seus mtodos. 2. De acordo com os exemplos vistos, crie uma classe chamada Livro e especifique os seus atributos e mtodos.

Leituras complementares CESTA, Andr Augusto. Tutorial: a linguagem de programao Java. Campinas: Instituto de Computao, 1996. Disponvel em: <http://www.dcc.unicamp.br/~cmrubira/aacesta/java/javatut9.html>. Acesso em: 13 maio 2010. Material online introdutrio sobre Classes.

Resumo Nesta aula,voc viu um breve histrico da linguagem Java. Conheceu a ideia de concepo de uma classe, como tambm o conceito sobre classes. Voc entendeu a criao de uma classe na linguagem Java. Viu tambm como representar as caractersticas e comportamentos, agora chamados, respectivamente, de atributos e mtodos em cdigo Java. Voc aprendeu ainda que a classe organiza as caractersticas e comportamentos comuns dos objetos. E que essas caractersticas (atributos) podem sofrer alteraes em suas informaes atravs dos comportamentos (mtodos).

Autoavaliao 1. O que uma classe e para que serve? 2. Como se escreve uma classe em Java? 3. Como se representam as caractersticas em uma classe? 4. Quais tipos de atributos voc conhece? 5. Qual a regra bsica de criao de um mtodo de uma classe?

Referencias THE JAVA: tutorials. [Tutorial Oficial Java]. Disponvel <http://java.sun.com/docs/books/tutorial/>. Acesso em: 13 maio 2010. em:

______. About the Java Technology. Disponvel em: <http://java.sun.com/docs/books/tutorial/getStarted/intro/definition.html>. Acesso em: 13 maio 2010. WIKIPDIA. Mquina virtual Java. Disponvel em: <http://pt.wikipedia.org/wiki/Mquina_virtual_Java>. Acesso em: 13 maio 2010.

Aula 3 Um Programa em Java e a criao de Objetos

Apresentao Nesta aula, voc vai colocar seus conhecimentos em prtica escrevendo um programa real na linguagem Java, passando por todos os passos necessrios de edio, compilao e execuo. Voc vai visualizar a transformao do cdigo fonte .java em cdigo executvel .class. Iremos tambm aprender como acontece a criao de um objeto, figura central da Programao Orientada a Objetos.

Objetivos Ao final desta aula, voc ser capaz de: aprender como criar um programa executvel em Java; aprender como criar um objeto em Java; conhecer o conceito e a criao dos mtodos Construtores.

O ponto de partida Para que um programa Java execute ou rode, como costumamos dizer, necessrio que exista um mtodo especial chamado main(...), o qual veremos em detalhe na sequncia. Esse mtodo responsvel pelo incio da execuo do Aplicativo ou Programa escrito em Java.

Aplicativos so programas que podem ser executados sozinhos. A classe que serve de ponto de partida para o aplicativo. Todo aplicativoem Java precisa ter um mtodo main(). publicstaticvoidmain(String //corpo } arguments[]){ mtodo

do

Se em um mesmo aplicativo houver mais de uma classe com o mtodo main(),quando ummain de uma das classes for executado, os demais sero ignorados enquanto o programa executado.

Veja s, falamos de aplicativo (ou programa)! Vamos escrev-lo. Para isso, precisamos do arquivo Carro.java da aula anterior, veja a Listagem 1:

Listagem 1 Classe Carro Precisamos criar outra classe que ir conter o mtodo main() para podermos executar nosso programa, como mostra a Listagem 2:

Listagem 2 Classe Main Vamos salvar esse arquivo como Main.java, agora temos dois arquivos Carro.java e Main.java. O mtodo main est vazio, no faz nada, iremos edit-lo para que realize a seguinte sequncia:

criar um objeto Carro; definir seus atributos; exibir seus atributos.

Antes disso, vamos preparar o nosso ambiente de desenvolvimento:

Ambiente de desenvolvimento

1. Crie um diretrio (pasta) chamado poo/aula3 e coloque os arquivos Carro.java e Main.java. Veja o acesso, via comandos, pasta aula3 na Figura 1:

Figura 1 Prompt de comandos com as pastas poo\aula3 2. Compile os cdigos com o comando javac. Esse comando executa um programa responsvel por traduzir o cdigo Java contido nos arquivos .java para arquivos executveis .class, ou seja, o compilador java ou javacompiler.Veja isso na Figura 2.

Figura 2 Compilando os arquivos java 3. Execute o mtodo main() da classe Main. Veja a execuo na Figura 3.

Figura 3 Execuo da classe Main Mas, nada aconteceu ... Bem, nosso programa executou corretamente, o problema que no definimos nada no cdigo do mtodo main(). Porm, no dizemos nada para ele fazer. Vamos editar o Main.java e testar sua execuo repetindo os passos 2 e 3 anteriores. O arquivo Main.java ter uma linha a mais, como mostra a Listagem 3:

Listagem 3 Mtodo main() com um comando de impresso de informao Aps a execuo,obtemos o resultado apresentado na Figura 4:

Figura 4 Execuo do Main com impresso de informao A nova linha escrita representa um comando responsvel por exibir uma mensagem na tela do terminal. Como a linguagem Java totalmente orientada a objetos, essa instruo construda como uma chamada do mtodo println() do objeto out da

classe System. Mais na frente, veremos em detalhe essa instruo. No momento, basta sabermos que tal chamada imprime mensagens na tela do computador.

Atividade 1 Insira uma instruo que exiba o seu nome e idade na sada do programa.

Criando um Objeto

Vamos criar um objeto da classe Carro, no mundo da programao orientada a objetos chamamos isso de instanciao, ou seja, criaremos uma instncia da classe Carro.

Um objeto ou instncia criado atravs do operador new. Vejamos a seguinte instruo na Figura 5:

Figura 5 Esquema de criao de um Objeto Toda a manipulao e consulta dos atributos do objeto sero feitas atravs de sua referncia, ou seja, da varivel que possui essa referncia para os dados e mtodos armazenados na memria. Nesse instante, nosso carro foi criado, mas nenhum de seus atributos foram ainda definidos. Vamos utilizar o mtodos da classe Carro para defini-lo como quisermos, para isso, vamos utilizar o conjunto de mtodos setAtributo(valor). Veja a Listagem 5.

Listagem 5 Definio de atributos usando o mtodo set Agora, vamos exibir cada atributo com seu respectivo mtodo getAtributo(). Como mostra aListagem 6 a seguir.

Listagem 6 Exibio dos valores dos atributos Logo, a nossa classe Main ficar como mostra a Listagem 7:

Listagem 7 - Mtodo main completo

Repita os passos 2 e 3, anteriores, e voc ver a sada do programa apresentada na Figura 6:

Figura 6 Execuo do mtodo main

Atividade 2 1. Crie no exemplo chamada outroCarro. apresentado outra varivel Carro

2. Defina valores distintos aos seus atributos atravs de seus respectivos mtodos set e os exiba como foi feito com a varivel meuCarro.

Mtodos construtores

Voc pode estar se perguntando: E se eu quiser, no momento da criao do objeto, passar valores para alguns de seus atributos, como placa e cor, por exemplo? possvel? sim!! Para isso, precisamos definir um tipo especial de mtodo chamado construtor. E como seu prprio nome diz, ele constri e objeto e nesse instante pode definir quaisquer atributos que desejarmos. O mtodo construtor aquele chamado em um objeto, quando ele criado, ou seja, quando ele construdo.Mas, se a classe no tiver mtodo construtor?O objeto ainda pode ser criado usando a instruo (ou operador) new. Mas nesse caso ser provavelmente necessrio chamar mtodos set, como fizemos anteriormente. Definindo os construtores, pode-se estabelecer valores iniciais para os atributos do objeto e chamar mtodos de outros objetos. As diferenas do construtor para outros mtodos que o construtor sempre tem o mesmo nome da classe e nopossui tipo de retorno. Considere a seguinte definio de um mtodo construtor na classe Carro adicionando o mtodo construtor mostrado na Listagem 8:

Listagem 8 Construtor para classe carro Observe que esse mtodo possui o mesmo nome da Classe Carro e no possui tipo de retorno, pois seu retorno, como j mencionamos, justamente a referncia para o objeto na memria,lembra-se disso?

Ateno, se fizermos apenas essa alterao, iremos nos deparar com um erro de compilao na classe Main. Voc sabe por qu?

Toda classe possui um construtor implcito e padro, sem argumentos, por isso, utilizamos o operador new mais o nome classe Carro e os ( ): Carro meuCarro = new Carro(); Observe que quando utilizamos o operador new no existem argumentos (ou parmetros)dentro dos parnteses. Isso significa que podemos estar usando o construtor padro (ou em ingls:default). Quando em uma classe define-se outro construtor, no podemos mais usar o construtor padro, a no ser que se defina explicitamente um construtor sem parmetros, como mostra o construtor 1 na Listagem 9. Com isso, a classe Carro ficar com dois construtores.

Listagem 9 Dois construtores para uma mesma classe Observe que no primeiro construtor nada foi feito, enquanto no segundo os atributos placa e numPortas foram inicializados (receberam valores). Isso significa que existem duas maneiras de se construir um objeto derivado da classe Carro, ou do tipo Carro, com ou sem inicializao dos valores dos atributos. Com isso, fechamos a base para se criar um objeto a partir de uma classe e ainda executar um programa que utilize esse objeto.

O que so construtores? Construtores so mtodos especiais para a criao e inicializao

de novas instncias de classe(objetos). Inicializam o novo objeto e seus atributos. Criam todos os outros objetos de que esse objeto necessita. Realiza todas as outras operaes que ele precisa para ser inicializado.

O que faz o operador new? Ele inicializa o novo objeto e seus atributos, criam todos os outros objetos de que esse objeto necessita e realizam todas as outras operaes de que ele precisa para ser inicializado.

Leituras complementares WIKIPDIA. Java: linguagem de programao. Disponvel em: <http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa%C3%A7%C3%A 3o%29>. Acesso em: 13 maio 2010. A Wikipdia em portugus apresenta uma introduo a Java, discutindo inclusive o mtodo main. WIKIPDIA. Main function: programming. Disponvel em: <http://en.wikipedia.org/wiki/Main_function_%28programming%29>. Acesso em: 13 maio 2010. Se voc quiser ver como o mtodo main definido em vrias linguagens de programao existentes, acesse o link acima.

Resumo Com esta aula,voc j capaz de se aventurar na programao orientada a objetos em Java, pois voc j sabe como escrever um cdigo simples e transform-lo em um cdigo executvel. Podemos alterar e acrescentar novas classes aos nossos programas e aos poucos transform-los em um grande sistema. Voc viu tambm a estrutura de criao de um objeto em Java, bem como a definio dos valores para os atributos dos objetos. Por fim,voc estudou o conceito e a prtica sobre os mtodos construtores e sua utilidade para a criao dos objetos. Nossa caminhada est apenas comeando, mas j demos excelentes passos!

Autoavaliao 1. Edite o arquivo Carro.java adicionando mais atributos classe, como marca, modelo, ano de fabricao, tipo de combustvel (lcool, gasolina ou flex). 2. Edite o arquivo Main.java para definir e exibir os novos atributos.

3. Crie um segundo carro na classe Main utilizando o construtor com parmetros.

Referencias BARNES, David J.; KLLING, Michael.Programao orientada a objetos com Java. So Paulo: Pearson Prentice Hall, 2004. DEITEL,H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003. LEMAY, Laura.Aprenda Java em 21 dias. Traduo:Daniel Vieira. Rio de Janeiro: Campos, 2003.

Aula 4 Sistemas OO

Apresentao Agora, voc ser apresentado ao verdadeiro mundo da Orientao a Objetos. Voc ter a oportunidade de estudar de que maneira construmos sistemas de grande porte utilizando princpios bsicos desse paradigma e mecanismos da linguagem Java. Objetivos entender o que realmente um Sistema OO; compreender o mecanismo de troca de mensagem entre os objetos.

Sistema = mundo OO Quando falamos em sistema, estamos falando em um programa complexo que implementa a soluo de um problema complexo. At agora, vimos pequenos programas, especficos e simplificados, pois trata-se de uma situao didtica. Mas, iremos adicionando complexidade pouco a pouco e logo voc ser capaz de desenvolver suas prprias solues. O mundo em que vivemos est repleto de objetos (ou coisas) que nos cercam e fazem a nossa vida ser como , pois sem eles no conseguimos sequer imaginar

como seria. Tais objetos definem nosso mundo por possurem caractersticas prprias e se relacionarem entre si. Nele, vimos carros trafegando pelas ruas, com edifcios que possuem escadas e elevadores; utilizamos nossos objetos pessoais, como relgios, culos e bolsas. Todos tm uma finalidade, atribumos nomes a eles e os ligamos a pessoas e a outros objetos. o nosso mundo! E esse mundo est sujeito a leis naturais e humanas. Essa analogia importante para entendermos que um sistema computacional abstrato, mas segue um princpio de construo semelhante ao mundo que nos cerca. Um sistema um verdadeiro mundo orientado a objetos, se a linguagem assim o definir, como o caso da linguagem Java. Pois, nela, todo programa por mais simples que seja, at um complexo sistema de controle de trfego areo, por exemplo, so feitos por um conjunto de muitos objetos de vrias classes diferentes.

Atividade 1 Verifique agora a sua volta a quantidade de objetos que o cerca, identifique um conjunto de 5 a 10 deles e descreva as seguintes caractersticas: nome e para que servem. Por exemplo, aqui eu tenho um computador na minha frente, ento ai vai: Nome: Computador Serve para: Trabalhar (inclui preparar esta aula), comunicar-me com meus amigos e diverso.

Como foi visto na atividade anterior, praticamente todos os objetos esto relacionados a outros, pois nenhum faz tudo sozinho, nem mesmo meu computador de ltima gerao, pois sem a tomada na parede ele no nada. Os objetos precisam se comunicar, ou seja, um objeto aciona um mtodo de outro, e este, por sua vez, de um outro, e assim por diante. Essa comunicao realizada atravs do mecanismo de troca de mensagem. Vejamos a seguinte situao.

Estou digitando esta aula e sei que est prestes a faltar energia na rea do meu escritrio, mas preciso revis-la, ento, decido imprimi-la, para poder ler o documento da aula enquanto estiver faltando energia. O meu objeto Computador no capaz de sozinho fazer essa tarefa, ele precisa interagir com a impressora. Como mostrado na Figura 1, o computador envia os dados (contedo desta aula) em forma de mensagem para a impressora, que realiza a sua tarefa de imprimir o contedo do documento em papel para ser lido luz natural ou de velas.

Figura 1 Objetos do mundo real trocando mensagens

Agora, vejamos outro exemplo, este no mundo OO Java, relembrando nosso programa:

Listagem 1 Exemplo de troca de mensagem com um objeto da classe Carro

Esse cdigo escrito dentro da classe Main envia uma mensagem para definir um atributo e outra para recuperar a placa do carro. Em Java, a troca de mensagem representa: (i) a mudana ou leitura do estado interno do objeto atravs da alterao de um de seus atributos; ou (ii) a chamada a um dos mtodos do objeto que representam seu comportamento e as tarefas que so capazes de desempenhar. Durante a execuo de um sistema, que se inicia sempre pelo mtodo main() (no se esquea!), h vrias, milhares de trocas de mensagem entre objetos! Logo, precisamos projetar bem os sistemas e gerenciar a complexidade para que no se transforme em uma tarefa rdua diria.

Atividade 2 1. Envie mensagens para o objeto meuCarro definindo seus outros atributos (modificando seu estado interno), e outras mensagens recuperando esses novos valores (acionando o comportamento de informar ao mundo exterior seu estado interior).

Nos sistemas orientados a objetos, quando objetos de classes distintas possuem uma troca de mensagens muito frequente, por possurem uma autodependncia forte, ou cooperarem entre si por objetivos mtuos, comum estabelecermos um relacionamento entre essas classes. O nosso exemplo do mundo real expresso atravs do computador e da

impressora possui um relacionamento entre ambos, pois quando solicitada a impresso de um documento meu computador j possui um cadastro das impressoras de que disponho, caso contrrio, terei que instalar uma nova. Logo, a classe Computador possui um relacionamento com a classe Impressora, se assim formos traduzir para o mundo OO. Esses relacionamentos costumam ser definidos atravs de suas cardinalidades. Mas, o que isso? Bem, quando relacionamos coisas no mundo real fazemos isso de forma natural e espontnea, teremos que ser mais observadores daqui pra frente. Vejamos, quantas pessoas cabem em um automvel? Na maioria deles, a lotao de no mximo 5 pessoas, incluindo seu condutor.Mas uma pessoa pode estar em quantos automveis ao mesmo tempo? At onde as leis da fsica permitem, s em um, de cada vez! Chamamos esse relacionamento de um-para-muitos, um (automvel) para muitos (pessoas). Em outras situaes, vemos que um marido para uma, e somente uma, esposa, e a recproca verdadeira, temos ento um relacionamento umpara-um. A outra combinao possvel seria muitos-para-muitos, o que verificamos no nosso exemplo computador e impressora, pois do meu computador posso imprimir em vrias impressoras e cada uma dessas podem receber documentos dos outros computadores do escritrio.

Atividade 3 Complemente a atividade anterior adicionando relacionamentos aos objetos listados por voc. Tome como exemplo: Computador Relacionado com: pessoal, meu. E est conectado a um mouse e a rede eltrica do meu escritrio.

Continuando nosso programa... Vamos ligar a classe Carro classe Pessoa, fazendo com que uma pessoa possua um carro e esse carro s possa pertencer a uma nica pessoa. o que chamados de relao um-para-um.

Camila possui um carro vermelho Figura 2 Exemplo de relacionamento entre objetos

A classe Carro precisa saber que pertence a algum. Iremos adicionar um atributo chamado dono, que do tipo Pessoa. Exibindo a lista de atributos de Carro aps a mudana:

Listagem 2 Codificao do relacionamento entre as classes Carro e Pessoa

E os respectivos mtodos get e set:

Listagem 3 Mtodos que relacionam Carro a Pessoa

Vamos utilizar esse relacionamento no exemplo seguinte:

Listagem 4 Programa exemplo do relacionamento Carro e Pessoa

Observe a linha:

Listagem 5 Comando com exemplo de troca de mensagem

Neste ponto, a classe Main envia uma mensagem para o objeto carro, recuperando o seu dono, um objeto da classe Pessoa, e esse recebe uma mensagem para que retorne o seu nome.

A troca de mtodo

mensagens comumente

denominada de chamada de

At agora,voc estudou a troca de mensagens entre objetos para definir ou recuperar algum atributo, unicamente. Os sistemas OO precisam de mtodos mais complexos, que verifiquem a validade dos dados, realizem atualizaes em outras entidades, pesquisem em banco de dados, escrevam em arquivos de log, atualizem objetos da interface etc. Vamos colocar um pouco da complexidade do mundo real no nosso

programa?!Vamos l! Faremos as seguintes alteraes: 1- Adicionar os mtodos ligar(), desligar(), acelerar(), frear() classe Carro.

Listagem 6 Novos mtodos para a classe Carro

2 - Vamos adicionar classe Carro, ainda, um atributo cmbio que indicar qual a marcha que o carro est em um dado momento, para tanto, tal atributo ir guardar um valor inteiro de 0 (zero) a 5 (cinco). 0 neutro (ponto morto) 1 a 5 marchas

Listagem 7 Novo atributo e mtodos da classe Carro

3 - Precisamos colocar uma referncia do automvel dentro da classe Pessoa.

Listagem 8 Mtodos que implementam o relacionamento entre Carro e Pessoa

4 - Vamos adicionar outros mtodos classe Pessoa para interagir (trocar mensagens) com seu carro.

Listagem 9 Classe Pessoa recebe mtodos para interagir com a classe Carro

5 - Vamos ao Main! Nosso programa precisa:

1. criar uma Pessoa; 2. criar um Carro, e atribu-lo a essa Pessoa; 3. fazer com que a pessoa ligue o carro, troque de marcha, acelere, reduza a velocidade, troque de marcha e desligue o carro.

Listagem 10 Programa exemplo para testar o relacionamento entre Carro e Pessoa

O que podemos ver que o mtodo Main envia uma mensagem para o objeto pessoa, que, por sua vez, manda ou repassa essa mensagem para seu objeto da classe Carro, que executa a ao final desejada, que consiste em gui-lo. Veja a ilustrao a seguir:

Figura 3 Envio de mensagens entre objetos

Leitura Complementar No site <http://www.leandro.wives.nom.br/java/oojava.htm>, voc encontrar informaes sobre o que vimos nesta aula e um breve resumo do que ainda veremos. Aconselho que leia apenas o que se sentir confortvel e possa assimilar no momento, pois veremos mais tcnicas de programao orientada a objetos na sequncia das aulas.

Resumo Nesta aula, voc ampliou os horizontes. importante que neste ponto voc revise o que foi visto at agora, pois os elementos fundamentais da orientao a objetos e os mecanismos bsicos da linguagem Java foram apresentados e combinados para gerar uma aplicao simples, mas bastante significativa. Os sistemas so arranjos complexos de objetos que se relacionam trocando mensagens entre si e cooperando para atingir objetivos planejados pelo seu programador. necessrio um bom planejamento para manter a complexidade do sistema sob controle.

Autoavaliao 1 O que a troca de mensagens entre objetos? 2 Como os sistemas OO implementam sua soluo? 3 Dos exemplos apresentados, identifique os trechos onde h troca de mensagens envolvendo objetos das classes Carro e Pessoa.

Referncias DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

Aula 5 Encapsulamento

Apresentao Nesta aula, vamos aprender sobre encapsulamento, voc sabe o que isso? Cpsula nos lembra qualquer forma pequena que protege algo em seu interior, como um medicamento, fruto seco ou mesmo um compartimento para astronautas cheio de instrumentos para uma misso espacial. Voc ver na aula de hoje uma importante caracterstica da Programao Orientada a Objetos, o encapsulamento, que nos ajuda a desenvolver programas com maior qualidade e flexibilidade para mudanas futuras. Objetivos Ao final desta aula, voc ser capaz de: conhecer os conceitos ligados a encapsulamento; entender, atravs de um contra-exemplo (exemplo errado), a importncia do encapsulamento; entender com a correo do exemplo como se aplica essa caracterstica de encapsulamento, to importante para a programao OO.

Encapsulamento

Encapsulamento a caracterstica da OO capaz de ocultar partes (dados e detalhes) de implementao interna de classes do mundo exterior. Graas ao encapsulamento, podemos ver as classes apenas pelos servios (mtodos) que elas devem oferecer para quem as utiliza. No visualizamos, nesse caso, de que forma (como) o servio (mtodo) est implementado internamente na classe. No fundo, o encapsulamento da classe acaba definindo um contrato que determina o que o mundo exterior pode fazer com objetos daquela classe. Na Figura 1, podemos ver que um objeto que possui a caracterstica de encapsulamento fica protegido por uma cpsula. Essa cpsula, que chamamos de interface, serve para ocultar e proteger de outros objetos, os detalhes de

implementao daquele objeto. Dessa maneira, o objeto s disponibiliza, atravs da interface, os servios ou funcionalidades que ele deseja receber mensagens (1) (solicitaes) de outros objetos. (1) Veja mais sobre Troca de Mensagens na aula 4.

Figura 1 Um objeto com encapsulamento

Para facilitar nosso entendimento, vamos a um exemplo. Considere um objeto Automvel que disponibiliza para um objetoPessoa (na OO tudo objeto!) a direo como parte da sua interface, para que se possa guiar o Automvel para a esquerda ou para a direita. Atravs da direo, a Pessoa solicita ao Automvel esses servios, sem saber COMO sero feitos ou esto implementados. Apenas o Automvel sabe que mecanismos sero acionados para atender a solicitao da Pessoa. A Pessoa apenas usufrui do resultado da solicitao. Observe a Figura 2.

Figura 2 Pessoa usando a direo como interface para acessar os servios de Automvel

Podemos dizer, nesse caso, que estamos aplicando a caracterstica de encapsulamento ao objeto Automvel, pois ocultamos do objeto Pessoa os detalhes da implementao dos servios oferecidos pelo Automvel. Voc deve estar se perguntando: como isso acontece na prtica? Antes de mostrarmos a implementao na linguagem Java do uso do encapsulamento, precisamos conhecer os chamadosModificadores de Acesso da linguagem.

Antes, uma explicao...

Quando falarmos em ACESSO, necessrio interpretarmos: o acesso deve-se dar a quem e por quem? Para respondermos, devemos interpretar que o acesso ser ao objeto que possui encapsulamento (ou est encapsulado), e ser feito pelos outros objetos do sistema ou mesmo por voc (programador), que decidir usar determinados objetos durante a construo de seus programas. Outra pergunta seria: acesso a que? Para responder, devemos interpretar como o acesso aos atributos e mtodos do objeto encapsulado. Ento, ACESSO nos traz a interpretao de acessar os atributos e mtodos do objeto que possui encapsulamento pelos outros objetos do sistema ou pelos programadores.

Modificadores de acesso Os Modificadores de Acesso so palavras chave ou reservadas da linguagem Java cuja utilidade permitir ou proibir o acesso aos atributos e/ou mtodos das classes. Veja-os a seguir.

public: garante que o atributo ou mtodo da classe seja acessado ou executado a partir de qualquer outra classe. private: pode ser acessado, modificado ou executado apenas por mtodos da mesma classe, sendo totalmente oculto ao programador (ou outros objetos do sistema) que for usar instncias dessa classe. protected : funciona como o private exceto que as classes filhas ou derivadas tambm tero acesso ao atributo ou mtodo. Veremos mais sobre classes filhas na aula 10. Package ou Friendly: no so palavras reservadas de modificadores de acesso. Os atributos e mtodos so chamados de Package ou Friendly, quando no possuem modificadores, ou seja, so os atributos e mtodos declarados sem modificadores. Isso significa que podem ser acessados por todas as classes pertencentes a um mesmo pacote (pacotes so pastas onde esto inseridos os arquivos das classes, para ajudar a organiz-las. Falaremos sobre pacotes em aulas futuras).

Atividade 1 Relembrando os exemplos apresentados at agora, escolha 3 classes apresentadas e decida quais atributos e mtodos seriam mais convenientes para serem declarados como privados, e quais poderiam ser pblicos.

Agora que vocj conhece os conceitos sobre encapsulamento, vamos ver como isso acontece na prtica.

Um exemplo completo Iremos mostrar um exemplo que demonstre a importncia de se usar o encapsulamento na Programao Orientada a Objetos. Vamos supor que temos uma classe Agenda que guarda apenas uma data e uma anotao importante a ser lembrada, conforme mostra a listagem 1 a seguir.

Listagem 1 Classe agenda

Agora, vamos querer que essa classe anote a informao. Assim, nossa classifica:

Listagem 2 Adicionando comportamento

importante tambm verificar se a data da anotao uma data vlida. Se for uma data vlida registra-se a anotao, caso contrrio a anotao recebe uma informao de data invlida. Assim, nossa classe fica:

Listagem 3 Validao das datas

Voc at agora pode est se perguntando onde est o encapsulamento e aquela conversa toda do incio da aula, no mesmo? Calma! O objetivo desse exemplo mostrar a fragilidade do cdigo que no usa o encapsulamento. Por isso, iremos agora testar nossa classe Agenda com uma aplicao. Para isso, vamos criar dois objetos com a classe Agenda: agenda1 e agenda2. Em seguida, daremos a agenda1 uma anotao com uma data vlida, e a agenda2 uma data invlida. Finalmente, consultaremos os dados dos atributos de cada objeto, em especial a anotao que foi registrada, utilizando o mtodo mostraAnotacao().

Listagem 4 - Testando a agenda

Para a agenda1, anotamos que dia 12 do ms 10 (Outubro) o Dia da Criana, j para a agenda2 anotamos que dia 7 do ms 15 (ms Inexistente) o dia da Independncia do Brasil. Com a sua atual experincia de programador, observando a classe Agenda e os dados inseridos pela classe Principal, o que voc acha que ser impresso aps termos rodado a aplicao? Vejamos ento o resultado.

Figura 3 - Sada impressa no terminal

Perfeito!!! No utilizamos o encapsulamento na classe Agenda e tudo funcionou perfeitamente! Sem nenhuma via de acesso desprotegida, correto? Errado! Vamos identificar a falha da nossa codificao. Veja o que acontece se fizssemos uma mtodo main(), observe a listagem 6 a seguir. pequena modificao no

Listagem 6 - Modificando o mtodo main

O resultado dessa aplicao seria...

Veja que sua Agenda permitiu que voc inserisse uma data invlida para uma anotao. Isso significa que seu cdigo est susceptvel a falhas. Em um programa simples como esse, isso no ir trazer nenhuma dor de cabea. Agora, imagine em um programa real que usado diariamente pelas pessoas. Qual a soluo? Respondendo... A soluo aplicar o encapsulamento.

Aplicando o encapsulamento ao exemplo Codificar em OO usando o encapsulamento nada mais que aplicar os modificadores de acesso s classes. Vamos ver como est a nossa classe Agenda com relao aos modificadores.

Listagem 7 - Exemplo sem modificadores de acesso explcito

A classe Agenda no usa nenhum dos modificadores de acesso de forma explcita. Pela nossa classificao, implicitamente ele est usando o modificador de acesso Package ou Friendly. Vimos, anteriormente, que o modificador de acesso Package permite que classes do mesmo pacote acessem atributos ou mtodos que estejam com tal modificador. Considerando que a nossa classe Principal est no mesmo pacote (veja sobre pacotes na classificao de Package), ento, ele tem acesso aos atributos e mtodos da classe Agenda. Voc pode est perguntando... Quando a classe Principal teve acesso aos atributos da classe Agenda? Respondendo: veja o trecho de cdigo da classe Principal a seguir.

Listagem 8 - Acesso direto aos mtodos e atributos da classe

O mtodo main() da classe Principal est acessando os atributos dia, mes e anotacao da classe Agenda. E modificando as informaes sem passar pelo teste da validao da data. Essa falha na codificao no aceitvel. Vamos ento aplicar o encapsulamento tornando privados os atributos e o mtodo validaData()da classe Agenda com o uso do modificador de acesso private, e permitir os acessos para os mtodos anote() e mostraAnotacao(). Temos:

Listagem 9 - Adicionando explicitamente os modificadores de acesso

Agora, o compilador j no aceita usar os comandos abaixo. Isso causaria erro! Ou seja, os atributos da classe Agenda agora so privados apenas para a uso da prpria classe Agenda, como mostra a listagem 10.

Listagem 10 - Encapsulamento em ao

Com essa modificao, s possvel inserir uma anotao na classe Agenda usando o mtodo anote(). O mtodo anote() garante que a data inserida para a anotao ser validada com o mtodo validaData(), que tambm privado ao uso apenas da classe Agenda.

Atividade 2 1. Continuando a atividade anterior, separe as classes Pessoa e Carro - e adicione os modificadores de acesso de seus atributos e mtodos, verifique e corrija os programas para que no tentem executar uma operao no permitida pelo encapsulamento.

Uma verdade que no pode ser omitida para os programadores: voc pode optar em no usar a caracterstica de encapsulamento em seus cdigos. Mas, isso seria uma pssima prtica e um sinal que voc no um programador que segue as boas prticas. Se voc havia pensado nisso, reveja os conceitos e tente entender a importncia do encapsulamento para seus cdigos

Leitura Complementar Na Wikipdia em portugus, h um pgina exclusiva para encapsulamento, <http://pt.wikipedia.org/wiki/Encapsulamento>, uma leitura rpida e com exemplos em Java.

Resumo Nesta aula, voc viu os conceitos que envolvem o encapsulamento e sua importncia para a programao OO. Os conceitos foram inicialmente ilustrados atravs de um exemplo que no aplicava o encapsulamento, mas, como consequncia, trazia falhas ou erros ao desenvolvimento. Em seguida, aplicamos o encapsulamento ao exemplo e pudemos perceber que ele protegeu a classe Agenda, no permitindo modificaes diretas e indevidas em seus atributos. Nesta aula, voc no estudou a aplicao do modificador de acesso protected porque ele envolve o conceito de herana entre classe,o qual ser abordado posteriormente. Esse ento fica para uma das prximas aulas!

Autoavaliao 1 - Sem consultar o material responda: O que voc entende por encapsulamento? Para que serve? E como aplicar? 2 - Antes de rever os conceitos, para que servem os modificadores de acesso: public private

package

3 - Pense e reflita o que faria voc decidir se um mtodo deve ser usado como privado? 4 - Crie classes chamadas Usuario e Hacker. Hacker possui o mtodo main(). A classe Usuario possui os atributoslogin e senha. Inicialmente, no use encapsulamento e faa com que no mtodo main() de Hacker seja possvel modificar as informaes (login,senha), inicialmente definidas, de um objeto da classe Usurio que voc mesmo criar. Em seguida, aplique encapsulamento e verifique que Hacker ter suas tentativas frustradas.

Referncias DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

Aula 6 Tipos Primitivos em Java

Apresentao Nesta aula, voc vai aprender um pouco sobre os tipos primitivos oferecidos pela linguagem Java. Esses tipos so fundamentais para a construo de programas e sistemas de mdio e grande porte na linguagem. Alm de conhecer os diferentes tipos oferecidos pela linguagem, apresentamos diversos exemplos de como us-los e manipul-los. Finalmente, a aula ser finalizada com uma apresentao mais detalhada da classe String. Objetivos Ao final desta aula, voc ser capaz de: saber quais so os tipos primitivos e respectivas caractersticas existentes na linguagem Java; aprender como manipular alguns tipos numricos; saber sobre a classe String; saber onde podemos declarar as variveis que representam tipos primitivos ou referncias para objetos dentro de uma classe Java.

Tipos Primitivos em Java A linguagem Java oferece um total de 8 tipos primitivos para criao de nossos programas. Tais tipos so usados para declararmos as variveis que auxiliam na

construo dos algoritmos e classes dos programas que descrevemos. A Tabela 1 apresenta um resumo dos tipos primitivos oferecidos pela linguagem.

Tabela 1 Tipos primitivos de Java

Apesar da linguagem Java oferecer tantos tipos, muitos deles so capazes de representar os mesmos tipos de dados, mas com uma capacidade de armazenamento maior (em uma maior quantidade de bits na memria do computador). Variveis do tipo byte, short, int e long, por exemplo, podem ser usadas para representar nmeros inteiros, variando em diferentes faixas de valores (ver detalhes na Tabela), muito embora os tiposint e long sejam os mais usados. O mesmo acontece com variveis do tipo float e double, que so usadas para representar nmeros reais. O tipo boolean usado para declarar variveis que podem assumir um dos seguintes valores:true (verdadeiro) oufalse(falso). Variveis booleanas so bastante usadas para tomadas de decises em comandos condicionais (if) ou de repetio (for, while). Finalmente, o tipo char usado para representar caracteres, como, por exemplo, as letras de alfabetos de lnguas de diferentes pases. Apesar de em alguns programas ser necessrio o uso do tipo char para representar e permitir o processamento de caracteres de uma frase ou texto, por exemplo, o mais comum usar a classe String. Tal classe usada para armazenar um conjunto de caracteres, sendo seu uso bem mais fcil e simples do que usar variveis do tipo char. No final desta aula, aprenderemos um pouco mais sobre o funcionamento e uso da classe String.

Usando os tipos primitivos de Java Para usar os tipos primitivos de Java, basta declarar variveis do tipo especfico que voc deseja usar. possvel tambm j inicializar as variveis no momento da sua declarao. Vejamos alguns exemplos na Listagem 1.

1. 2. 3. 4. 5. 6. 7.

int idade = 18; long tamanho; float salarioFuncionario; double poupanca = 100.0; boolean casado; boolean ferias = false; char caracter1 = A;

Listagem 1 Declarao e inicializao de variveis em Java

Na listagem, podemos observar a declarao de 7 variveis de tipos distintos. Inicialmente, foram declaradas duas variveis de valores inteiro (linhas 01-02). A primeira a varivel idade do tipo int que foi inicializada com o valor 18. A segunda a varivel tamanho do tipo long que no foi inicializada. Cada varivel no inicializada em Java recebe um valor de inicializao (default) dependendo do tipo escolhido. A Tabela 2 apresenta valores default escolhidos. No caso da varivel tamanho, como ela do tipo int, ela inicializada com o valor default inicial zero (0). Logo a seguir (linhas 03-04), foram declaradas duas variveis de valores reais: a varivel salario Funcionario do tipo float, que inicializada com o valor default zero (0,0), e a varivel poupanca do tipo Double,que foi inicializada com o valor 100.0. As variveis booleanas casado eferias (linhas 05-06) podem assumir dois valores, true e false. No caso, a varivel casado iniciada com o valor default false, j a varivel ferias foi inicializada explicitamente com o valor false. Finalmente, declarada a varivel caracter 1 que inicializada com o valor A.

Tabela 2 Valores default de tipos primitivos de Java

Atividade 1 1. Crie, compile e execute uma classe Java, de nomeTesteTiposPrimitivos,com um mtodo main(), que declara as variveis que foram apresentadas na Listagem 1. 2. Em seguida, experimente imprimir o valor de tais variveis usando o mtodo System.out.println(). 3. Observe durante a execuo do programa que variveis no inicializadas tm um valor inicial padro conforme apresentado na Tabela 2.

Regras e convenes para declaraes de variveis Na linguagem Java, existe um conjunto de regras que devem ser seguidas para nomear as variveis. O primeiro smbolo de declarao de uma varivel pode ser uma letra (minscula a at z ou maiscula A at Z), ou um dos seguintes caracteres _ (underscore) ou $ (cifro). Na maioria dos programas, entretanto, comum declarar as variveis com o primeiro smbolo sendo uma letra minscula, conforme foi ilustrado na declarao das variveis da Listagem 1. Os demais smbolos de declarao de uma varivel podem ser, alm de qualquer letra (maiscula ou minscula) e dos caracteres _ e $, tambm algum nmero. Observe, por exemplo, na Listagem 1, a declarao das variveis caracter1esalarioFuncionario. Seguindo as regras acima, o compilador da linguagem Java reclama sempre que declaramos uma varivel comeando com nmeros, ou qualquer outro smbolo que no sejam _ e $. Assim, caso a gente declare as seguintes variveis, o compilador acusar erro:(i) 1minhaVariavel o nome dessa varivel est incorreto, porque inicia com um nmero; e (ii) #nome varivel declarada incorretamente tambm porque se inicia com um #. Alm das regras acima, importante lembrar que existe um conjunto de palavras reservadas (do ingls: keywords) na linguagem Java, como, por exemplo: main, new, while, if, for, int, long, float, double. Tais palavras so reservadas na linguagem para um determinado propsito, e dessa forma o compilador Java no permite que o desenvolvedor declare alguma varivel de forma idntica a alguma das palavras chaves. Veja a listagem de todas as palavras reservadas no quadro 1 a seguir.

Palavras Reservadas da Linguagem Java

Modificadores de acesso Private: acesso apenas dentro da classe. zrotected: acesso por classes no mesmo pacote e subclasses. Public: acesso de qualquer classe. Modificadores de classes, variveis ou mtodos Abstract: classe que no pode ser instanciada ou mtodo que precisa ser implementado por uma subclasse no abstrata. Class: especifica uma classe. Extends: indica a superclasse que a subclasse est estendendo. Final: impossibilita que uma classe seja estendida, que um mtodo seja sobrescrito ou que uma varivel seja reinicializada. Implements: indica as interfaces que uma classe ir implementar. interface: especifica uma interface. Native: indica que um mtodo est escrito em uma linguagem dependente de plataforma, como o C. New: instancia um novo objeto, chamando seu construtor. Static: faz um mtodo ou varivel pertencer classe ao invs de s instncias. Strictfp: usado em frente a um mtodo ou classe para indicar que os nmeros de ponto flutuante seguiro as regras de ponto flutuante em todas as expresses. Synchronized: indica que um mtodo s pode ser acessado por uma thread de cada vez. Transient: impede a serializao de campos. Volatile: indica que uma varivel pode ser alterada durante o uso de threads. Controle de fluxo dentro de um bloco de cdigo Break: sai do bloco de cdigo em que ele est. Case: executa um bloco de cdigo dependendo do teste do switch. Continue: pula a execuo do cdigo que viria aps essa linha e vai para a prxima passagem do loop. Default: executa esse bloco de cdigo caso nenhum dos teste de switch-case seja verdadeiro. Do: executa um bloco de cdigo uma vez, e ento realiza um teste em conjunto com o while para determinar se o bloco dever ser executado novamente. Else: executa um bloco de cdigo alternativo caso o teste if seja falso. For: usado para realizar um loop condicional de um bloco de cdigo. If: usado para realizar um teste lgico de verdadeiro o falso. Instanceof: determina se um objeto uma instncia de determinada classe, superclasse ou interface. Return: retorna de um mtodo sem executar qualquer cdigo que venha depois desta linha (tambm pode retornar uma varivel). Switch: indica a varivel a ser comparada nas expresses case. While: executa um bloco de cdigo repetidamente at que uma certa condio seja verdadeira. Tratamento de erros Assert: testa uma expresso condicional para verificar uma suposio do programador. Catch: declara o bloco de cdigo usado para tratar uma exceo.

Finally: bloco de cdigo, aps um try-catch, que executado independentemente do fluxo de programa seguido ao lidar com uma exceo. Throw: usado para passar uma exceo para o mtodo que o chamou. Throws: indica que um mtodo pode passar uma exceo para o mtodo que o chamou. Try: bloco de cdigo que tentar ser executado, mas que pode causar uma exceo. Controle de pacotes Import: importa pacotes ou classes para dentro do cdigo. Package: especifica a que pacote todas as classes de um arquivo pertencem. Primitivos Boolean: um valor indicando verdadeiro ou falso. Byte: um inteiro de 8 bits (signed). Char: um caracterunicode (16-bit unsigned). Double: um nmero de ponto flutuante de 64 bits (signed). Float: um nmero de ponto flutuante de 32 bits (signed). Int: um inteiro de 32 bits (signed). Long: um inteiro de 64 bits (signed). Short: um inteiro de 32 bits (signed). Variveis de referncia Super: refere-se superclasse imediata. This: refere-se instncia atual do objeto. Retorno de um mtodo Void: indica que o mtodo no tem retorno. Palavras reservadas no utilizadas Const: No utilize para declarar constantes; use publicstatic final. Goto: no implementada na linguagem Java por ser considerada prejudicial . Literais reservados De acordo com a Java LanguageSpecification, null, true e false so tecnicamente chamados de valores literais, e no palavras reservadas. Se voc tentar criar algum identificador com esses valores, voc tambm ter um erro de compilao. Quadro 1 Palavras reservadas da Linguagem Java. Fonte: <http://www.linhadecodigo.com.br/Artigo.aspx?id=83>. Acesso em: 14 maio 2010.

Trabalhando com os valores das variveis Ao longo da criao dos nossos programas, comum, alm de declararmos e inicializarmos as variveis, trabalharmos com ela na lgica do nosso programa. No caso de variveis de tipos primitivos numricos inteiros ou reais, podemos

usar os operadores matemticos tradicionais como soma (+), subtrao (-), multiplicao (*) e diviso (/). A Listagem 2 apresenta diversos exemplos de uso dos operadores. Inicialmente, so declaradas duas variveis (salario1, salario2) do tipo float. Em seguida, uma nova varivel (somaSalario) criada e seu valor inicializado com a soma das variveis salario1 e salario2. A varivel poupanca1 calculada como o dobro do salario1, ou seja, o valor do salario1 multiplicado (operador *) pelo valor 2. A varivel do tipo double gastoMes calculada como a subtrao entre o valor do salario1 e o valor de 590.68. Finalmente, a varivel idade calculada como a subtrao entre dois valores inteiros: 2010(que representa o ano corrente) e 1980(o ano do seu nascimento).

1. 2. 3. 4. 5.

float salario1 = 700.0, salario2 = 855.0; float somaSalario = salario1 + salario2; double poupanca1 = salario1 * 2; double gastoMes = salario1 590.68; int idade = 2010 1980;

Listagem 2 - Manipulao de variveis de tipos numricos

Atividade 2 1. Estenda a classeTesteTiposPrimitivoscriada no exerccio anterior para incluir a declarao de variveis acima. 2. Em seguida, imprima os valores de tais variveis usando o mtodo System.out.println().

A classe String A classe String usada em Java para representar um conjunto de caracteres. Apesar de ser uma classe, a criao de objetos do tipo String no exige o uso da palavra chavenew. A Listagem 3 apresenta a declarao de uma varivel nome1 sendo inicializada com o valorJoo Santos, assim como de outra varivelnome2com o valorMaria das Graas. Observe que para criar objetos do tipo Stringno necessrio criar um objeto usando a palavra-chave new, como pode ser visto no exemplo da varivel nome2.

Uma string em Java nada mais nada menos do que um conjunto de caracteres separados por aspas e que podem ser atribudos diretamente para variveis do tipoString.

A terceira linha da listagem mostra a declarao da varivel frase do tipo String. No caso, est sendo atribudo para ela a concatenao (unio) da varivel nome1 com a string gosta de e, finalmente, a varivel nome2. Observe que essa concatenao feita atravs do operador +. O prprio compilador Java consegue interpretar tais comandos e traduzir para que ocorra uma concatenao de strings em tais casos. Dessa forma, o valor final que a varivel fraseir armazenar ser Joo Santos o pai de Maria das Graas.

1. String nome1 = new String(Joo Santos); 2. String nome2 = Maria das Graas; 3. String frase = nome + o pai de + nome2;

Listagem 3 Declarao e inicializao de variveis em Java

Para imprimir uma varivel do tipo String, possvel usar o comandoSystem.out.println() normalmente, de forma idntica como fazemos com os tipos primitivos. A Listagem 4 mostra uma classe que contm um mtodo main() para impresso das variveis apresentadas na Listagem 3.

1. public class ProgramaPrincipal { 2. public static void main(String args[]) 3. String nome 1 = Joo Santos; 4. String nome2 = Maria das Graas; 5. String frase = nome + o pai de + nome2; 6. 7. System.out.println(nome1); 8. System.out.println(nome2); 9. System.out.println(frase); 10. } 11.}

Listagem 4 Declarao e inicializao de variveis em Java

Atividade 3 1. Crie, compile e nomeTesteStringscom execute uma as variveis do classe de tipo String

declaradas na Listagem 4. 2. Em seguida, estenda o programa criando novas variveis que criam novas frases usando variveis String, por exemplo. 3. Crie variveis com o seu nome e algum da sua famlia. 4. Faa concatenaes das Strings usando o operador +.

Declarao de variveis em classes Em um programa Java, as variveis que declaramos tanto de tipo primitivos quanto de tipos de classes/objetos (como, por exemplo, a classe String) podem ser declaradas e usadas tanto no mtodo main() quanto diretamente como atributos de classes ou variveis locais de mtodos. Na Listagem 5, por exemplo, vemos inicialmente a declarao da varivel idade do tipo inte salario do tipo float na forma de atributos da classe Pessoa. Observe que tais atributos podem ser usados nos mtodos set e get da prpria classe Pessoa. Essas variveis da classe Pessoa so criadas para cada objeto que instanciado em qualquer trecho de um programa Java. Ou seja, se criarmos dois objetos da classe Pessoa, cada objeto ir manter internamente em memria seu prprio nome, idade e salario. Essa situao ilustrada na Listagem 6. Nesse exemplo, vemos a declarao de duas variveis objetos da classe Pessoa (pessoa1, pessoa2), alm de uma varivel inteira (anoAtual) do tipo int. Observe que, logo a seguir, os nomes dos objetos da classe Pessoa, assim como o anoAtual, so tambm impressos.

1. public class Pessoa { 2. // Atributos da classe 3. private String nome; 4. private int idade; 5. private float salario; 6. 7. // Construtor da classe 8. public Pessoa(String nomePessoa, int idadePessoa, 9. float salarioPessoa){ 10. nome = nomePessoa; 11. idade = idadePessoa; 12. salario = salarioPessoa; 13. } 14. // Mtodo set e get de idade 15. public int getIdade(){ 16. return idade; 17. } 18. public void setIdade(int idadePessoa){ 19. idade = idadePessoa; 20. } 21. ...

22.}

Listagem 5 Declarao de variveis em uma Classe

1. public class ProgramaPrincipal { 2. public static void main(String args[]) 3. Pessoa pessoa1 = new Pessoa(Joo, 22, 1500.0); 4. Pessoa pessoa2 = new Pessoa (Maria, 25, 2500.0); 5. int anoAtual = 2010; 6. 7. System.out.println(Nome da pessoa 1: pessoa1.getNome()); 8. System.out.println(Nome da pessoa 2: pessoa2.getNome()); 9. System.out.println(Ano Atual: + anoAtual); 10. 11. } 12.}

+ +

Listagem 6 Declarao de variveis no mtodomain

Leitura Complementar No tutorial oficial da Linguagem Java, voc poder adquirir mais conhecimentos sobre os seguintes assuntos: variveis:

<http://java.sun.com/docs/books/tutorial/java/nutsandbolts/variables.html> tipos primitivos:

<http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html> Strings:

<http://java.sun.com/docs/books/tutorial/java/data/strings.html>

Resumo Nesta aula, voc viu os tipos primitivos da linguagem Java. Voc estudou tambm como manipular esses tipos. Aprendeu sobre a classe String e suas semelhanas com os tipos primitivos. Por fim, voc aprendeu a declarar, modificar os valores e imprimir as variveis de tipos primitivos e String.

Autoavaliao 1 - Crie, compile e execute as classes ProgramaPrincipal e Pessoa apresentadas nas Listagens 5 e 6. 2 - Modifique a classe ProgramaPrincipal para criar trs novos objetos Pessoa, que iro representar algum da sua famlia ou amigos. 3 - Modifique a classe Pessoa para incluir dois novos atributos: (i) estaDeFerias do tipo boolean, sendo inicializada com false; (ii) curso do tipo String para indicar algum curso atual que a pessoa esteja fazendo. Observe que a incluso de tais atributos exige que seja modificado o construtor para ser passado novos parmetros para inicializar os novos atributos. Crie tambm mtodos set() e get() para cada um dos novos atributos. 4 - Modifique a classe ProgramaPrincipal para inicializar os novos atributos criados para a classe Pessoa, assim como os respectivos mtodos de impresso dos dados.

Referncias THE JAVA Tutorials. Disponvel em: <http://java.sun.com/docs/books/tutorial/index.html>. Acesso em: 14 maio 2010.

Aula 7 Comandos da Linguagem

Apresentao Nesta aula, iremos aprender um pouco mais sobre os comandos de fluxo de controle (if, switch) e repetio (while, for), que podemos utilizar na linguagem Java. Tais comandos so tambm fundamentais para a construo de qualquer sistema e elaborao de nossos algoritmos. Objetivos Ao final desta aula, voc ser capaz de: saber quais so os comandos de fluxo de controle e repetio existentes na linguagem Java; usar nas situaes adequadas cada um desses comandos.

Introduo Toda linguagem de programao oferece comandos para o desenvolvimento de nossos programas e algoritmos. Com a linguagem Java, tambm no diferente, ela oferece uma srie de comandos para fluxos de controle e repetio. Uma boa parte de tais comandos so derivados das linguagens C e C++, que serviram de inspirao para a criao de Java. A seguir, voc vai aprender um pouco mais sobre tais comandos.

Comandos condicionais Um dos principais tipos de comandos que existem em muitas linguagens so os comandos condicionais. Eles servem para alterar o fluxo normal de execuo seqencial das instrues do seu programa. Ou seja, eles permitem que sejam feitos desvios ao longo da execuo, afim de executar determinados trechos do programa apenas nas situaes desejadas.

Comando IF Um dos comandos mais conhecidos e usados nas linguagens de programao moderna o comando IF. A palavra IF em ingls significa se em portugus. Ela indica alguma condio de deciso que feita para controlar se um dado trecho de cdigo executado. Em Java, o comando IF pode apresentar duas formas: IF e IFELSE (em portugus: Se Seno).

Listagem 1 Comando IF

Na Listagem 1, apresentada a estrutura mais simples do comando IF. Como pode ser visto, o comando estruturado de tal forma a avaliar uma dada condio. Caso essa condio seja avaliada como verdadeira, o trecho de cdigo que fica no bloco do comando (entre as chaves) executado.

Listagem 2 Exemplo do comando IF

A Listagem 2 mostra um exemplo concreto de tal comando, apresentando a implementao do mtodo imprimirFaixaEtaria()da classePessoa. Observe que no contedo do cdigo usa-se o comando IF para verificar se a Pessoa menor de idade testando se a idade menor que 18 anos. Vimos a primeira forma de utilizao do comando IF, em que o programa s executa certo trecho de cdigo, se e somente se, o teste avaliado tiver resultado verdadeiro. J a segunda forma IF-ELSE fornece outro trecho de cdigo para o caso onde o teste for avaliado como falso. Ele tem a seguinte forma geral:

Listagem 3 Comando IF-ELSE

E para o nosso exemplo teramos:

Listagem 4 Exemplo do comando IF

Inserimos na Listagem 4 o comando ELSE que determina o bloco de comandos a serem executados caso a condio de teste o IF for falsa. Neste caso, mostra que o objeto Pessoa em questo maior de idade.

Comando IF aninhados Aninhar o comando IF significa que podemos colocar comandos IFs dentro de outros comandos IF. Vamos mostrar atravs do refinamento do exemplo anterior.

Listagem 5 Exemplo do comando IF Aninhado

Observe que agora temos outras condies de teste, caso a idade da pessoa seja menor que 18. Nosso programa tambm est analisando se a pessoa criana (linha 15). Assim, como verifica se a pessoa adolescente (linha 17). E, finalmente, temos simplesmente o comando ELSE(linha 19), pois no necessrio testar, uma vez que j sabemos se a pessoa possui idade entre 16 e 17 anos, dado os testes dos IFs anteriores.

Atividade 1 Modifique a classe apresentada na Listagem 5 usando o comando IF de forma aninhada para testar se a Pessoa maior de idade adulto ou idoso. Em seguida, crie um mtodo main()que cria dois objetos da classe Pessoa com idades diferentes, e verifica qual a faixa etria de tais pessoas chamando o mtodoimprimirFaixaEtaria().

Comando SWITCH Outro comando condicional existente na linguagem Java o comando SWITCH (do ingls: desvio, mudar, trocar), assim como o IF, ele permite vrias possibilidades para a execuo do programa. Um detalhe que o SWITCH efetua sua condio de teste apenas nos tipos primitivos: byte, short, char e int. Mas, assim como a avaliao de condio verdadeiro (true)ou falso (false) suficiente para o comando IF, esses tipos so suficientes para tomar todas as decises necessrias para o fluxo de seu programa. A Listagem 6 mostra a estrutura geral do comando SWITCH.

Listagem 6 A forma geral do comando SWITCH

A Listagem 7 mostra como seria o uso do SWITCH para um exemplo de um dos mtodos usado pela classe Automvel. Observe no exemplo que dependendo do valor que a varivel cambio possui podemos imprimir a marcha que foi passada no automvel. Ou seja, caso a varivel cambio possua o valor 1, ser exibida a mensagem Passou a 1 marcha. Vale observar o funcionamento do comando break, pois ele quem define que uma vez encontrado um dadocase (caso), outro caso (case) no ser procurado, ocasionando assim a sada do comando switch.

Listagem 7 Exemplo com o comando SWITCH

Outra possibilidade com o uso do SWITCH a situao em que, para vrias possibilidades, temos o mesmo caminho a seguir. A Listagem 8 mostra um exemplo de tal uso do SWITCH. Como pode ser visto em tal exemplo, caso o sensor disparado seja um dos sensores de 1 a 4, ser mostrada uma mensagem indicando que existe uma porta aberta. Caso seja os sensores 5 ou 6, ser mostrada a mensagem indicando que a mala do carro est aberta. Observe que nesse exemplo a busca s interrompida pelo comandobreak quando se defineo que se deseja fazer (nesse caso, exibir uma mensagem). Pois enquanto o comando SWITCH no encontrar o break, mesmo j tendo encontrado o case, ele continuar verificando os demais casos.

Listagem 8 Comando SWITCH com case sem break

Atividade 2 1. Crie um mtodo publicvoidmudarDirecao(char direo)para a classe Automvelque defina a direo que o automvel deve tomar de acordo com os comandos recebidos. As possibilidades de comandos so: F = Frente, E = Esquerda, D = Direita. Observao Veja as dicas seguintes: defina cases no comando switch usando o tipo primitivo char.; se tiver dvidas na hora de uso do comando SWITCH, releia o exemplo da Listagem 7.

Comandos de repetio Os comandos de repetio das linguagens de programao so responsveis pelas rotinas que ns humanos consideramos tediosas. E isso torna os computadores mais teis. Primeiro, pela capacidade de repetio automtica; segundo, em funo da velocidade pelas quais so processadas. Por exemplo, imagine a tarefa de procurar um nome em um enorme banco de dados, ou uma palavra em vrios textos, ou mesmo efetuar a mesma sequncia de clculos para uma grande lista de valores.

Comando WHILE O comando WHILE (do ingls, Enquanto) repete um comando ou um bloco de comandos enquanto a condio de teste for verdadeira. Ele possui a seguinte estrutura geral:

Listagem 9 Comando WHILE

A Listagem 10 apresenta um exemplo do comando WHILE. No caso, temos um mtodo que inicia uma contagem de 0 a 99 para servir de temporizador para chamar outro mtodo que trava as portas do automvel. Nesse caso, enquanto o contador for menor que 100, o mtodo disparaTravaPortas()no ser executado. E ainda quando executado ser exibido cada valor do contador antes de ser incrementado. Vale observar que a instruocontador++(linha 07) representa o incremento da varivel inteiracontadorem uma unidade, o que significa que sempre que essa linha executada o valor da varivelcontador passa a ser o seu valor atual mais uma unidade.

Listagem 10 Exemplo comando WHILE

Atividade 3 1. Crie um mtodo dentro de uma classe chamada OperacoesNumericas, usando o comando WHILE que possua um contador que v de 100 (cem) at 0 (zero) e imprime apenas os nmeros pares.

Comando DO-WHILE

O comando DO-WHILE tem a mesma finalidade do comando WHILE com apenas uma diferena. A diferena que com o comando WHILE a condio de teste efetuada antes de executar uma instruo ou bloco de instrues, j com o comando DO-WHILE a condio de teste s ser efetuada depois de executar instruo ou bloco de instrues. A Listagem 11 apresenta a forma geral do comando.

Listagem 11 Estrutura geral do comando DO-WHILE

Para entendermos melhor a diferena, vejamos primeiro o exemplo usando WHILE. Para a nossa classe Automvel, considere que para ligar o automvel preciso que o usurio entre atravs do mtodo acesso com uma senha num teclado do painel do carro.

Listagem 12 Exemplo com o WHILE

Observe, na Listagem 12, que aps a senha digitada (linha 10), se a senhaDigitadafor diferente dasenha (=100), o programa entra no WHILE e repetidas vezes pede a senha (linhas 12 e 13) at que o usurio digite a senha correta. Para s ento exibir a mensagem de Acesso Permitido e chamar o mtodo ligarAutomovel().Nesse caso, como o teste do WHILE executado antes das instrues, nosso mtodo tem as linhas 9 e 10 idnticas s linhas 12 e 13. Agora, veja na Listagem 13 o mesmo exemplo usando o DO-WHILE. Observe nesse exemplo, que agora no necessrio repetir as linhas 10 e 11, porque o teste efetuado depois de pedir a senha. E ainda assim funciona exatamente como o comando WHILE.

Listagem 13 Exemplo com o DO-WHILE

Comando FOR Quando usamos os comandos de repetio WHILE e DO-WHILE controladas por contadores muito usualmente, temos que criar uma varivel de controle e iniciar essa varivel antes dos comandos. Dentro do bloco dos comandos, essa varivel ter seu valor modificado para ser comparada na condio de teste. O comando FOR j possui uma estrutura especializada para a implementao de repetio controlada por contadores, que agrupa a inicializao do contador, modificao do contador e condio de teste em um nico comando. A Listagem 14 apresenta a estrutura geral do comando FOR. Na inicializao, onde se define o valor inicial para o contador. Nacondio, onde efetuamos o teste de repetio. E opasso onde o contador sofre a modificao a cada iterao, normalmente o contador pode ser incrementado ou decrementado. O comando FOR interrompido apenas quando a condio de teste tem resultado falso.

Listagem 14 Comando FOR

A Listagem 15 apresenta um exemplo concreto do Comando FOR. Observe que usamos o mesmo exemplo do comando WHILE apresentado na Listagem 10, mas o cdigo ficou mais enxuto devido estrutura do FOR.

Listagem 15 Exemplo do comando FOR Anote a Dica Use o comando WHILE e DO-WHILE quando no se sabe quando vai terminar a repetio. Normalmente, quando no so necessrios contadores. E o comando FOR quando se tem bem definido no trminodo ciclo de repetio. Normalmente, quando os contadores so necessrios. Por exemplo : o FOR no seria muito adequado para implementar os exemplos de leitura de senha a partir do teclado (Listagens 13 e 14).

Listagem 15 Comando FOR aninhado

O FOR Aninhado usado quando se deseja trabalhar com a modificao do passo de dois (ou mais) contadores. Por exemplo: quando se deseja percorrer as informaes contidas em matrizes.

Comando FOR para vetores e colees O comando FOR possui outra estrutura, quando se trabalha com vetores ou colees (do ingls: Arrays eCollections). Vejamos em um trecho de cdigo um exemplo dessa estrutura.

Listagem 16 Comando FOR para vetores e colees

Observe que aqui a ideia de contador est implcita e existe uma varivel do mesmo tipo do vetor (varivel item do tipo int no exemplo) ou o item da coleo que recebe uma nova informao a cada interao at passar por todos os itens do vetor.

Atividade 4 1. Usando o comando FOR, crie uma classe qualquer, que possua diferentes mtodos que faa os seguintes tipos de contagem. a) Contagem e exibio crescente para um dado nmero inicial e final. b) Contagem e exibio decrescente para um dado nmero inicial e final. c) Contagem e exibio de nmeros PARES para um dado nmero inicial e final. d) Contagem e exibio de nmeros MPARES para um dado nmero inicial e final. e) Contagem e exibio de nmeros de passo 2 (contador varia de 2 em 2, ou seja, incrementado em 2 a cada rodada do comando FOR) para um dado nmero inicial e final. f) Contagem e exibio de nmeros de passo 3 (contador varia de 3 em 3, ou seja, incrementado em 3 a cada rodada do comando FOR) para um dado nmero inicial e final. g) Contagem e exibio de nmeros de passo 5 (contador varia de 5 em 5, ou seja, incrementado em 5 a cada rodada do comando FOR) para um dado nmero inicial e final. h) No deixe de criar um mtodo main() na sua classe para fazer uma chamada de teste para cada um dos mtodos acima.

Leitura Complementar Neste artigo, voc ver o assunto da aula de hoje, explicado de outra forma e com algumas informaes que no foram abordadas nesta aula. <http://javafree.uol.com.br/artigo/6946/Cap-4-Controle-de-Fluxo.html>

Resumo Na aula de hoje, voc viu quais so os comandos de fluxo de controle e de repetio da linguagem Java. Estudou as estruturas de cada comando sempre acompanhadas de exemplo concretos, contemplando tambm alguma de suas variaes.

Autoavaliao 1 - Quais so os comandos de controle de fluxo existentes na linguagem Java? 2 - Quando devemos usar os comandos de controle de fluxo? 3 - Quais so os comandos de repetio existentes na linguagem Java? 4 - Quando devemos usar os comandos de repetio?

Referncias THE JAVA Tutorials. Disponvel em: <http://java.sun.com/docs/books/tutorial/index.html>. Acesso em: 17 maio 2010.

Aula 8 Composio ou Agregao

Apresentao Compor, juntar, reunir, formar, constituir... Essas aes nos levama uma ideia muito interessante na programao orientada a objetos, chamada Composio. Nesta aula, voc vai ver esse interessante conceito da POO, que nos d a grande possibilidade da reutilizao de cdigo. Alm disso, a ideia de composio tambm aproxima a ideia da Orientao a Objetos ao senso comum de sistematizao das coisas, em que um objeto mais complexo pode ser composto de partes mais simples. Boa aula!! Objetivos Ao final desta aula, voc ser capaz de: saber o que significa Composio ou Agregao; criar objetos na linguagem Java que so compostos por outros objetos, fazendo uso prtico do conceito de Composio; entender como se comporta os modificadores de acesso de Java na Composio.

Composio ou Agregao Composio ou Agregao um mecanismo de reaproveitamento (reutilizao) de classesutilizado pela POO para aumentar a produtividade e a qualidade no desenvolvimento de software.

Reaproveitamento ou reutilizao de classes significa que voc pode usar uma ou vrias classes para compor outra classe. J o aumento de produtividade est relacionado com a possibilidade de no ser necessrio reescrever cdigo de determinadas classes, se alguma outra j existe com estado (atributos) e comportamento similar. Finalmente, com a composio, possvel tambm aumentar a qualidade dos sistemas gerados, porque h a possibilidade clara de reutilizar classes que j foram usadas em outros sistemas, e, portanto, j foram testadas e tm chances de conter menos erros. Vejamos um exemplo: um carro um objeto COMPOSTO por vrios outros objetos. Ele composto pelos objetos motor, pneus, direo, faris etc. A Figura 1 d uma ideia do conceito de composio para um objeto do tipo Carro.

Figura 1 - Composio do objeto Automvel

Legal no ?!! Isso mesmo que voc entendeu, voc pode criar um objeto a partir de vrios outros objetos. E isso muito natural. Veja o computador que voc est usando, ele um objeto composto por outros objetos: teclado, monitor, placa me, memria, mouse etc. E tem mais, quando uma classe composta de outras classes ela pode tanto usar os objetos que so gerados pelas classes que a compem, como pode tambm usufruir dos atributos e mtodos dessas classes.

Atividade 1 Para praticar o conceito de composio que voc acabou de aprender, tente olhar o mundo ao seu redor, outros exemplos de objetos do mundo real que so compostos por outros objetos menores. Anote tais exemplos para que possamos us-los em outros exerccios ao longo da nossa aula.

Exemplos na prtica Vejamos agora um exemplo na prtica! Vamos utilizar a mesma ideia do objeto Automvel. Dado uma classe Automvel que composta pelas classes Direo e Motor.

Figura 2 - Composio da classe Automvel: motor e direo

Nas linhas de cdigo, essa Composio expressa da seguinte maneira, veja Listagem 1:

Listagem 1 - Classes Motor, Direo e Automvel

Observe que a classe Automvel composta pelas classes Motor e Direo, eis aqui a nossa Composio! Mas, lembre-se de que primeiro criamos as classes Motor e Direo para s a partir da podermos criar a classe Automvel.

Atividade 2 1. Crie, baseado no exemplo apresentado, outras classes compostas de vrias outras classes. Lembre-se: para que uma classe possa compor uma outra necessrio que ela j exista. Elabore tambm classes para os exemplos que voc mesmo criou no exerccio 1. As classes so:

Classe Composta

Classes Componentes (Partes) da Classe Composta

Computador Livro Monstro

Teclado, Monitor, Memria, Placa Me... Ttulo, Autor, Captulo, Editora ... Cabea,Olho,Boca,Brao,Perna...

Mas, o conceito e vantagens do uso da Composio no acabam por a, analisando as classes, vamos increment-las um pouco mais e descobrir os benefcios de se utilizar a Composio. Observe que a classe Automovel possui atributos que so referncias para instncias (1) (objetos) das classes Motor e Direo.Observe que as classes possuem a propriedade doEncapsulamento (visto na aula 5), consequentemente, para acessar os atributos das classes usaremos os mtodos get e set (vistos na aula 2). Assim, nossas classes ficam conforme indicam as listagens a seguir: Listagem 2, Listagem 3 e Listagem 4: (1) Ver aula 3.

Listagem 2 -Classe Motor

Listagem 3 - Classe Direo

Listagem 4 - Classe Automvel

Da maneira que est o cdigo das classes, se ns criarmos um objeto (instanciarmos) da classeAutomvel, os atributos motor e direo continuam com valor nulo (null). Automovelautomovel = newAutomovel(); Isso significa que para instanciarmos os objetos classe Automvel podemos decidir de que maneira faremos. que compem a

A Composio e o mtodo construtor Os mtodos construtores das classes componentes (Motor,Direo) que fazem parte da classe composta (Automvel), podem ser chamados de trs maneiras diferentes, so elas: CASO 1: chamadas nos construtores da classe que composta; CASO 2: chamadas em qualquer mtodo da classe que composta; CASO 3: chamadas fora da classe que composta.

Para mostrar cada uma dessas situaes, vamos considerar inicialmente que a classe Automvel composta apenas pela classe Motor. Acrescentamos dois mtodos construtores para a classeMotor. O primeiro utiliza a potncia do motor 1000 (por default), j o segundo espera que o usurio fornea a informao da potncia do motor quando criado o objeto Motor, veja a Listagem 5.

Listagem 5 - Classe Motor com dois construtores

Listagem 6 - Classe Automvel composta pela classe Motor

CASO 1: chamadas nos construtores da classe que composta

Para a primeira situao, quando o construtor da classe componente chamado no construtor da classe que usa a composio, ilustrada na Listagem 7, temos:

Listagem 7 - Classe Automvel com dois mtodos construtores

Nesse exemplo, os construtores da classe motor so chamados dentro dos construtores da classe Automvel. CASO 2: chamadas em qualquer mtodo da classe que composta

Outra maneira seria a situao, na qual os construtores so chamados em qualquer mtodo da classe que composta. Vejamos a Listagem 8:

Listagem 8 - Construtor chamado a partir de um mtodo

CASO 3: chamadas fora da classe que composta

Por fim, a terceira situao, onde o construtor da classe componente chamado de fora da classe que usa a composio, veja a Listagem 9. Considere que a classe Automvel utilizada possui o cdigo apresentado na Listagem 6.

Listagem 9 -Criao da classe Motor fora da classe Automvel

Observe que o construtor da classe Motor foi chamado de fora da classe Automvel, dentro do mtodo main()da classe. Ou seja, antes de usar o mtodosetMotor() o objeto motor no tem nenhum vnculo com o objeto automvel.

Comparando as possibilidades Observando a Listagem 10, analisaremos as possveis maneiras de criar o objeto da classe componente (Motor) atravs da classe composta (Automvel) ou dentro do mtodo main() que define o comportamento de execuo de um programa Java.

Listagem 10 - Possibilidades de criao da classe Motor para uso pela classe Automvel

Para o caso 1: temos duas possibilidades, na linha 1, ocultado do usurio a existncia de um objeto motor que compe a classe Automvel. J na linha 2, o usurio define a potncia a ser adotada pelo motor do automvel. Para o caso 2, podemos observar na linha 3 que quando criamos o objeto automvel o objeto motor ainda no existe. Ele permanece nulo (null) dentro do objeto motor at que o automvel seja ligado pela primeira vez. Para isso, pode-se usar um dos dois mtodos ligarPrimeiraVez()(linhas 4 e 5), sem ou com parmetro, respectivamente. Finalmente, para o caso 3, apresentado a partir da linha 6, tem-se a mesma observao da linha 3. Nesse caso, o usurio cria normalmente o objeto motor, escolhendo um dos dois construtores (linhas 7 e 8) e, em seguida, define que esse objeto componha o objeto automvel (linha 9.)

Atividade 3 Seguindo o exemplo apresentado para as classes Automvel e Motor, 1. Aplique o caso 1 para a classe Computador que agrega uma placa me, o caso 2 para a classe Livro que agrega seu ttulo e autor, e o caso 3 para a classe Monstro que agrega cabea e boca.

Composio e os modificadores de acesso Duas observaes importantes, podemos considerar com relao composio e aos modificadores de acesso (1). Elas esto mencionadas a seguir. Quando declaramos atributos pblicos nas classes e reutilizamos essas classes dentro de outras, esses atributos podem no ser acessados facilmente, atravs da classe de composio, veja Listagem 11. (1) Veja sobre modificadores de acesso na Aula 5 sobre Encapsulamento.

Listagem 11 - Tentativa de uso de um atributo pblico de um objeto privado

No exemplo acima, apesar do atributo cor da classe Direo ser public, esse atributo no diretamente acessvel a partir do mtodo main(), porque o objeto Direo est encapsulado ( um atributo privado) dentro da classe Automvel. Quando temos atributos privados nas classes e reusamos essas classes, declarando suas instncias como pblicas, os atributos no passam a ser pblicos, veja a Listagem 12.

Listagem 12 - Tentativa de uso de um atributo privado de um objeto pblico.

Aqui o inverso do caso anterior, mas refora que private no deixa de ser privado mesmo quando na classe que usa da Composio (Automvel) torna seu

atributo (Direo) public.

Anote a Dica Quando uma classe usa a Composio para agregar outras classes, podemos dizer que ela tem um relacionamento chamado Tem um, o qual descreve um relacionamento em que uma classe contm uma instncia de outra classe.

Leitura Complementar Como dissemos, na POO, Agregao um conceito bastante similar a Composio, veja um pouco mais sobre agregao no link a seguir: <http://www.dca.fee.unicamp.br/cursos/POOCPP/node14.html>. Na literatura, tambm encontramos autores que fazem diferena entre Agregao e Composio. Eles usam o mesmo raciocnio usado para modelagem de Banco de Dados. tambm uma ideia vlida e interessante. Veja no link a seguir: <http://pt.wikipedia.org/wiki/Classe_%28programa%C3%A7%C3%A3o%29>.

Resumo Nesta aula, voc estudou o que Composio. Viu que composio a capacidade de fazer com que uma classe seja composta de vrios objetos de outras classes. A Composio oferece a possibilidade de fazer uso do comportamento das classes que ela agrega (como atributos) de maneira implcita ou explcita, dependendo da maneira que se escolhe para instanciar as classes componentes.

Autoavaliao 1 - Sem consultar o material, responda: O que voc entendeu por Composio? 2 - Quais so as vantagens de se usar a Composio? 3 - Dos trs casos de instanciao dos objetos componentes, qual voc usaria se quisesse omitir a presena da composio para quem ir criar os objetos das classes que usa a composio? 4 - Crie as classes apresentadas no diagrama abaixo e aplique a Composio para a classe Pessoa, que alm de possuir um atributo Nome ser composta pelas classes Data, Endereoe Contato para os atributosdataNasc, enderecoe contato,respectivamente.

Referncias DEITEL,H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003. SANTOS, Rafael. Introduo programao orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003.

Aula 9 - Arrays, colees e listas

Apresentao Precisamos constantemente manipular muitas informaes e muitos objetos ao mesmo tempo. Para isso, necessria uma estrutura que permita armazen-los e recuper-los sempre que desejarmos. A linguagem Java oferece vrias dessas estruturas de dados em um conjunto de classes chamadas de colees. Tais colees ajudam a armazenar e recuperar nossos objetos dentro de um sistema. isso que voc ver nesta aula. Objetivos

Ao final desta aula, voc ser capaz de: compreender como armazenar objetos em estruturas de dados conhecidas como arrays; conhecer e aprender como usar de forma introdutria, um conjunto de classes da biblioteca padro de Java relacionadas manipulao de colees de objetos.

Armazenando objetos Existem vrias situaes durante a construo de sistemas e programas que precisamos armazenar um nmero expressivo de objetos, onde a criao e manuseio de uma varivel para cada um dos objetos torna-se impraticvel. Esse fato ocorre, por exemplo, quando precisamos armazenar uma lista de alunos de uma turma, ou mesmo da escola inteira, e em um dado momento precisamos recuperar apenas um dos objetos aluno dessa lista. Outro exemplo, seria quando queremos encontrar um nmero de telefone e recorremos lista telefnica, ela nosso repositrio de dados. Imagine termos que criar 100 (cem) variveis para 100 nomes de alunos! possvel criar um tipo especial de varivel para armazenar um nmero especfico de objetos ou valores primitivos. Esse tipo de varivel o que chamamos de array, e ela que veremos na sequncia.

Arrays Considere a seguir um exemplo que motiva o uso de arrays. Constantemente, precisamos tomar nota de um valor que muda ao longo do tempo, e precisamos medir sua mdia, valores mximo e mnimo. Por exemplo, suponha que voc um treinador de um atleta velocista de 100 metros raso, como parte do treinamento,voc ir fazer 5 medies de tiros de 100 metros. Para cada tentativa do atleta, voc vai medir o tempo e colocar o resultado em sua planilha de rendimento. Precisamos armazenar 5 valores numricos reais para representar a marca de tempo obtida. Porm, no podemos criar 5 variveis, e sim, apenas uma para comportar esses valores. Veja tal cdigo na Listagem 1.

Listagem 1 - Declarao de um array

Conforme pode ser observado, um novo operador entrou em cena: o par de colchetes [ e ]. Eles servem para indicar uma dimenso, ou seja, uma posio onde iremos colocar um valor inteiro que indica a quantidade de elementos que precisamos armazenar na varivel em questo (marca). Por conta de tais colchetes, a varivel marcano mais capaz de armazenar um nico valor do tipo double, mas sim ir armazenar um conjunto de valores do tipo double. Dessa forma, caracteriza-se a declarao de uma varivel/atributo do tipo array (tambm chamada de vetor) em Java. Observe que o atributo marca representa um array, mas necessrio o operador new para alocar espao para armazenar o conjunto de valores. Assim, a palavra new usada com o objetivo de indicar quantos valores do tipo Double sero necessrios para armazenar tais valores. A quantidade de valores estipulada para armazenar no array, cinco (5) para o exemplo do atributo marca, um valor que permanece fixo, aps a chamada comnew. Isso significa que no nosso exemplo o atributo marca ser capaz de armazenar 5 elementos. O cdigo logo aps a declarao indica uma atribuio de valor para armazenar uma determinadamarca em cada posio do array. Veja que colocamos um nmero para indicar que posio estamos acessando. Esse valor sempre comea com 0 (zero) e vai at o comprimento do vetor menos uma unidade. No nosso caso, o array marca vai de 0 (zero) a 4 (quatro), compreendendo 5 (cinco) posies conforme foi declarado.

Listagem 2 - Impresso dos valores do Array

Para exibirmos os valores, o programa da Listagem 1pode ser incrementado pelas seguintes linhas de cdigo (Listagem 2). No indicamos a primeira tomada de tempo como sendo o tempo 0 (zero), pois naturalmente costumamos realizar contagens a partir do nmero 1 (um). H outra forma de definir os valores de um array, no momento de sua declarao podemos indicar seus valores, sendo que j precisamos conhec-los de antemo. Veja aListagem 3. Observe que no precisarmos indicar o comprimento do vetor, pois ele sabe de antemo pela quantidade de elementos definidos na sua inicializao.

Listagem 3 - Outra forma de definir os valores de um Array

Tanto na definio do array quanto no acesso para leitura ou escrita de suas posies, possvel usar um comando de repetio para acess-lo diretamente. Na verdade, na programao diria, isso o mais comum. Vejamos como ficaria a exibio dos valores acima com um comando FOR naListagem 4.

Listagem 4 - Impresso dos valores de um array usando comando FOR

Atividade 1 Para praticar o conceito de array, crie um programa que declara uma lista (array) capaz de armazenar 10 (dez) nomes de ferramentas para uso de um mecnico. Inicialize cada uma das ferramentas armazenadas no array, em seguida, imprima cada um deles.

Arrays bidimensionais

Primeiramente, vamos definir o que uma dimenso de um array. A dimenso, ou quantidade de dimenses, o conjunto de valores que precisamos definir para localizar uma informao. Por exemplo, uma lista de alunos de 0 a 100 pode ser organizada em um array de uma dimenso, pois para localizar um aluno nessa lista basta indicar um valor da sequncia. J para localizar uma pea em um tabuleiro de xadrez precisamos de duas coordenadas, linha e coluna. Assim, para representarmos um tabuleiro de xadrez com arrays,so necessrias duas dimenses. A Listagem 5mostra esse exemplo codificado em Java. Suponha que iremos representar um tabuleiro de xadrez com linhas e colunas de 0 (zero) a 7 (sete), compreendendo 8 valores de cada. Vamos tambm supor que cada valor representa uma String com o nome da pea que ocupa a casa. Observe a utilizao de dois valores distintos para localizar uma casa no tabuleiro, e para cada valor um par de colchetes, um par para cada dimenso do array.

Listagem 5 - Exemplo de Array bidimensional

possvel definir n dimenses, porm, na prtica, no comum nem recomendvel trabalhar com tantas dimenses. Na prtica, extremamente comum trabalharmos com apenas 1 (uma), e algumas vezes com 2 (duas), e, quase nunca com 3 (trs) dimenses, pois h outros recursos na programao orientada a objetos que desencorajam e oferecem alternativas melhores a essa prtica.

Atividade 2 1. Observe o tabuleiro da Figura 1abaixo e crie um programa em Java que o represente atravs de um array de duas dimenses, em que cada casa ir conter a sua cor BRANCA ou PRETA, como sendo valores do tipo String. Imprima cada uma das casas do array, aps inici-los. Dica: no tente definir uma a uma, pois sero 64 linhas de cdigos. Ao invs disso, crie estruturas com comandos de repetio para preench-lo e imprim-lo.

Figura 1 - Tabuleiro

Arrays como objetos Vimos que arrays so estruturas para armazenar objetos, tais como Strings. Mas, preciso dizer que arrays so tambm objetos, por isso usado o comando new() para alocar espao de armazenamento para ele. Graas a sua capacidade de se comportar como um objeto, os arrays possuem mtodos e um atributo muito til, o length,que indica seu comprimento. necessrio conhec-lo para no passarmos do limite, e para realizar operaes de manuteno em seus dados. Pois bem, vamos alterar o exemplo anterior (Listagem 1) que exibe os valores do array marcapara utilizar seu atributo length. Tal programa modificado apresentado naListagem 6.

Listagem 6 - Exemplo de uso do atributo lenght de um array

Colees Java A linguagem Java possui um conjunto de classes que servem para armazenar na memria vrios objetos. Tais classes no possuem o inconveniente de termos que saber de antemo a quantidade exata de elementos que iremos armazenar, como no caso de arrays. E em alguns casos, nem mesmo o tipo. H 3 (trs) tipos principais de objetos Java definidos para esse fim, veja-os a seguir.

1. Set representa a mesma ideia de conjuntos da matemtica, ou seja, um grupo de objetos sem ordem definida, porm, nicos. Como mostra a Figura 2.

Figura 2 - Conjunto de objetos

Nunca poderemos prever a ordem com a qual sero apresentados os seus elementos. Essa situao pode no ser um incmodo diante do problema que tivermos. Os sets possuem uma caracterstica importante em relao s buscas de objetos em seu interior, pois no precisam percorrer todos eles. O principal representante dos Set a classe HashSet, vejamos um exemplo da sua utilizao, como mostra a Listagem 7:

Listagem 7 - Exemplo de um Set

2. List como o prprio nome sugere, representa uma lista de objetos, sendo que nela os objetos podem se repetir. Veja a figura.

Figura 3 - Lista de objetos

Nas listas (List) definidas em Java, os objetos armazenados mantm a ordem com que foram adicionados. Uma classe do tipo List bastante utilizada a ArrayList, a qual representa uma alternativa aos arrays convencionais vistos anteriormente. Vejamos um exemplo da utilizao de um ArrayList na Listagem 8:

Listagem 8 - Exemplo de ArrayList

3. Map Mapas so estruturas que relacionam um objeto a outro, por exemplo, um nmero de CEP ao nome de uma rua. Podemos imaginar dois conjuntos, um de campos-chave e outro de objetos-valor que queremos armazenar. Observe aFigura 4:

Figura 4 - Dois conjuntos de objetos

Observe que para encontrarmos nossos objetos precisamos localiz-los atravs de suas chaves. Vejamos uma aplicao desses conceitos na Listagem 9:

Listagem 9 - HashMap na prtica

Os Sets e Lists so do tipo Collection. Apesar de Map no descender de Collection, tambm uma classe que define mtodos de armazenamento e recuperao de objetos.

Figura 5 -Collection e Map

Todas as classes do tipo Set e List descendem (implementam) a interface Collection. Veremos mais detalhes sobre interfaces em aulas futuras. Por hora, podemos entender interfaces como contratos que definem um conjunto de mtodos que devem ser implementados pelas classes. No caso da interface Collection, ela define mtodos para adicionar, remover, verificar a presena de um dado objeto. Tais mtodos devem necessariamente existir em todas as List e Sets definidos para a linguagem Java. Segue abaixo uma lista bsica desses mtodos:

Lista bsica de Mtodos da Interface Collection boolean add(Object) Adiciona um elemento na coleo. Como algumas colees no suportam elementos duplicados (exemplo: Sets), esses mtodos retornam verdadeiro (true) ou falso (false) para indicar se a adio foi bem sucedida. Remove determinado elemento da coleo. Se ele no fizer parte da coleo, retorna falso (false). Retorna a quantidade de elementos presentes na coleo. Procura por um determinado objeto na coleo. Vale salientar: a comparao feita pelo mtodo equals().

boolean remove(Object) intsize() boolean contains(Object)

Anote a Dica As colees Java mantm um mecanismo interno de ordenao e recuperao de dados e para isso fazem uso de tabelas hash. Tais tabelas so utilizadas para que a pesquisa de um objeto seja feita de maneira rpida. Mas, como funciona? Cada objeto classificado pelo seu hashCode, mtodo de java.lang.Object que retorna um int, e com isso podemos agrupar os

objetos por esse valor. Quando realizada uma busca, s percorrido o grupo de objetos com o mesmo hashCode.

Atividade 3 Crie um programa que registra uma lista de compras semanais com itens como: arroz, feijo, carne, po etc. Utilize os trs tipos de colees vistos at aqui: oHashSet, ArrayList e HashMap.

Leitura Complementar Sobre definio de Arrays <http://pt.wikipedia.org/wiki/Array> Java na Wikipdia:

Dois artigos que falam sobre Collections em <http://www.devmedia.com.br/articles/viewcomp.asp?comp=3162> <http://javafree.uol.com.br/artigo/847654/Collections-Framework.html>

Java

Resumo Voc estudou hoje que em sistemas grandes, bastante comum precisarmos de um grande conjunto de objetos. Voc viu que a linguagem Java oferece dois mecanismos para armazenar um grande nmero de objetos: arrays e colees. Agora, voc j sabe que os Arrays permitem armazenar um conjunto de objetos com tamanho fixo definido na sua inicializao. J as colees podem ser usadas para armazenar um conjunto no-finito de elementos, e so implementadas em Java como um conjunto de interfaces, que oferecem um conjunto de mtodos padronizados para armazenamento e recuperao.

Autoavaliao 1 - Elabore um programa que exiba um calendrio do dia 1 ao dia 31, utilizando um array de duas dimenses. 2 - Qual a principal diferena entre um array convencional e a classe ArrayList que voc destacaria? 3 - Que tipo de coleo se assemelha a um conjunto matemtico? Por qu? Explique.

Referncias THE JAVA tutorials. Arrays. Disponvel em: <http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html>. Acesso

em: 15 maio 2010. ______. Lesson: interfaces. Disponvel <http://java.sun.com/docs/books/tutorial/collections/interfaces/index.html>. Acesso em: 15 maio 2010. em:

______. Lesson: implementations. Disponvel em: <http://java.sun.com/docs/books/tutorial/collections/implementations/index.html> . Acesso em: 15 maio 2010.

Aula 10 - Herana

Apresentao Hoje, voc vai aprender sobre mais um pilar de sustentao da Programao Orientada a Objetos: aHerana. Ela considerada um dos conceitos mais importantes na POO. A herana trouxe para a programao um novo olhar sobre a maneira de se programar, at ento no atendido pela Programao Estruturada. Objetivos Ao final da aula, o aluno deve: entender o que Herana; conhecer quais os tipos de Herana existentes em POO; entender o funcionamento da Herana durante a execuo do programa; programar em Java usando a Herana.

Herana Voc j ouviu falar sobre herana relacionada programao? Estranho no ? A Figura 1 mostra os pilares da orientao objetos com destaque para a Herana.

Figura 1 - Orientao a Objetos

Vamos comear pela definio de herana. Herana o mecanismo que permite a uma classe herdar todos os atributos e mtodos de outra classe. Ela permite definir a implementao de uma nova classe na definio de uma classe previamente implementada. Como exemplo, observe a Figura 2 a seguir.

Figura 2 -Exemplo de Herana entre classes

Considere como classes as seguintes abstraes: Transporte, Aqutico, Terrestre, Areo, Barco,Automvel e Avio. Considere capacidade como um atributo da classe Transporte, que indica a quantidade de pessoas que o transporte em questo pode transportar. E nmero de rodas como um atributo da classe Terrestre. E cor, nmero de portas e placa como atributos da classe Automvel. A Figura 2 apresenta um exemplo de Herana, onde as classes Aqutico, Terrestre e Areo herdam da classe Transporte. A classe Barco herda da classe Aqutico. A classe Automvel herda de Terrestre. E, finalmente, Avio de Areo. Um aspecto importante que podemos tambm observar na figura que toda classe que herda de uma outra, acaba herdando tambm, como consequncia, os seus atributos. Por exemplo, de acordo com a Figura 2, a classe Transporte possui um atributo chamado capacidade. Para a classe Aqutico, como ela herda de Transporte, pode-se dizer que tambm possui o atributo capacidade. E Barco, como herda deAqutico, tambm possui o atributo capacidade. Com essa lgica, percebemos que na herana os atributos (e tambm os mtodos) so herdados naturalmente pelas classes subsequentes na hierarquia.

Hierarquia de Classe ou de Herana: o mapeamento do tipo rvore de relacionamentos que se formam entre as classes como resultado da herana. Exemplo: a Figura 2 representa uma hierarquia de herana ou hierarquia de classe. Usando a mesma lgica, responda: Quantos e quais so os atributos da classe Terrestre? E da classeAutomvel? Respondendo: a classe Terrestre possui dois atributos: capacidade (que herdado de Transporte) enmero de rodas. J a classe Automvel possui cinco atributos: capacidade (herdado de Transporte),nmero de rodas (herdado de

Terrestre), cor, nmero de portas e placa. Observe na Figura 2 que, quanto mais alta na hierarquia, est a classe, mais ela tende a ser abstrata em comparao com as suas subsequentes. Ou seja, quanto mais alto na hierarquia, menos definida (abstrata) a classe, e assim ela define menos atributos e mtodos. Isso tambm garante que a classe tenha mais chance de ser reusada por outras classes que herdem da mesma. Entendeu? No, ento vamos ao exemplo da figura. Suponha que a classe Transporte, alm do atributo capacidade, possusse tambm o atributo nmero de rodas. Ou seja, ela passa a ser uma classe mais concreta, menos abstrata. Mas nesse caso, conseqentemente, no seria interessante nem faria sentido para as classesAqutico e Areo herdar os atributos de Transporte (ou herdar de Transporte), pois o atributo nmero de rodas no desejado por tais classes.

Atividade 1 Defina alguns atributos adicionais para as classes Areo e Avio da Figura 2. Em seguida, baseado na hierarquia de herana da qual elas fazem parte, indique quantos e quais so os atributos de cada uma delas.

Termos usados para Herana Na literatura, so encontrados diversos termos para nomear tanto as classes que fornecem a herana quanto as classes que herdam de alguma outra. Veja exemplos de termos usados no Quadro 1 a seguir.

Classes que Fornecem a Herana Superclasse Me Tipo

Classes que Herdam de Outras Subclasse Filha Subtipo

Quadro 1 - Termos usados na Herana

Nota: a classe filha no pode remover os atributos e mtodos da classe me. Abaixo, so apresentados outros termos que so tambm comumente usados.

Ancestral: uma classe que aparece na hierarquia de classes em uma posio acima da progenitora (me). Descendente: dada uma classe, toda classe que aparece abaixo dela na hierarquia uma descendente da classe dada. Raiz (ou Base): a classe topo da hierarquia. Folha: uma classe sem filhas.

Atividade 2 Considerando a hierarquia de herana entre classes da Figura 2, d exemplos de: 1. classes superclasse e subclasse; 2. classe raiz e classe folha; 3. classe ancestral da classe Automvel, superclasse dela; 4. classe descendente da classe Veculo, subclasse dela.

que que

no no

seja seja

Especializao e generalizao Assim como os conceitos de classes Abstratas e Concretas, tem-se tambm nos extremos da rvore hierrquica de herana, os conceitos de Generalizao e Especializao. Na Generalizao, como o prprio nome sugere, h classes mais genricas e abstratas disponveis, as quais podem ser usadas para outras descenderem delas. J a Especializao usada para indicar que classes que esto numa posio inferior na hierarquia possuem estado e comportamento mais especializados, ou seja, com mais detalhes de informaes. A Figura 3 ilustra tais conceitos dentro da hierarquia de classes de transportes, apresentada anteriormente. Como pode ser observado, classes em posio inferior na hierarquia, tal como a classe Automvel, representam especializaes de classes em posio superior (Transporte, Terrestre) na hierarquia. J classes em posio superior, como a classe Transporte, representam generalizaes de classes em posies inferiores (Automvel, Terreste)

Figura 3 -Generalizao e Especializao

Herana mltipla e simples Herana Mltipla: a capacidade de uma classe possuir mais de uma superclasse e herdar as variveis e mtodos combinados de todas as superclasses. Herana Simples: Cada classe pode ter apenas uma superclasse, embora uma superclasse possa ter vrias subclasses. Na linguagem Java, a Herana simples e na codificao usa-se a palavra reservada extends para declarar que uma classe herdeira de outra. Para simular a herana mltipla em Java, usa-se Interfaces. Funcionamento da Herana Voc viu os conceitos sobre Herana, mas importante tambm que possamos entender o que acontece com uma classe que utiliza a Herana durante sua execuo. Para melhor entendermos o funcionamento da Herana durante a execuo do programa, vejamos a Figura 4.

Figura 4 -Herana em ao

Sabemos que quando criamos um objeto, temos uma instncia concreta da classe a qual esse objeto representa. Na Figura 3, esse objeto representado pelo Objeto1. Agora, vamos supor que o Objeto2quer saber o valor do atributoX desse objeto, atravs do envio de uma mensagem. Para obter o valor do atributo X, o Objeto1 sai consultando sua rvore hierrquica de classes at encontrar o atributo solicitado pelo Objeto2. No caso da Figura 4, o objeto consulta a classe da qual ele foi instanciado (ClasseC), no encontrando, consulta a classe me dessa mesma (ClasseB), e assim sucessivamente at encontrar o atributo e o valor. Vale ressaltar que o Objeto1 no percorre toda a rvore hierrquica, percorre o caminho da classe filha em direo classe me. Outro ponto importante que o objeto no acumula todos os atributos das classes que fazem parte da hierarquia de herana, mas apenas os atributos das classes

ancestrais a ele. O usurio (programador ou outros objetos, tal como o Objeto 2 na Figura 4) de um determinado objeto no sabe (nem precisa saber) se o atributo dele ou se o atributo herdado de uma outra classe ancestral dele.

Herana em Java Depois de termos visto os conceitos sobre Herana, vamos finalmente ver a herana nas linhas de cdigo Java. Como mencionamos anteriormente, em Java a palavra-chave extends usada para indicar que uma dada classe herda de outra. A Listagem 1 apresenta exemplos de cdigo em Java, indicando queTerrestre herda de Transporte e que Automvel herda de Terrestre.

Listagem 1 - Exemplo de Herana em Java

Vale lembrar que quando uma classe herda de outra, todos os atributos (e mtodos) da outra classe passam a fazer parte dessa mesma. Isso significa que, para o exemplo acima, o programador (ou outro objeto) pode solicitar classe Automvel, os atributos de Transporte e Terrestre. Os atributos deTerrestre so acessveis na classe Automvel porque a segunda herda da primeira. E os atributos deTransporte so acessveis a Automvel devido ao fato de Terrestre herdar de Transporte. Uma dvida que voc pode estar se perguntando : como os atributos so acessveis se eles esto declarados como private? Respondendo: considere que para os cdigos das classes da Listagem 1 foram declarados os mtodosget e set para cada um dos atributos. Atravs desses mtodos, que so tambm herdados pelas subclasses, podemos acessar facilmente qualquer um dos atributos herdados. Eles s no foram escritos para ressaltarmos a construo extends de Java definir a herana entre classes. Veremos cdigos mais completos na prxima aula.

Anote a Dica

A classe Object: todas as classes em Java descende de uma classe, chamada Object, mesmo que a declarao extendsObject seja omitida. Assim, a classe Object a classe raiz da hierarquia de todas as classes Java, sendo, portanto, ancestral de todas as classes da linguagem.

Anote a Dica Quando uma classe usa a relao de Herana, podemos dizer que essa classe possui um relacionamento chamado um com a classe da qual ela herda. Tal relao tambm indica que uma classe do mesmo tipo que outra. Assim, nos exemplos anteriores, podemos dizer queAutomvel um transporte Terrestre, assim como que Terrestre um (ou tipo de) Transporte.

Leitura Complementar No faz parte desta disciplina falar sobre interfaces. Tambm no mandatrio que voc j domine a simulao de herana mltipla usando interface em Java. Para isso, sugerimos que voc primeiro domine a herana simples para no futuro procurar saber sobre o assunto. Como leitura complementar, propomos o prprio tutorial Java da Sun, que pode ser acessado pelo seguinte endereo: <http://java.sun.com/docs/books/tutorial/index.html> Artigo da web que fala sobre herana: <http://www.tiexpert.net/programacao/java/heranca.php>

Resumo Nesta aula, voc aprendeu que Herana a capacidade que uma classe tem de herdar as caractersticas (atributos) e comportamentos (mtodos) de outra classe. Conheceu como funciona a Herana durante a execuo do programa e quais so os tipos em que ela classificada. Voc viu tambm pequenos exemplos de como aplicar a Herana na prtica. Na prxima aula, continuaremos abordando esse assunto, apresentando mais exemplos interessantes do uso de Herana, atravs da sobreposio de mtodos, construtores e os modificadores na Herana.

Autoavaliao 1 - Sem consultar o material responda: o que voc entendeu por Herana? 2 - Qual a diferena entre Herana simples e Herana mltipla? 3 - Como funcionaria o processo de busca pelos atributos na herana, se

fosse solicitado ao objetoAutomvel a sua capacidade? (Dica: d uma relida na explicao da Figura 3 da nossa aula). 4 - Considerando o cdigo das classes Transporte, Terrestre e Automvel apresentados na Figura 4, finalize a implementao delas, adicionando os mtodos get() eset() para cada um de seus atributos. Em seguida, crie uma classe Principal com um mtodo main() que cria um objeto da classe Automvel, e chama todos os mtodos set() e get() criados, inclusive das classes Transporte e Terrestre. Observe no seu exemplo, que possvel chamar todos os mtodos get() e set() herdados pela classe Automvel. 5 - Das opes abaixo, qual se refere ao conceito de Herana? a) Herana a capacidade de reaproveitar outras classes para compor uma nova classe. b) Herana a caracterstica da OO de ocultar partes da implementao interna de classes do mundo exterior. c) Herana a habilidade de objetos de classes diferentes responderem a mesma mensagem de diferentes maneiras. d) Herana o mecanismo que permite a uma classe herdar todos os atributos e mtodos de outra classe. e) As letras a e d esto corretas

Referncias BARNES, David J.; KLLING, Michael.Programao orientada a objetos com Java. So Paulo: Pearson Prentice Hall, 2004. DEITEL,H. M.; DEITEL, P. J.Java como programar. Porto Alegre: Bookman, 2003. SANTOS, Rafael. Introduo programao orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003. SINTES, anthony. Aprenda a programar orientada a objeto em 21 dias. Traduo: Joo Eduardo Nbrega Tortello. So Paulo: Pearson Education doBrasil, 2002. THE JAVA tutorials.What is inheritance?Disponvel em: <http://java.sun.com/docs/books/tutorial/java/concepts/inheritance.html>. Acesso em: 15 maio 2010. ______. Inheritance.Disponvel <http://java.sun.com/docs/books/tutorial/java/IandI/subclasses.html>. em: 15 maio 2010. em: Acesso

Aula 11 - Herana II

Apresentao Na aula passada, foram dados os primeiros passos sobre o assunto Herana, um dos pilares da POO. Considerando a importncia desse tema, continuaremos a abord-lo na aula de hoje, focalizando, sobretudo, a herana de comportamento (mtodo). Sero tambm apresentados outros exemplos mais sofisticados de implementao de herana na linguagem Java. Objetivos Ao final desta aula, voc deve ser capaz de: relacionar a herana e o modificador de acesso protected; entender o uso da palavra-chave super no contexto de herana entre classes; saber como funciona a herana para os mtodos, durante a execuo do programa.

A Herana e o protected Na aula sobre Encapsulamento (aula 5), voc viu os tipos de modificadores de acesso: public, private e protected. Esse ltimo, ficamos de explicar melhor durante as aulas de Herana. Naquela aula, ns mencionamos que o modificador protected funciona como o private exceto que as classes filhas tambm tero acesso ao atributo ou mtodo declarado como protected. Isso significa que apenas as classes descendentes de uma determinada classe podero ter acesso aos atributos e mtodos declarados com esse modificador.

Listagem 1 - Herana em Java com protected e private Figura 1 - Esquema de Herana

A Figura 1 e a Listagem 1 apresentam o exemplo da aula anterior com algumas pequenas modificaes. As classes Transporte e Terrestre tiveram seus atributos modificados para serem protected, isso significa que apenas classes que pertencem hierarquia de herana podem acessar diretamente esses atributos. Em outras palavras, apenas subclasses (ou classes descendentes) de Transporte e Terrestre tero acesso aos seus atributos protected. A Listagem 2 abaixo mostra a definio de mais um mtodo na classe Automvel, o qual faz acesso aos atributosprotectedcapacidade e numRodas, definidos nas classes ancestrais Transporte e Terrestre, respectivamente. Observe que tais atributos so acessados e usados livremente no mtodo imprimeDadosAutomovel(). Isso s possvel porque agora eles foram declarados como protected.

Listagem 2 -Acesso a atributos protected

A Listagem 3 mostra uma tentativa frustrada de acesso aos atributos capacidade e numRodas herdados pela classe Automvel, dentro de um mtodo main(). Nesse caso, no possvel acessar tais atributos, porque a classe Principal no herda da classe Terrestre e, portanto, no tem direito a acessar os atributos protected.

Listagem 3 -Acesso a atributos protected

Atividade 1 1. Modifique as classes Transporte, Terrestre e Automvel da Listagem 1, para que tenham todos os seus atributos declarados como public. 2. Em seguida, tente novamente compilar e executar tais

classes, juntamente com a classePrincipal da Listagem 3. 3. O que acontece? 4. A compilao e execuo funcionaram corretamente? Se sim, explique o que voc acha que aconteceu.

A Herana e o super Em suas pesquisas em outras fontes (tutoriais na internet, livros), alm do material desta aula, voc pode ter encontrado o uso da palavra (ou operador) super nos cdigos exemplos. A palavra super mais uma das palavras reservadas da linguagem Java que tem uma forte ligao com a herana. A palavra super refere-se classe ancestral imediata da classe, ou seja, a classe me ou super-classe. Ela usada nos construtores para chamada de construtores em cascata das classes mes.

Listagem 4 - Herana em Java com uso do operador super

A Listagem 4 ilustra um exemplo de herana em Java, que faz uso da palavrachave super. Vamos ento entender o que acontece quando usamos o comando super em tais contextos.

Primeiro, observe que o super usado para chamar o mtodo construtor da classe me. Na classe Transporte,como a classe me de Transporte Object (vimos na aula passada que Object o ancestral de todas as classes), o super no tem parmetro. A chamada de super equivale a uma chamada explcita ao construtor sem parmetro da classe Object. J no construtor da classe Terrestre, o super tem como parmetro a capacidade exigida no construtor da classeTransporte. Portanto, a chamada a super na classe Terrestre no fundo a chamada ao construtor deTransporte. J o construtor da classe Automvel, o super tem como parmetros a capacidade e o numRodasexigidos pelo construtor da classe Terrestre. Observando a Listagem 4 d para observar que uma chamada a super ocasiona a invocao do construtor da classe me. Isso acaba permitindo uma chamada em cadeia dos construtores de classes ancestrais, permitindo assim a configurao de todos os atributos herdados da classe. Vale ressaltar que se o construtor no possui parmetro, o compilador Java aceita a omisso do super sem parmetro, porque durante o processo de compilao ele insere explicitamente tal chamada. Para o nosso exemplo, se quisssemos poderamos omitir o super do construtor da classe Transporte.

Anote a Dica Apenas comentrios so permitidos antes da palavra super nos construtores. Assim, no possvel incluir nenhum comando antes de super() no cdigo de mtodos construtores de classes.

Anote a Dica Da mesma maneira que se usa a palavra-chave this para acessar os atributos (ou mtodos) da prpria classe. Pode-se usar super, para acessar os atributos (ou mtodos) da classe me.

Atividade 2 Hoje, os celulares esto cada vez mais sofisticados, mp3, mp4, acesso web, cmera digital... Crie uma hierarquia de classes que possui no topo da hierarquia o celular mais bsico, aquele que simplesmente liga e atende ligaes, e que vai sendo refinada com vrias outras classes que definem celulares mais sofisticados e modernos. Para isso, use a hierarquia e nos construtores das classes use o operador super. Na hierarquia, defina no mnimo trs classes.

Um exemplo completo Vimos at agora diversos exemplos do uso de herana para acessar atributos das classes ancestrais. Vamos mostrar agora a herana utilizando os mtodos dessas classes.

Listagem 5 - Classe Transporte

Listagem 6 - Classe Terrestre

Listagem 7 - Classe Automvel

As Listagens 5, 6 e 7 apresentam o cdigo das classes Veculo, Terrestre e Automvel, incluindo a implementao dos mtodos get e set para cada atributo das classes. Cada um dos mtodos declarados na classe Veculo so herdados pelas classes Terrestre e Automvel, assim como os mtodos declarados pela classe Terrestre so herdados pela classe Automvel, exatamente como ocorre com os atributos. A Figura 8 apresenta um demtodo main() que cria um objeto da classe Automvel, em seguida, chama dois mtodos setCapacidade() e setNumRodas(). Observe pelas

Figuras 5 , 6 e 7 que tais mtodos no pertencem classe Automvel, mas so na verdade herdados de suas ancestrais. Dessa forma, percebe-se claramente que uma vez declarado um mtodo (pblico ou protected) em uma das classes ancestrais, aquele mtodo visvel em objetos das classes filhas.

Listagem 8 - Classe Principal

Um pergunta: ser que a Herana tambm permite o uso de outros mtodos diferentes dos get e set para as classes descendentes? A resposta sim, a Herana serve para todos os mtodos, desde que a classe me permita. Se um mtodo estiver com modificador private, esse mtodo no estar acessvel para classes filhas. Assim, apenas esto acessveis para classes filhas, os mtodos declarados como public e protected na classe me. Vejamos um exemplo do uso de outros mtodos. Vamos acrescentar agora classe Terrestre um mtodo que calcula o nmero de pneus reservas.

Listagem 9 - Classe Terrestre com mtodo calculaNumPneusReserva()

Na Figura 10, vemos a classe Principal modificada para criar um objeto Automvel e acessar diretamente o mtodo calculaNumPneusReserva() que foi herdado da classe Transporte. Como era de se esperar, mesmo o mtodo sendo da classe Terreste a classe Automvel usa sem restrio.

Listagem 10 -Mtodo main modificado

Atividade 3 Continuando a Atividade 2, acrescente agora os mtodos que daro as funcionalidades dos telefones mveis (celulares). Uma observao que os mtodos ligar() e atender() no precisam ser criados novamente nas classes filhas. Uma vez que ele deve est presente na classe Me da hierarquia (celular mais simples).

Funcionamento da Herana para os mtodos A Herana funciona para os mtodos durante a execuo do programa, de maneira similar ao funcionamento para os atributos (ver Aula 10). A Figura 11 ilustra tal situao. Quando o Objeto2 solicita a execuo do metodoX() ao Objeto1, esse ltimo inicialmente procura pelo mtodo na prpria classe C que o define. Caso no encontre, ele sai percorrendo sua rvore hierrquica. Nesse caso, em particular, o metodoX() encontrado logo na primeira classe ancestral visitada, a ClasseB.

Figura 2 - Herana e os mtodos

Leitura Complementar A seguir, temos dois links para artigos da web que tratam sobre Herana: <http://terramel.org/java-quarta-aula-heranca/>

<http://www.dcc.unicamp.br/~cmrubira/aacesta/java/javatut10.html>

Resumo Nesta aula, voc aprendeu que a Herana a capacidade que uma classe tem de herdar as caractersticas e comportamentos (atributos e mtodos) de outra classe. Em particular, foi enfatizado a herana de mtodos entre classes. Voc viu que um mtodo de uma classe me para ser herdado em Java por uma classe filha no pode ser declarado como private.

Autoavaliao 1 - Para que serve o modificador de acesso protected? Como ele funciona no caso de Herana entre classes? 2 - Para que serve a palavra-chave super? D um exemplo concreto do seu funcionamento. 3 - Existe alguma diferena entre o funcionamento da Herana para os atributos e mtodos? 4 - Descreva o que acontece com o acesso aos atributos e mtodos quando so do tipo: public private protected

5 - Crie as classes utilizando o princpio da Herana, obedecendo hierarquia da figura abaixo: (Obs: Para facilitar, substitua na figura o tipo Calendar por String)

a) Acrescente aos construtores a lista de parmetros necessria para instanciar o objeto. Por exemplo, a classe Pessoa deve ter nome, CPF e dataNasc. E essa lista acumulativa, ou seja, o construtor da classe Funcionrio deve ter a lista de seus atributos mais os atributos necessrios para a classe Pessoa. Dica: no deixe de usar a palavra-chave super em cada um dos construtores para chamar o construtor da classe me, passando os atributos que so mantidos por ela e seus ancestrais. b) Insira os seguintes mtodos, para apresentar os valores dos atributos das classes, mostrarPessoa(), mostrarFuncionario(), mostrarChefe() e mostrarAluno(), respectivamente, s classes Pessoa, Funcionrio, ChefeDepartamento e Aluno. Para imprimir os atributos, use o mtodo System.out.println() em cada um dos mtodos. c) Crie uma classe TestaTudo com um mtodo main(), que instancia um objeto de cada uma das classe e exibe os valores dos atributos atravs de chamadas aos mtodos mostrarPessoa(), mostrarFuncionario(), mostrarChefe() e mostrarAluno().

Referncias SANTOS, Rafael. Introduo programao orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003. THE JAVA tutorials. Disponvel em: <http://java.sun.com/docs/books/tutorial/>. Acesso em: 16 maio 2010.

Aula 12 - Polimorfismo

Apresentao Hoje, iremos iniciar o aprendizado do ltimo princpio que serve de base para a Programao Orientada a Objeto o Polimorfismo. Esse princpio tambm aposta na ideia da reutilizao para facilitar o dia a dia da programao. Ele tambm bastante importante tanto para o entendimento de programas OO em Java e outras linguagens, como tambm um mecanismo bastante sofisticado para permitir a reutilizao e flexibilidade durante o desenvolvimento de tais programas. Objetivos Ao final desta aula, voc deve ser capaz de: entender o princpio do Polimorfismo; saber quais so os tipos existentes de Polimorfismo; conhecer Polimorfismo de Sobrecarga, de Sobreposio e de Incluso; saber o que Converso de Tipos.

Polimorfismo O poliformismo deriva da palavra polimorfo, que significa multiforme, ou que pode variar a forma. Para a POO, polimorfismo a habilidade de objetos de classes diferentes responderem a mesma mensagem de diferentes maneiras. Ou seja, vrias formas de responder mesma mensagem. Veja a figura a seguir para entender onde se localiza o pilar do poliformismo dentro da Programao Orientada a Objetos.

Figura 1 - Pilares da POO

Vejamos o seguinte exemplo: um dono de uma fbrica de brinquedos solicitou que seus engenheiros criassem um mesmo controle remoto para todos os brinquedos

de sua fbrica. A nica restrio era que cada brinquedo atendesse aos comandos especficos definidos pelo controle. O controle remoto teria vrios botes, sendo que todos eles seriam teis para todos os brinquedos. Assim, quando o usurio clicasse no boto mover,o controle enviaria o sinal MOVER para todos os brinquedos que estivessem no raio de dois metros. A Figura 2 ilustra tal situao.

Figura 2 -Exemplo de polimorfismo

Assim quando o brinquedo recebe o sinal MOVER, ele se move de acordo com a sua funo. Para o avio, mover significa VOAR, para o barco significa NAVEGAR, e para o automvel CORRER. Observe que os brinquedos respondem ao mesmo sinal de formas diferentes. Temos aqui ento um caso de polimorfismo.

O Polimorfismo permite que diferentes objetos (avio, barco, automvel) respondam uma mesma mensagem (mover) de formas diferentes (voar, navegar e correr).

Atividade 1 Para avaliar seu entendimento, descreva em seu caderno de anotaes uma situao em que acontea o polimorfismo.

Tipos de polimorfismo O Polimorfismo pode ser classificado de trs maneiras: Polimorfismo de Sobrecarga Polimorfismo de Sobreposio Polimorfismo de Incluso

Polimorfismo de sobrecarga Polimorfismo de sobrecarga permite que um mtodo de determinado nome tenha comportamentos distintos, em funo de diferentes parmetros(1) que ele recebe. Cada mtodo difere no nmero e notipo de parmetros. Exemplo Considere uma classe Maior capaz de calcular e retornar o maior entre dois nmeros de tipos diferentes. A Listagem 1 ilustra o cdigo de tal classe. (1) Lembrando: parmetros so as variveis que esto dentro dos parntesis na declarao do mtodo.

Listagem 1 - Polimorfismo de Sobrecarga com tipos de parmetros diferentes

Veja no exemplo uma aplicao prtica do uso do polimorfismo de sobrecarga. Observe que temos vrios mtodos com o mesmo nome, no caso calcMaior(), cujo objetivo indicar qual o maior dentre dois nmeros. O que diferencia cada um deles o tipo de parmetros. No primeiro mtodo, os parmetros so do tipo int. J no segundo mtodo, os dois parmetros so float. Finalmente, no terceiro mtodo, os parmetros so do tipo double. Esses mtodos fazem a mesma coisa (calculam o maior entre dois nmeros), mas de maneiras diferentes, pois recebem e retornam tipos diferentes. Observe agora o ltimo mtodo calcMaior() declarado na classe Maior. Esse mtodo, apesar de diferenciar do anterior pelo tipo de retorno de double para int, no ser aceito pelo compilador Java como um polimorfismo de sobrecarga. O motivo que j existe um mtodo com o nome calcMaior() e dois parmetros do tipo double. Esse mtodo seria aceito se houvesse um nmero diferente de parmetro ou um dos parmetros tivesse o tipo diferente de double. Como mostra a Listagem 2.

Listagem 2 - Polimorfismo de sobrecarga com tipo e nmero de parmetros diferentes

Observe que agora os dois ltimos mtodos possuem nmero e tipos de parmetros diferentes dos mtodos anteriores.

A sobrecarga e os construtores O polimorfismo de sobrecarga normalmente acontece sobre os mtodos construtores, pois comum para uma classe ter vrias maneiras de instanci-la. A Listagem 3 ilustra um exemplo de polimorfismo de sobrecarga nos construtores da classe Pessoa. Observe que so declarados 3 construtores e todos eles tm o mesmo nome da classe. Entretanto, cada um deles recebe um nmero diferente de parmetros. Assim, durante a criao de objetos do tipo Pessoa em um mtodo main, por exemplo, o construtor que ser chamado ir depender da quantidade e parmetros passados durante a invocao do comando new.

Listagem 3 - Polimorfismo de sobrecarga de construtores

A sobrecarga e a converso Converso e sobrecarga frequentemente andam lado a lado.

A Converso a capacidade de um tipo ser convertido em outro tipo de maneira automtica ou pela fora bruta tambm chamada de coero.

Veja o quadro abaixo sobre converso de tipos primitivos.

Converso de Tipos Primitivos Java converte um tipo de dado em outro sempre que isso for apropriado. As converses ocorrem automaticamente quando h garantia de no haver perda de informao. As converses automticas so permitidas para tipos de maior preciso e para tipos de menor preciso. Exemplos de Converses Automticas

So permitidas as converses do tipo byte para o tipo short, de short para int, e assim sucessivamente, at chegar o tipo de maior preciso, que o double. Observe tambm algumas converses permitidas baseadas nas variveis criadas pelas letras no quadro Algumas converses legais.

A converso tambm pode fazer com que um mtodo parea como se fosse polimrfico. A converso ocorre quando um argumento de um tipo convertido para o tipo esperado, internamente. Por exemplo, suponha que a classe Maior, descrita anteriormente, tivesse apenas atributos e mtodos para lidar com o tipo primitivo, conforme ilustra a Listagem 4.

Listagem 4 - Classe Maior com o mtodo calcMaior para os tipos int e float

Agora suponha que em uma aplicao (mtodo main) usamos um objeto da classe Maior, mas, na chamada de seu mtodo calcMaior, fossem passados, ao invs de valores do tipo float, valores do tipoint., conforme ilustra a Listagem 5.

Listagem 5 - Converso automtica de tipos primitivos

Observe que, apesar do mtodo esperar parmetros do tipo float, o compilador aceitou receber parmetros do tipo int, e os converteu automaticamente para float dentro do mtodo calcMaior da classe Maior apresentada na Listagem 5. Nesse caso, parece um caso de polimorfismo de sobrecarga, mas na verdade o que acontece uma converso automtica de tipos.

Atividade 2 Implemente em Java, a classe Brinquedo apresentada na Figura 3 a seguir, aplicando o polimorfismo de sobrecarga nos mtodos apontados pelas setas. Em seguida, escreva um mtodo main que cria diferentes brinquedos fazendo chamadas para seus diferentes mtodos construtores e chamando diferentes mtodos velocidade().

Figura 3 - Esquema da classe brinquedo

Polimorfismo de sobreposio Polimorfismo de sobreposio a redefinio de mtodos em classes descendentes. Ou seja, um mtodo de uma classe filha com o mesmo nome de um mtodo de uma classe me ir sobrepor esse ltimo. Vejamos o exemplo da Figura 4. Como pode ser observado na hierarquia de classes apresentada, existe: (i) uma classeA, que implementa ummetodoX(); (ii)uma classeB, que implementa um mtodo com o mesmo nome; e, finalmente, (iii)umaclasseC, que implementa um mtodoY().

Figura 4 -Sobreposio de mtodos em uma hierarquia de Herana

O que aconteceria do metodoX() ?

se

fosse

solicitado

ao Objeto1 da

classeC

execuo

Conforme voc viu nas aulas anteriores sobre Herana, esse mtodo ser procurado na hierarquia da classe instanciada pelo Objeto1. Devemos observar que, nesse caso, o mtodoX() que tambm implementado na ClasseB, foi encontrado primeiro que o metodoX() da ClasseA. Nesse caso, o mtodo que de fato ser executado ser o da ClasseB. E nesse caso, o metodoX() da ClasseA jamais ser alcanado, a menos que seja criado um objeto da ClasseA. Dizemos ento que ocorreu uma SOBREPOSIO DE MTODO ou um POLIMORFISMO DE SOBREPOSIO. O mtodoX da classeB sobreps (ou redefiniu) o mtodo de sua classe me.

O polimorfismo de sobreposio em Java Considere que a classe Brinquedo (usada no exerccio anterior) possui como descendentes as classesCarro, Avio e Barco, conforme ilustra a Figura 5.

ERROR: undefined OFFENDING COMMAND: ~ STACK: