apostila_programação orientada a objetos

128

Upload: cairo-goncalves

Post on 09-Apr-2016

54 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Apostila_Programação Orientada a Objetos
Page 2: Apostila_Programação Orientada a Objetos

2

Programação Orientada a Objetos

1 – Introdução à Programação Orientada a Objetos

ApresentaçãoNesta disciplina de Programação Orientada a Objetos(POO),você vai estudar os conceitos necessários para se aplicar oparadigma da Orientação a Objetos na programação de computadores. Nas primeiras aulas, você vai estudarbasicamente a teoria e no decorrer do curso iremos colocar em prática os conceitos teóricos aprendidos.

Os exercícios práticos serão desenvolvidos usando a linguagem Java. É natural e previsível que, após esse curso, vocênão seja ainda um excelente programador, pois isso leva anos de prática, mas podemos afirmar que você terá umabase sólida para construir sua carreira como programador utilizando esse que é o principal paradigma dedesenvolvimento de software atualmente, a Orientação a Objetos.

ObjetivosAo final desta aula, você será capaz de:

diferenciar Programação Estruturada e POO; conceituar Classes e Objetos; conceituar Atributos e Métodos; entendera realidade sob o ponto de vista da POO.

Introdução

A Programação Orientada a Objetos (POO) é um paradigma de programação de computadores que usa os conceitosde Objetos e Classes como elementos centrais para representar e processar dados usados nos programas.

Você sabe o que um Paradigma?

Segundo o dicionário Houaiss, paradigma significa modelo, padrão, 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!

Adaptada por Wagner José dos Santos Júnior 2

Page 3: Apostila_Programação Orientada a Objetos

3

Como tudo começou

De acordo com dados bibliográficos, os conceitos da programação orientada a objetos (POO) surgiram no final dadécada de 1960, quando a linguagem Simula-68 introduziu os conceitos de objetos e troca de mensagens paraconstrução de programas.

Tais conceitos foram posteriormente amadurecidos e aprimorados durante a década de 1970 pela linguagem deprogramação Smalltalk, desenvolvida no laboratório de pesquisa da Xerox, nos Estados Unidos. Entretanto, apopularização da POO só se deu ao longo da década 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 nossosestudos de POO. Ela surgiu, oficialmente, em 1995 e também tem uma historinha interessante... mas, essa história sóveremos na próxima 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 idéia de que poderíamosconstruir um programa usando conceitos e abstrações do mundo real, como objetos, troca de mensagens. Houve umdia em que Alan Kay pensou:

Figura 1 –Alan Kay

Conceitos da Programação Orientada a Objetos

Até aqui, você aprendeu o conceito de programação estruturada, na qual um programa é construído por meio defunções e procedimentos. Na programação estruturada na linguagem C, um programa é definido por meio de umafunção principal a qual faz chamadas a outras funções implementadas por nós, programadores.

Na programação OO, a forma de pensar (o paradigma) é diferente. Um programa é visto como um conjunto de objetosque se comunicam através de mensagens. Perceba que a Figura 3 ilustra essa ideia. Cada objeto mantém dadosinternos, chamados de atributos. Dessa forma, um sistema (programa de computador) desenvolvido usando a POOpossui objetos que colaboram entre si, executando tarefas específicas em busca de um objetivo comum.

Figura 3 – Colaboração de Objetos

A Programação Orientada a Objetos está sedimentada sobre quatro pilares derivados do princípio da abstração, são

Adaptada por Wagner José dos Santos Júnior 3

Page 4: Apostila_Programação Orientada a Objetos

4

eles: Encapsulamento, Herança, Composição e Polimorfismo.

O Princípio da abstração é a nossa capacidade de abstrair a complexidade de um sistema e se concentrar em apenaspartes desse sistema, que é o tema central de nosso estudo ou foco em um dado momento.

Por exemplo: quando um médico torna-se um especialista em algum órgão do nosso corpo (exemplo, o coração), eleabstrai sem desconsiderar as influências dos outros órgãos e foca apenas sua atenção nesse órgão. Outro exemplo:quando um engenheiro civil projeta um edifício, ele abstrai a complexidade como um todo e planeja seu projeto empartes: sistema elétrico, hidráulico, estrutural,etc.

Veremos durante todo esse curso cada um desses pilares que compõem a Orientação a Objetos.

Figura 4 – Pilares da Orientação a Objetos

Objetos

O que são objetos? Na programação OO, objetos são usados para representar entidades do mundo real oucomputacional. Ou seja, os objetos são usados para representar aqueles elementos e abstrações que fazem parte dasolução do programa que estamos desenvolvendo.

Se observarmos ao nosso redor, veremos várias entidades ou abstrações as quais podem ser representadas comoobjetos no nosso programa. As pessoas e seus carros podem ser vistas como objetos. Na Figura 5, ilustramos, porexemplo, a pessoa de nome “Camila” que tem um carro “Ferrari”.

Os objetos possuem características pelas quais os identificamos e finalidades para as quais os utilizamos. Essascaracterísticas são tipicamente chamadas de atributos, no linguajar da programação OO. Cada objeto Pessoa, porexemplo, possui um RG, um nome, uma data de nascimento, etc. Já os objetos do tipo Carro possuem um tipo, umacor, uma quantidade de portas. A Figura 5 mostra os diferentes atributos que os objetos “Camila” e “Ferrari” possuem,assim como os valores que estão assumindo.

Finalmente, objetos podem também ter comportamentos associados. Objetos do tipo Pessoa, por exemplo, podemandar, correr ou dirigir carros. Já os objetos do tipo Carro podem ter os seguintes comportamentos: ligar, desligar,acelerar, frear. A Figura 5também ilustra os comportamentos que objetos Pessoa e Carro podem ter.

Assim, na POO os objetos possuem características e comportamentos. As características também podem ser chamadasde dados ou atributos. Enquanto os comportamentos também podem ser chamados de operações ou métodos.

Adaptada por Wagner José dos Santos Júnior 4

Page 5: Apostila_Programação Orientada a Objetos

5

ExemplosCaracterísticas: (dados, atributos)tipo: Ferrariplaca: KZE1018cor: vermelhanúmero de portas: 2

Comportamentos: (operações, métodos)ligardesligaracelerarfrear

Características:nome: Camilacor do cabelo: negrobiotipo: magro

Comportamentos:andarcorrerdirigir Carro

Figura 5 –Exemplos de objetos

Atividade 1

1. Observe os objetos a sua volta, escolha um deles e descreva de 3 a 5 características (atributos) ecomportamentos (métodos).

Classes

Agora que você aprendeu o conceito de Objetos em programação OO, podemos passar para outro ponto da nossaconversa. Podemos dizer que no fundo todos nós pensamos e organizamos o mundo segundo a nossa visão dascaracterísticas e finalidades das coisas, logo pensamos o mundo Orientado a Objetos. É muito comum (e com muitafrequência o fazemos) criar grupos de objetos com base nas suas características e comportamento. Se pensarmos nouniverso de objetos Carro, por exemplo, vamos perceber que todos eles sempre possuem os atributos tipo, cor enúmero de portas. O mesmo vale para o universo de objetos Pessoa, que sempre vão possuir um nome, uma data denascimento e, possivelmente, um RG.

A modelagem e programação de um conjunto de objetos que possuem características (atributos) e comportamentos(métodos) comuns é feita na POO usando o conceito de Classe. Cada classe funciona no fundo como um molde para acriação de um dado objeto. Os objetos são vistos como representações concretas (instâncias) das classes. A Figura 6,por exemplo, ilustra uma classe que representa os objetos Carro. Como pode ser observado, a classe define que objetosdevem ter tipo, cor, placa e número de portas, mas não indica explicitamente quais são seus valores.

Adaptada por Wagner José dos Santos Júnior 5

Page 6: Apostila_Programação Orientada a Objetos

6

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Figura 6 – Classe Carro

A Figura 7 mostra como a partir da classe (entidade abstrata) podemos criar vários objetos diferentes (entidadesconcretas). Dois diferentes carros foram criados tomando como base a estrutura da classe. Outros objetos carro podemser criados usando a classe Carro como molde.

CLASSE →

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Tipo: Porsche

Cor: Cinza

Placa: MHZ-4345

Número de Portas: 2

← OBJETOS →

Tipo: Ferrari

Cor: Vermelho

Placa: JKL-0001

Número de Portas: 4

Classe Carro e dois objetos concretos

Atividade 2

Observando o exemplo da Figura 7, imagine se a classe fosse: Livro, Celular, Mamíferos, Aves e Flores.

1. Como seriam seus objetos?

2. Escreva apenas as características (ou atributos) das classes e objetos!

Atenção – Em alguns livros, esses dois conceitos – classes e objetos – podem ser usados indistintamente.

Adaptada por Wagner José dos Santos Júnior 6

Page 7: Apostila_Programação Orientada a Objetos

7

Exemplos de classes e objetos

Como vimos, diferentes classes (e seus respectivos objetos) podem ser criados em POO, para facilitar a programação dosistema. Na prática, não existem limites ou restrições sobre o que você pode modelar e implementar. A seguir,apresentamos alguns exemplos de classes/objetos para representação de diferentes abstrações em sistemas:

objetos físicos (um livro, uma mercadoria, uma nota fiscal); funções de pessoas para os sistemas (cliente, vendedor); eventos (uma compra, um telefonema); lugares (loja matriz, revenda norte).

Adaptada por Wagner José dos Santos Júnior 7

Page 8: Apostila_Programação Orientada a Objetos

8

2 – Introdução à Java

Apresentação

Vamos conhecer a linguagem Java e aprender um pouco mais sobre sua origem, desde seu surgimento até os diasatuais. Você verá também um dos principais conceitos da Programação Orientada a Objetos – a Classe. Vai aprendertambém como se representa esse conceito na linguagem Java, além de criar características e comportamentos parauma classe.

ObjetivosAo final da aula, você será capaz de:

conhecer um pouco da história da linguagem Java e sua importância no desenvolvimentode software da atualidade;

entender a teoria sobre Classe; entender em detalhes uma classe codificada usando a linguagem Java; criar atributos e métodos em classes Java.

Introdução à linguagem Java

Você já conhece a linguagem Java? Já pesquisou sobre isso? Bem, a linguagem Java é atualmente uma das maisutilizadas e com maior número de programadores no mundo inteiro. Sua popularidade se deve principalmente àsseguintes características: 1. a portabilidade – capacidade de escrever código capaz de ser executado em váriasplataformas e sistemas operacionais; 2. suporte a várias tecnologias (redes, acesso a banco de dados etc.); 3.disponibilidade em vários dispositivos móveis, como celular, palmtop e PDA’s. Outra característica fundamental é seruma linguagem aberta e que evolui de acordo com os desejos da sua comunidade de programadores, além de possuirvárias ferramentas gratuitas disponíveis para os desenvolvedores.

Para saber mais...Funcionamento geral de programas Java

Um arquivo .java quando é compilado, através do compilador Java, torna-se um arquivo .class. Esse .classcontém códigos bytecodes que é a linguagem utilizada pela Máquina Virtual Java (JVM ou Java VM). Veja a Figura 1.

Figura 1 – Conversão de código Java em Linguagem de máquina

A Máquina Virtual Java converte os bytecodes em linguagem de máquina de acordo com o processador docomputador que está sendo executado o programa.

Assim, um mesmo arquivo .class pode ser executado em várias plataformas diferentes, tais comoWindows, Linux, Mac, como mostra a Figura 2. Desde é claro, que o computador possua uma MáquinaVirtual Java.

Adaptada por Wagner José dos Santos Júnior 8

Page 9: Apostila_Programação Orientada a Objetos

9

Figura 2 –Java para os vários Sistemas Operacionais

Histórico

No inicio dos anos 1990,a Sun Microsystems estava implementando um projeto chamado Green Project cujo objetivoera gerar a interação, sem a participação humana, entre os eletrodomésticos comuns usados pelas pessoas. Para aexecução dessa ideia, James Gosling, um dos mentores do projeto, sentiu a necessidade de criar uma nova linguagemque superasse as limitações encontradas na linguagem C. Essa linguagem foi chamada de “OAK” (em portuguêssignifica carvalho) que, segundo conta-se, foi inspirado na árvore que James via janela de seu escritório. Infelizmente, aideia e o projeto original de Oak não obtiveram sucesso!

Entretanto, a Internet estava crescendo e se apresentando como uma nova alternativa de interação. Em maio de 1995,James Gosling adaptou a linguagem OAK para Internet e batizou-a de Java. A linguagem que foi projetada paradispositivos heterogêneos encontrou seu ambiente na rede mundial através de aplicações que podiam ser executadadentro dos browsers nos Applets Java. A partir daí, usuários e fornecedores (como a IBM) cresceram de maneiraassustadora e ela tornou-se a linguagem que se expandiu mais que qualquer outra linguagem da história dacomputação. Hoje, a linguagem Java é referência popular para o desenvolvimento de software na Internet,Celulares, Palmtops, Jogos, Soluções de Negócios, Cartões Inteligentes etc. (Baseado em:<http://pt.wikipedia.org/wiki/Java e http://www.java.com/en/javahistory>. Acesso em: 4 fev. 2010.)

Criação de classes

Falamos que objetos são entidades concretas que possuem características e comportamentos bem definidos, taisobjetos podem ser organizados em grupos de características e comportamentos comuns. Esses grupos são chamadosde classe. Porém, a classe não serve para organizar no sentido de guardar os objetos,ela serve de modelo deconstrução. Para os nossos exemplos, todos os carros (objetos) são da classe Carro, pois possuem as mesmascaracterísticas e comportamentos.

A classe é o modelo ou molde de construção de objetos. O modelo define as características e comportamentos que os objetos irão determinar seus valores

e desempenhar suas ações, respectivamente. A classe é abstrata (não existe concretamente).

Adaptada por Wagner José dos Santos Júnior 9

Page 10: Apostila_Programação Orientada a Objetos

10

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Figura 3–Exemplo da ideia de uma classe Carro

ATENÇÃO: já que as classes não existem concretamente, elas são abstratas, servem apenas para gerar osobjetos.

Atividade 1

Vamos criar a classe Carro em Java? Então, vamos lá!1. Abra um editor de texto qualquer e digite o código mostrado na Listagem 1.2. Salve com o mesmo nome da classe mais “.java”

Palavra obrigatória para indicar a criação de uma classe.

Nome da classe escolhido pelo programador. Por padrão, utiliza-se sempre a primeira letra maiúscula.

Conjunto de características dos objetos da

Classe Carro.

Listagem 1 - Esquema de criação para classe "Carro" em JavaObservação: Esse arquivo será salvo como Carro.java

Perceba que não inserimos no código nada sobre o comportamento dos carros, como andar para frente ou para trás,virar a esquerda/direita, frear etc.

Devemos ter em mente que a linguagem de programação é uma representação do mundo sob um ponto de vista. Vocêse lembra do paradigma? Esse ponto de vista ou paradigma é a orientação a objetos, porém, descrito nas regras dalinguagem, que no nosso caso é a linguagem Java.

Na linguagem Java, as características são chamadas de atributos e são escritas informando o tipo deatributo e o nome do atributo. É necessário escrever um ponto-e-vírgula após a declaração de cada atributo, pois éuma exigência da linguagem Java, bem como o “espaço” em que são definidos os atributos e métodos, que irãorepresentar o comportamento, deverão estar dentro de chaves “{“ e “}”, outra exigência da linguagem Java.

Programar é traduzir uma solução de um problema para uma linguagem de programação. Logo, éimprescindível conhecer as regras da linguagem. O programador é como um intérprete ou tradutor de um idioma paraoutro.

Adaptada por Wagner José dos Santos Júnior 10

Page 11: Apostila_Programação Orientada a Objetos

11

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 numérico inteiro.

Listagem 2 – Classe Pessoa em Java

Veja que uma pessoa, assim como um carro, possui milhares de características, porém, utilizando o princípio daabstração, iremos deixar de fora tudo que não nos interessa, ou que não seja importante ou relevante para o sistemaque estamos desenvolvendo. Ora, se formos programar um sistema para uma locadora de veículos, precisamos saberalgumas informações sobre a pessoa que irá alugar o veículo, como o seu nome, habilitação de condutor, idade e oquemais acharmos relevante. Porém, é muito pouco provável que iremos exigir dados escolares das pessoas, como notasde uma disciplina etc. Para os carros, também há essa observação, pois um sistema de oficina mecânica deveráconhecer mais detalhes “internos” do veículo, como numeração do motor, período das revisões, marcas decomponentes, como amortecedores, dentre outros.

Mas, como saber o que é relevante? Isso é determinado no estudo do problema que pretendemos resolver ecomumente chamamos esse contexto do problema de domínio.

Atividade 2

Na aula anterior, fizemos um exercício que pedia para observar os objetos a sua volta, escolher um delese descrever de 3 a 5 características (que agora chamamos de atributos). Faça o mesmo para dois outrosobjetos e identifique seus atributos. Em seguida, escreva o código das classes que representam taisobjetos na linguagem Java, conforme mostrado nas Listagens 1 e 2.

Adicionando comportamento

Os objetos das classes que criamos, Carro e Pessoa, precisam não só de suas características, mas também decomportamentos que expressem as ações possíveis de serem executadas, pois um carro precisa oferecer funções paraque as pessoas os manobrem. E pessoas, por sua vez, precisam desempenhar suas atividades, como andar, correr,estudar etc. Percebam que falamos da capacidade dinâmica do objeto através dos métodos que possuem.

Vamos dar ações aos nossos carros! Veja a Listagem 3 :

Adaptada por Wagner José dos Santos Júnior 11

Page 12: Apostila_Programação Orientada a Objetos

12

Listagem 3 – Classe Carro com métodos

Observe que adicionamos novas linhas ao código, agora com dois métodos setCor(String cor) e getCor() .Esses métodosservem, respectivamente, para definir ou mudar o valor do atributo “cor” e retornarao valor desse atributo. Situaçãoonde levaríamos o nosso carro a uma equipadora para modificar a sua cor. Atente para o fato de que os atributos sãoalterados por métodos da sua classe.

Atente para o fato de que adicionamos a palavra this antes do atributo cor. Essa palavra-chave serve para que ocompilador possa entender que o atributo cor está recebendo a informação contida no parâmetro cor.

Outra maneira de implementar os métodos sem usar a palavra chave this é apresentado na Listagem 4 . Nesse caso,temos que mudar o nome do parâmetro para “c” evitando um erro de compilação.

Listagem 4 – Classe Carro com métodos sem a palavra chave this

A regra Java para definirmos os métodos é:

Adaptada por Wagner José dos Santos Júnior 12

Page 13: Apostila_Programação Orientada a Objetos

13

Listagem 5 – Exemplos de métodos

Logo, senão construímos outros métodos que acessem e modifiquem os valores dos demais atributos – do tipo placa enumPortas– esses não poderão ser vistos fora do objeto nem alterados.

Com isso, o nosso código ficará um pouco mais longo, veja a Listagem 6:

Adaptada por Wagner José dos Santos Júnior 13

Page 14: Apostila_Programação Orientada a Objetos

14

Listagem 6 – Classe Carro completa

Atividade 3

1. Dando continuidade a Atividade 2, vamos agora acrescentar os comportamentos dos objetos nasclasses, escrevendo o código de seus métodos.

2. De acordo com os exemplos vistos, crie uma classe chamada Livro e especifique os seus atributos emétodos.

Adaptada por Wagner José dos Santos Júnior 14

Page 15: Apostila_Programação Orientada a Objetos

15

Resumo

Nesta aula,você viu um breve histórico da linguagem Java. Conheceu a ideia de concepção de uma classe, comotambém o conceito sobre classes. Você entendeu a criação de uma classe na linguagem Java. Viu também como representar as características e comportamentos, agora chamados, respectivamente, de atributos e métodos em códigoJava. Você aprendeu ainda que a classe organiza as características e comportamentos comuns dos objetos. E que essascaracterísticas (atributos) podem sofrer alterações em suas informações através dos comportamentos (métodos).

Autoavaliação

1. O que é uma classe e para que serve?2. Como se escreve uma classe em Java?3. Como se representam as características em uma classe?4. Quais tipos de atributos você conhece?5. Qual a regra básica de criação de um método de uma classe?

3 – Um Programa em Java e a criação de Objetos

ApresentaçãoNesta aula, você vai colocar seus conhecimentos em prática escrevendo um programa real na linguagem Java, passandopor todos os passos necessários de edição, compilação e execução. Você vai visualizar a transformação do códigofonte .java em código executável .class.

Iremos também aprender como acontece a criação de um objeto, figura central da Programação Orientada a Objetos.

Objetivos

Ao final desta aula, você será capaz de:

aprender como criar um programa executável em Java; aprender como criar um objeto em Java; conhecer o conceito e a criação dos métodos Construtores.

O ponto de partida

Para que um programa Java execute ou “rode”, como costumamos dizer, é necessário que exista um método especialchamado main(...), o qual veremos em detalhe na sequência. Esse método é responsável pelo início da execuçãodo Aplicativo ou Programa escrito em Java.

Aplicativos são programas que podem ser executados sozinhos. A classe que serve de ponto de partida para o aplicativo. Todo aplicativo em Java precisa ter um método main().

publicstaticvoidmain(String arguments[]){ //corpo do método}

Se em um mesmo aplicativo houver mais de uma classe com o método main(),quando ummain de uma dasclasses for executado, os demais serão ignorados enquanto o programa é executado.

Veja só, falamos de aplicativo (ou programa)! Vamos escrevê-lo. Para isso, precisamos do arquivo Carro.java da aula

Adaptada por Wagner José dos Santos Júnior 15

Page 16: Apostila_Programação Orientada a Objetos

16

anterior, veja a Listagem 1:

Listagem 1 – Classe Carro

Precisamos criar outra classe que irá conter o método main() para podermos executar nosso programa, como mostraa Listagem 2:

Adaptada por Wagner José dos Santos Júnior 16

Page 17: Apostila_Programação Orientada a Objetos

17

Listagem 2 – Classe Main

Vamos salvar esse arquivo como Main.java, agora temos dois arquivos Carro.java e Main.java. O método main estávazio, não faz nada, iremos editá-lo para que realize a seguinte sequência:

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 diretório (pasta) chamado poo/aula3 e coloque os arquivos Carro.java e Main.java. Veja o acesso, viacomandos, à pasta aula3 na Figura 1:

Figura 1 –Prompt de comandos com as pastas poo\aula3

2. Compile os códigos com o comando javac. Esse comando executa um programa responsável por traduzir o códigoJava contido nos arquivos .java para arquivos executáveis .class, ou seja, o compilador java ou Java compiler.Veja isso

Adaptada por Wagner José dos Santos Júnior 17

Page 18: Apostila_Programação Orientada a Objetos

18

na Figura 2.

Figura 2 – Compilando os arquivos java

3. Execute o método main() da classe Main. Veja a execução na Figura 3.

Figura 3 – Execução da classe Main

Mas, nada aconteceu ...

Bem, nosso programa executou corretamente, o problema é que não definimos nada no código do método main().Porém, não dizemos nada para ele fazer. Vamos editar o Main.java e testar sua execução repetindo os passos 2 e 3anteriores.

O arquivo Main.java terá uma linha a mais, como mostra a Listagem 3:

Adaptada por Wagner José dos Santos Júnior 18

Page 19: Apostila_Programação Orientada a Objetos

19

Listagem 3 – Método main() com um comando de impressão de informação

Após a execução,obtemos o resultado apresentado na Figura 4:

Figura 4 –Execução do Main com impressão de informação

A nova linha escrita representa um comando responsável por exibir uma mensagem na tela do terminal. Como alinguagem Java é totalmente orientada a objetos, essa instrução é construída como uma chamada do método println()do objeto out da classe System. Mais na frente, veremos em detalhe essa instrução. No momento, basta sabermos quetal chamada imprime mensagens na tela do computador.

Atividade 1

Insira uma instrução que exiba o seu nome e idade na saída do programa.

Adaptada por Wagner José dos Santos Júnior 19

Page 20: Apostila_Programação Orientada a Objetos

20

Criando um Objeto

Vamos criar um objeto da classe Carro, no mundo da programação orientada a objetos chamamos issode instanciação, ou seja, criaremos uma instância da classe Carro.

Um objeto ou instância é criado através do operador new. Vejamos a seguinte instrução na Figura 5:

Figura 5 – Esquema de criação de um Objeto

Toda a manipulação e consulta dos atributos do objeto serão feitas através de sua referência, ou seja, da variável quepossui essa referência para os dados e métodos armazenados na memória.

Nesse instante, nosso carro foi criado, mas nenhum de seus atributos foram ainda definidos. Vamos utilizar o método daclasse Carro para defini-lo como quisermos, para isso, vamos utilizar o conjunto de métodos setAtributo(valor). Vejaa Listagem 5.

Listagem 5 – Definição de atributos usando o método set

Agora, vamos exibir cada atributo com seu respectivo método getAtributo(). Como mostra a Listagem 6 a seguir.

Listagem 6 – Exibição dos valores dos atributos

Logo, a nossa classe Main ficará como mostra a Listagem 7:

Adaptada por Wagner José dos Santos Júnior 20

Page 21: Apostila_Programação Orientada a Objetos

21

Listagem 7 - Método main completo

Repita os passos 2 e 3, anteriores, e você verá a saída do programa apresentada na Figura 6:

Figura 6 – Execução do método main

Adaptada por Wagner José dos Santos Júnior 21

Page 22: Apostila_Programação Orientada a Objetos

22

Atividade 21. Crie no exemplo apresentado outra variável Carro chamada outroCarro.2. Defina valores distintos aos seus atributos através de seus respectivos métodos set e os exiba como foifeito com a variável meuCarro.

Métodos construtores

Você pode estar se perguntando: E se eu quiser, no momento da criação do objeto, passar valores para alguns de seusatributos, como placa e cor, por exemplo? É possível?

É sim!! Para isso, precisamos definir um tipo especial de método chamado construtor. E como seu próprio nome diz,ele constrói e objeto e nesse instante pode definir quaisquer atributos que desejarmos.O método construtor é aquele chamado em um objeto, quando ele é criado, ou seja, quando ele é construído.Mas, se aclasse não tiver método construtor?O objeto ainda pode ser criado usando a instrução (ou operador) new. Mas nessecaso será provavelmente necessário chamar métodos set, como fizemos anteriormente. Definindo os construtores, pode-se estabelecer valores iniciais para os atributos do objeto e chamar métodos de outrosobjetos. As diferenças do construtor para outros métodos é que o construtor sempre tem o mesmo nome da classe enãopossui tipo de retorno.

Considere a seguinte definição de um método construtor na classe Carro adicionando o método construtor mostradona Listagem 8:

Listagem 8 – Construtor para classe carro

Observe que esse método possui o mesmo nome da Classe Carro e não possui tipo de retorno, pois seu retorno, comojá mencionamos, é justamente a referência para o objeto na memória,lembra-se disso?

Atenção, se fizermos apenas essa alteração, iremos nos deparar com um erro de compilação na classeMain. Você sabe por quê?

Toda classe possui um construtor implícito e padrão, sem argumentos, por isso, utilizamos o operador new mais o nomeclasse Carro e os ( ):

Carro meuCarro = new Carro();

Observe que quando utilizamos o operador new não existem argumentos (ou parâmetros)dentro dos parênteses. Issosignifica que podemos estar usando o construtor padrão (ou em inglês:default).

Quando em uma classe define-se outro construtor, não podemos mais usar o construtor padrão, a não ser que se definaexplicitamente um construtor sem parâmetros, como mostra o construtor 1 na Listagem 9. Com isso, a classe Carroficará com dois construtores.

Adaptada por Wagner José dos Santos Júnior 22

Page 23: Apostila_Programação Orientada a Objetos

23

Listagem 9 – Dois construtores para uma mesma classe

Observe que no primeiro construtor nada foi feito, enquanto no segundo os atributos placa e numPortas foraminicializados (receberam valores). Isso significa que existem duas maneiras de se construir um objeto derivado da classeCarro, ou do tipo Carro, com ou sem inicialização 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 utilizeesse objeto.

O que são construtores? Construtores são métodos especiais para a criação e inicialização de novas instâncias de

classe(objetos). Inicializam o novo objeto e seus atributos. Criam todos os outros objetos de que esse objeto necessita. Realiza todas as outras operações 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 operações de que ele precisa para ser inicializado.

Resumo

Com esta aula,você já é capaz de se aventurar na programação orientada a objetos em Java, pois você já sabe comoescrever um código simples e transformá-lo em um código executável. Podemos alterar e acrescentar novas classes aosnossos programas e aos poucos transformá-los em um grande sistema. Você viu também a estrutura de criação de umobjeto em Java, bem como a definição dos valores para os atributos dos objetos. Por fim,você estudou o conceito e aprática sobre os métodos construtores e sua utilidade para a criação dos objetos. Nossa caminhada está apenascomeçando, mas já demos excelentes passos!

Autoavaliação

1. Edite o arquivo Carro.java adicionando mais atributos à classe, como marca, modelo, ano de fabricação,tipo de combustível (á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 parâmetros.

Aula 4 – Sistemas OO

Adaptada por Wagner José dos Santos Júnior 23

Page 24: Apostila_Programação Orientada a Objetos

24

Apresentação

Agora, você será apresentado ao verdadeiro mundo da Orientação a Objetos. Você terá a oportunidade de estudar deque maneira construímos sistemas de grande porte utilizando princípios básicos desse paradigma e mecanismos dalinguagem Java.

Objetivos entender o que é realmente um Sistema OO;

compreender o mecanismo de troca de mensagem entre os objetos.

Sistema = mundo OO

O mundo em que vivemos está repleto de objetos (ou coisas) que nos cercam e fazem a nossa vida ser como é, poissem eles não conseguimos sequer imaginar como seria. Tais objetos definem nosso mundo por possuíremcaracterísticas próprias e se relacionarem entre si.

Nele, vimos carros trafegando pelas ruas, com edifícios que possuem escadas e elevadores; utilizamos nossos objetospessoais, como relógios, óculos e bolsas. Todos têm uma finalidade, atribuímos nomes a eles e os ligamos a pessoase 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 princípio de construçãosemelhante ao mundo que nos cerca.

Um sistema é um verdadeiro mundo orientado a objetos, se a linguagem assim o definir, como é o caso dalinguagem Java. Pois, nela, todo programa por mais simples que seja, até um complexo sistema de controle detráfego aéreo, por exemplo, são feitos por um conjunto de muitos objetos de várias 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 características: nome e para que servem.

Por exemplo, aqui eu tenho um computador na minha frente, então ai vai:Nome: Computador

Serve para: Trabalhar (inclui preparar esta aula), comunicar-me com meus amigos e diversão.

Como foi visto na atividade anterior, praticamente todos os objetos estão relacionados a outros, pois nenhum faztudo sozinho, nem mesmo meu computador de última geração, pois sem a tomada na parede ele não é nada.Os objetos precisam se “comunicar”, ou seja, um objeto aciona um método de outro, e este, por sua vez, de umoutro, e assim por diante. Essa comunicação é realizada através do mecanismo de troca de mensagem.

Vejamos a seguinte situação.

Estou digitando esta aula e sei que está prestes a faltar energia na área do meu escritório, mas preciso revisá-la,então, decido imprimi-la, para poder ler o documento da aula enquanto estiver faltando energia. O meuobjeto Computador não é capaz de sozinho fazer essa tarefa, ele precisa interagir com a impressora. Comomostrado na Figura 1, o computador envia os dados (conteúdo desta aula) em forma de mensagem para aimpressora, que realiza a sua tarefa de imprimir o conteúdo do documento em papel para ser lido à luz natural ou develas.

Adaptada por Wagner José dos Santos Júnior 24

Page 25: Apostila_Programação Orientada a Objetos

25

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 código escrito dentro da classe Main envia uma mensagem para definir um atributo e outra para recuperar aplaca do carro. Em Java, a troca de mensagem representa: (i) a mudança ou leitura do estado interno doobjeto através da alteração de um de seus atributos; ou (ii) a chamada a um dos métodos do objeto querepresentam seu comportamento e as tarefas que são capazes de desempenhar.

Durante a execução de um sistema, que se inicia sempre pelo método main() (não se esqueça!), há várias, milharesde trocas de mensagem entre objetos! Logo, precisamos projetar bem os sistemas e gerenciar a complexidade paraque não se transforme em uma tarefa árdua diária.

Atividade 21. Envie mensagens para o objeto meuCarro definindo seus outros atributos (modificando seu

estado interno), e outras mensagens recuperando esses novos valores (acionando ocomportamento de informar ao mundo exterior seu estado interior).

Nos sistemas orientados a objetos, quando objetos de classes distintas possuem uma troca de mensagens muitofrequente, por possuírem uma autodependência forte, ou cooperarem entre si por objetivos mútuos, é comumestabelecermos um relacionamento entre essas classes.

O nosso exemplo do mundo real expresso através do computador e da impressora possui um relacionamento entreambos, pois quando solicitada a impressão de um documento meu computador já possui um cadastro dasimpressoras de que disponho, caso contrário, terei que instalar uma nova. Logo, a classe Computador possui umrelacionamento com a classe Impressora, se assim formos traduzir para o mundo OO.

Esses relacionamentos costumam ser definidos através de suas cardinalidades.

Mas, o que é isso?

Bem, quando relacionamos coisas no mundo real fazemos isso de forma natural e espontânea, teremos que ser maisobservadores daqui pra frente. Vejamos, quantas pessoas cabem em um automóvel? Na maioria deles, a lotação éde no máximo 5 pessoas, incluindo seu condutor.Mas uma pessoa pode estar em quantos automóveis ao mesmotempo? Até onde as leis da física permitem, só em um, de cada vez!

Chamamos esse relacionamento de um-para-muitos, um (automóvel) para muitos (pessoas). Em outras situações,vemos que um marido é para uma, e somente uma, esposa, e a recíproca é verdadeira, temos então umrelacionamento um-para-um. A outra combinação possível seria muitos-para-muitos, o que verificamos no nossoexemplo computador e impressora, pois do meu computador posso imprimir em várias impressoras e cada uma

Adaptada por Wagner José dos Santos Júnior 25

Page 26: Apostila_Programação Orientada a Objetos

26

dessas podem receber documentos dos outros computadores do escritório.

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 elétrica do meu escritório.

Continuando nosso programa...

Vamos ligar a classe Carro à classe Pessoa, fazendo com que uma pessoa possua um carro e esse carro só possapertencer a uma única pessoa. É o que chamados de relação um-para-um.

Camila possui um carro vermelhoFigura 2 –Exemplo de relacionamento entre objetos

A classe Carro precisa “saber que pertence” a alguém. Iremos adicionar um atributo chamado dono, que é do tipoPessoa. Exibindo a lista de atributos de Carro após a mudança:

Listagem 2 –Codificação do relacionamento entre as classes Carro e Pessoa

E os respectivos métodos get e set:

Adaptada por Wagner José dos Santos Júnior 26

Page 27: Apostila_Programação Orientada a Objetos

27

Listagem 3 –Métodos que relacionam Carro a Pessoa

Vamos utilizar esse relacionamento no exemplo seguinte:

Listagem 4 –Programa exemplo do relacionamento Carro e Pessoa

Adaptada por Wagner José dos Santos Júnior 27

Page 28: Apostila_Programação Orientada a Objetos

28

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 classePessoa, e esse recebe uma mensagem para que retorne o seu nome.

A troca de mensagens é comumente denominada de chamada de método

Até agora,você estudou a troca de mensagens entre objetos para definir ou recuperar algum atributo, unicamente.Os sistemas OO precisam de métodos mais complexos, que verifiquem a validade dos dados, realizem atualizaçõesem outras entidades, pesquisem em banco de dados, escrevam em arquivos de log, atualizem objetos da interfaceetc.

Vamos colocar um pouco da complexidade do mundo real no nosso programa?!Vamos lá!

Faremos as seguintes alterações:

1- Adicionar os métodos ligar(), desligar(), acelerar(), frear() à classe Carro.

Listagem 6 –Novos métodos para a classe Carro

Adaptada por Wagner José dos Santos Júnior 28

Page 29: Apostila_Programação Orientada a Objetos

29

2 - Vamos adicionar à classe Carro, ainda, um atributo câmbio 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 métodos da classe Carro

3 - Precisamos colocar uma referência do automóvel dentro da classe Pessoa.

Listagem 8 –Métodos que implementam o relacionamento entre Carro e Pessoa

4 - Vamos adicionar outros métodos à classe Pessoa para interagir (trocar mensagens) com seu carro.

Adaptada por Wagner José dos Santos Júnior 29

Page 30: Apostila_Programação Orientada a Objetos

30

Listagem 9 –Classe Pessoa recebe métodos 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.

Adaptada por Wagner José dos Santos Júnior 30

Page 31: Apostila_Programação Orientada a Objetos

31

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

O que podemos ver é que o método Main envia uma mensagem para o objeto pessoa, que, por sua vez, manda ourepassa essa mensagem para seu objeto da classe Carro, que executa a ação final desejada, que consiste em guiá-lo. Veja a ilustração a seguir:

Adaptada por Wagner José dos Santos Júnior 31

Page 32: Apostila_Programação Orientada a Objetos

32

Figura 3 – Envio de mensagens entre objetos

Resumo

Nesta aula, você ampliou os horizontes. É importante que neste ponto você revise o que foi visto até agora, pois oselementos fundamentais da orientação a objetos e os mecanismos básicos da linguagem Java foram apresentados ecombinados para gerar uma aplicação simples, mas bastante significativa. Os sistemas são arranjos complexos deobjetos que se relacionam trocando mensagens entre si e cooperando para atingir objetivos planejados pelo seuprogramador. É necessário um bom planejamento para manter a complexidade do sistema sob controle.

Autoavaliação1 – O que é a troca de mensagens entre objetos?

2 – Como os sistemas OO implementam sua solução?

3 – Dos exemplos apresentados, identifique os trechos onde há troca de mensagens envolvendo objetosdas classes Carro e Pessoa.

Adaptada por Wagner José dos Santos Júnior 32

Page 33: Apostila_Programação Orientada a Objetos

33

Capítulo 5 – Encapsulamento

Apresentação

Nesta aula, vamos aprender sobre encapsulamento, você sabe o que é isso? Cápsula nos lembra qualquer formapequena que protege algo em seu interior, como um medicamento, fruto seco ou mesmo um compartimento paraastronautas cheio de instrumentos para uma missão espacial. Você verá na aula de hoje uma importantecaracterística da Programação Orientada a Objetos, o encapsulamento, que nos ajuda a desenvolver programas commaior qualidade e flexibilidade para mudanças futuras.

ObjetivosAo final desta aula, você será capaz de:

conhecer os conceitos ligados a encapsulamento; entender, através de um contra-exemplo (exemplo errado), a importância do encapsulamento;

entender com a “correção” do exemplo como se aplica essa característica de encapsulamento,tão importante para a programação OO.

Encapsulamento

Encapsulamento é a característica da OO capaz de ocultar partes (dados e detalhes) de implementaçãointerna de classes do mundo exterior.

Graças ao encapsulamento, podemos ver as classes apenas pelos serviços (métodos) que elas devem oferecer paraquem as utiliza. Não visualizamos, nesse caso, de que forma (como) o serviço (método) está implementadointernamente na classe. No fundo, o encapsulamento da classe acaba definindo um contrato que determina o que omundo exterior pode fazer com objetos daquela classe.

Na Figura 1, podemos ver que um objeto que possui a característica de encapsulamento fica protegido por umacápsula. Essa cápsula, que chamamos de interface, serve para ocultar e proteger de outros objetos, os detalhes de

Adaptada por Wagner José dos Santos Júnior 33

Page 34: Apostila_Programação Orientada a Objetos

34

implementação daquele objeto. Dessa maneira, o objeto só disponibiliza, através da interface, os serviços oufuncionalidades que ele deseja receber mensagens (1) (solicitações) 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 Automóvel que disponibiliza para umobjeto Pessoa (na OO tudo é objeto!) a direção como parte da sua interface, para que se possa guiaro Automóvel para a esquerda ou para a direita. Através da direção, a Pessoa solicita ao Automóvel esses serviços,sem saber COMO serão feitos ou estão implementados.

Apenas o Automóvel sabe que mecanismos serão acionados para atender a solicitação da Pessoa.A Pessoa apenas usufrui do resultado da solicitação. Observe a Figura 2.

Figura 2 – Pessoa usando a direção como interface para acessar os serviços de Automóvel

Podemos dizer, nesse caso, que estamos aplicando a característica de encapsulamento ao objeto Automóvel, poisocultamos do objeto Pessoa os detalhes da implementação dos serviços oferecidos pelo Automóvel.

Você deve estar se perguntando: como isso acontece na prática?

Antes de mostrarmos a implementação na linguagem Java do uso do encapsulamento, precisamos conhecer oschamados Modificadores de Acesso da linguagem.

Modificadores de acesso

Os Modificadores de Acesso são palavras chave ou reservadas da linguagem Java cuja utilidade é permitir ouproibir o acesso aos atributos e/ou métodos das classes. Veja-os a seguir.

public: garante que o atributo ou método da classe seja acessado ou executado a partir de qualqueroutra classe.

private: pode ser acessado, modificado ou executado apenas por métodos da mesma classe, sendo

Adaptada por Wagner José dos Santos Júnior 34

Page 35: Apostila_Programação Orientada a Objetos

35

totalmente oculto ao programador (ou outros objetos do sistema) que for usar instâncias dessa classe.

protected : funciona como o private exceto que as classes filhas ou derivadas também terão acesso aoatributo ou método. Veremos mais sobre classes filhas adiante.

Package ou Friendly: não são palavras reservadas de modificadores de acesso. Os atributos e métodossão chamados de Package ou Friendly, quando não possuem modificadores, ou seja, são os atributos emétodos declarados sem modificadores. Isso significa que podem ser acessados por todas as classespertencentes a um mesmo pacote (pacotes são pastas onde estão inseridos os arquivos das classes,para ajudar a organizá-las. Falaremos sobre pacotes em aulas futuras).

Atributos de objetos (de instância)Um atributo de objeto (também conhecido por atributo de instância) é uma variável declarada sem o modificador static. Os atributos de instância pertencem (são associados) aos objetos e não às classes. Quando um atributo de objeto é modificado, somente o objeto a que ele pertence enxerga a alteração (isso porque cada objeto possui o seu). Um atributo de objeto (ou instância) é criado quando o objeto é criado (comando new) e é destruído quando o objeto a que pertence for destruído.

Veja o exemplo:

class Empregado{

public int cargo;

public void contrataComoProgramador(void){ cargo = 2; // Dois é o código de programador }

}

Para acessar o atributo de objeto em um método pertencente à mesma classe da qual o objeto foi criado (ou seja, um método também pertencente ao objeto), simplesmente especifique o nome do atributo (o nome da variável).

Atributos de classesUm atributo de classe é um atributo declarado com o modificador static. Os atributos de classe são associados coma classe e não com os objetos (ou instâncias) criados a partir dela. Isso significa que quando um atributo de classe é modificado, todos os objetos criados a partir da mesma classe enxergam a alteração. Veja o exemplo:

class Empregado{

static int numeroDeEmpregados; // atributo de classe

public int cargo; // atributo de instância (objeto)

}

class ProgramaExemplo3 {

public static void main(String parametros[]){

Empregado empregado1 = new Empregado(); // cria um objeto empregado empregado1.numeroDeEmpregados = 1;

empregado1.cargo = 2;

Empregado empregado2 = new Empregado(); // cria um novo empregado

empregado2.cargo = 3;

empregado2.numeroDeEmpregados = 2; // modifica a variável de classe

System.out.println(empregado1.cargo); // imprime o cargo do empregado1

System.out.println(empregado1.numeroDeEmpregados); // vai mostrar 2 // porque a variável numeroDeEmpregados é da classe Empregado (inteira) // e não somente do empregado1 ou do empregado2

System.out.println(empregado2.cargo); // imprime o cargo do empregado2

}

Adaptada por Wagner José dos Santos Júnior 35

Page 36: Apostila_Programação Orientada a Objetos

36

}

Constantes

Atividade 1

Relembrando os exemplos apresentados até agora, escolha 3 classes apresentadas e decida quaisatributos e métodos seriam mais convenientes para serem declarados como privados, e quaispoderiam ser públicos.

Um exemplo completo

Iremos mostrar um exemplo que demonstre a importância de se usar o encapsulamento na Programação Orientada aObjetos.

Vamos supor que temos uma classe Agenda que guarda apenas uma data e uma anotação importante a serlembrada, conforme mostra a listagem 1 a seguir.

Listagem 1 –Classe agenda

Agora, vamos querer que essa classe anote a informação. Assim, nossa classe fica:

Listagem 2 – Adicionando comportamento

É importante também verificar se a data da anotação é uma data válida. Se for uma data válida registra-se aanotação, caso contrário a anotação recebe uma informação de data inválida. Assim, nossa classe fica:

Adaptada por Wagner José dos Santos Júnior 36

Page 37: Apostila_Programação Orientada a Objetos

37

Listagem 3 – Validação das datas

Você até agora pode está se perguntando onde está o encapsulamento e aquela conversa toda do início da aula, não é mesmo?Calma! O objetivo desse exemplo é mostrar a fragilidade do código que não usa o encapsulamento. Por isso, iremos agora testar nossa classe Agenda com uma aplicação.

Para isso, vamos criar dois objetos com a classe Agenda: agenda1 e agenda2. Em seguida, daremos a agenda1 – uma anotação com uma data válida, e a agenda2 – uma data inválida. Finalmente, consultaremos os dados dos atributos de cada objeto, em especial a anotação que foi registrada, utilizando o método mostraAnotacao().

Adaptada por Wagner José dos Santos Júnior 37

Page 38: Apostila_Programação Orientada a Objetos

38

Listagem 4 - Testando a agenda

Para a agenda1, anotamos que dia 12 do mês 10 (Outubro) é o Dia da Criança, já para a agenda2 anotamos quedia 7 do mês 15 (mês Inexistente) é o dia da Independência do Brasil.

Com a sua atual experiência de programador, observando a classe Agenda e os dados inseridos pela classe Principal,o que você acha que será impresso após termos rodado a aplicação? Vejamos então o resultado.

Figura 3 - Saída impressa no terminal

Perfeito!!! Não utilizamos o encapsulamento na classe Agenda e tudo funcionou perfeitamente! Sem nenhuma via deacesso desprotegida, correto? Errado! Vamos identificar a falha da nossa codificação.

Veja o que acontece se fizéssemos uma pequena modificação no método main(), observe a listagem 6 a seguir.

Listagem 6 - Modificando o método main

O resultado dessa aplicação seria...

Adaptada por Wagner José dos Santos Júnior 38

Page 39: Apostila_Programação Orientada a Objetos

39

Veja que sua Agenda permitiu que você inserisse uma data inválida para uma anotação. Isso significa que seu códigoestá susceptível a falhas. Em um programa simples como esse, isso não irá trazer nenhuma dor de cabeça. Agora,imagine em um programa real que é usado diariamente pelas pessoas.

Qual é a solução?

Respondendo... A solução é 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 relação aos modificadores.

Adaptada por Wagner José dos Santos Júnior 39

Page 40: Apostila_Programação Orientada a Objetos

40

Listagem 7 - Exemplo sem modificadores de acesso explícito

A classe Agenda não usa nenhum dos modificadores de acesso de forma explícita. Pela nossa classificação,implicitamente ele está usando o modificador de acesso Package ou Friendly. Vimos, anteriormente, que omodificador de acesso Package permite que classes do mesmo pacote acessem atributos ou métodos que estejamcom tal modificador. Considerando que a nossa classe Principal está no mesmo pacote (veja sobre pacotes naclassificação de Package), então, ele tem acesso aos atributos e métodos da classe Agenda.

Você pode está perguntando... Quando a classe Principal teve acesso aos atributos da classe Agenda?

Respondendo: veja o trecho de código da classe Principal a seguir.

Listagem 8 - Acesso direto aos métodos e atributos da classe

O método main() da classe Principal está acessando os atributos dia, mes e anotacao da classe Agenda. Emodificando as informações sem passar pelo teste da validação da data. Essa falha na codificação não é aceitável.

Vamos então aplicar o encapsulamento tornando privados os atributos e o método validaData()da classe Agenda como uso do modificador de acesso private, e permitir os acessos para os métodos anote() e mostraAnotacao(). Temos:

Adaptada por Wagner José dos Santos Júnior 40

Page 41: Apostila_Programação Orientada a Objetos

41

Listagem 9 - Adicionando explicitamente os modificadores de acesso

Agora, o compilador já não aceita usar os comandos abaixo. Isso causaria erro! Ou seja, os atributos da classeAgenda agora são privados apenas para a uso da própria classe Agenda, como mostra a listagem 10.

Adaptada por Wagner José dos Santos Júnior 41

Page 42: Apostila_Programação Orientada a Objetos

42

Listagem 10 - Encapsulamento em ação

Com essa modificação, só é possível inserir uma anotação na classe Agenda usando o método anote(). O métodoanote() garante que a data inserida para a anotação será validada com o método validaData(), que também éprivado ao uso apenas da classe Agenda.

Atividade 21. Continuando a atividade anterior, separe as classes -Pessoa e Carro - e adicione os

modificadores de acesso de seus atributos e métodos, verifique e corrija os programas paraque não tentem executar uma operação não permitida pelo encapsulamento.

Uma verdade que não pode ser omitida para os programadores: você pode optar em não usar acaracterística de encapsulamento em seus códigos. Mas, isso seria uma péssima prática e um sinalque você não é um programador que segue as boas práticas. Se você havia pensado nisso, reveja osconceitos e tente entender a importância do encapsulamento para seus códigos

Autoavaliação1 - Sem consultar o material responda: O que você entende por encapsulamento? Para que serve? Ecomo aplicar?

2 - Antes de rever os conceitos, para que servem os modificadores de acesso:

public private

Adaptada por Wagner José dos Santos Júnior 42

Page 43: Apostila_Programação Orientada a Objetos

43

package

3 - Pense e reflita o que faria você decidir se um método deve ser usado como privado?

4 - Crie classes chamadas Usuario e Hacker. Hacker possui o método main(). A classe Usuario possui osatributos login e senha. Inicialmente, não use encapsulamento e faça com que no método main() deHacker seja possível modificar as informações (login,senha), inicialmente definidas, de um objeto daclasse Usuário que você mesmo criar. Em seguida, aplique encapsulamento e verifique que Hacker terásuas tentativas frustradas.

Aula 6 – Tipos Primitivos em Java

Apresentação

Nesta aula, você vai aprender um pouco sobre os tipos primitivos oferecidos pela linguagem Java. Esses tipos sãofundamentais para a construção de programas e sistemas de médio e grande porte na linguagem. Além de conhecer osdiferentes tipos oferecidos pela linguagem, apresentamos diversos exemplos de como usá-los e manipulá-los.Finalmente, a aula será finalizada com uma apresentação mais detalhada da classe String.

ObjetivosAo final desta aula, você será capaz de:

saber quais são os tipos primitivos e respectivas características existentes na linguagem Java; aprender como manipular alguns tipos numéricos; saber sobre a classe String;

saber onde podemos declarar as variáveis que representam tipos primitivos ou referências paraobjetos dentro de uma classe Java.

Tipos Primitivos em Java

A linguagem Java oferece um total de 8 tipos primitivos para criação de nossos programas. Tais tipos são usados paradeclararmos as variáveis que auxiliam na construção dos algoritmos e classes dos programas que descrevemos. ATabela 1 apresenta um resumo dos tipos primitivos oferecidos pela linguagem.

Adaptada por Wagner José dos Santos Júnior 43

Page 44: Apostila_Programação Orientada a Objetos

44

Tabela 1 – Tipos primitivos de Java

Apesar da linguagem Java oferecer tantos tipos, muitos deles são capazes de representar os mesmos tipos de dados,mas com uma capacidade de armazenamento maior (em uma maior quantidade de bits na memória do computador).Variáveis do tipo byte, short, int e long, por exemplo, podem ser usadas para representar números inteiros, variandoem diferentes faixas de valores (ver detalhes na Tabela), muito embora os tiposint e long sejam os mais usados. Omesmo acontece com variáveis do tipo float e double, que são usadas para representar números reais.

O tipo boolean é usado para declarar variáveis que podem assumir um dos seguintes valores:true (verdadeiro)oufalse(falso). Variáveis booleanas são bastante usadas para tomadas de decisões em comandos condicionais (if) ou derepetição (for, while).

Finalmente, o tipo char é usado para representar caracteres, como, por exemplo, as letras de alfabetos de línguas dediferentes países. Apesar de em alguns programas ser necessário o uso do tipo char para representar e permitir oprocessamento 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 fácil e simples do que usar variáveis do tipochar. 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 variáveis do tipo específico que você deseja usar. É possíveltambém já inicializar as variáveis no momento da sua declaração. Vejamos alguns exemplos na Listagem 1.

1. int idade = 18;2. long tamanho;3. float salarioFuncionario;4. double poupanca = 100.0;5. boolean casado;6. boolean ferias = false;

7. char caracter1 = ‘A’;

Adaptada por Wagner José dos Santos Júnior 44

Page 45: Apostila_Programação Orientada a Objetos

45

Listagem 1 – Declaração e inicialização de variáveis em Java

Na listagem, podemos observar a declaração de 7 variáveis de tipos distintos. Inicialmente, foram declaradas duasvariáveis de valores inteiro (linhas 01-02). A primeira é a variável idade do tipo int que foi inicializada com o valor 18. Asegunda é a variável tamanho do tipo long que não foi inicializada. Cada variável não inicializada em Java recebe umvalor de inicialização (default) dependendo do tipo escolhido. A Tabela 2 apresenta valores default escolhidos. No casoda variável tamanho, como ela do tipo int, ela é inicializada com o valor default inicial zero (0).

Logo a seguir (linhas 03-04), foram declaradas duas variáveis de valores reais: a variável salario Funcionario do tipofloat, que é inicializada com o valor default zero (0,0), e a variável poupanca do tipo Double,que foi inicializada com ovalor 100.0. As variáveis booleanas casado eferias (linhas 05-06) podem assumir dois valores, true e false. No caso, avariável casado é iniciada com o valor default false, já a variável ferias foi inicializada explicitamente com o valor false.Finalmente, é declarada a variável caracter 1 que é inicializada com o valor ‘A’.

Tabela 2 – Valores default de tipos primitivos de Java

Atividade 11. Crie, compile e execute uma classe Java, de nomeTesteTiposPrimitivos,com um método main(),

que declara as variáveis que foram apresentadas na Listagem 1.2. Em seguida, experimente imprimir o valor de tais variáveis usando o método

System.out.println().

3. Observe durante a execução do programa que variáveis não inicializadas têm um valor inicialpadrão conforme apresentado na Tabela 2.

Regras e convenções para declarações de variáveis

Na linguagem Java, existe um conjunto de regras que devem ser seguidas para nomear as variáveis. Oprimeiro símbolo de declaração de uma variável pode ser uma letra (minúscula – a até z – ou maiúscula– A até Z), ou um dos seguintes caracteres “_” (underscore) ou “$” (cifrão). Na maioria dosprogramas, entretanto, é comum declarar as variáveis com o primeiro símbolo sendo uma letraminúscula, conforme foi ilustrado na declaração das variáveis da Listagem 1.

Os demais símbolos de declaração de uma variável podem ser, além de qualquer letra (maiúscula ouminúscula) e dos caracteres “_” e “$”, também algum número. Observe, por exemplo, na Listagem 1, adeclaração das variáveis caracter1esalarioFuncionario.

Seguindo as regras acima, o compilador da linguagem Java reclama sempre que declaramos umavariável começando com números, ou qualquer outro símbolo que não sejam “_” e “$”. Assim, caso a

Adaptada por Wagner José dos Santos Júnior 45

Page 46: Apostila_Programação Orientada a Objetos

46

gente declare as seguintes variáveis, o compilador acusará erro:(i) “1minhaVariavel” – o nome dessavariável está incorreto, porque inicia com um número; e (ii) “#nome” – variável declaradaincorretamente também porque se inicia com um “#”.

Além das regras acima, é importante lembrar que existe um conjunto de palavras reservadas (doinglês: keywords) na linguagem Java, como, por exemplo: main, new, while, if, for, int, long, float,double. Tais palavras são reservadas na linguagem para um determinado propósito, e dessa forma ocompilador Java não permite que o desenvolvedor declare alguma variável de forma idêntica a algumadas palavras chaves. Veja a listagem de todas as palavras reservadas no quadro 1 a seguir.

Trabalhando com os valores das variáveis

Ao longo da criação dos nossos programas, é comum, além de declararmos e inicializarmos as variáveis, trabalharmoscom ela na lógica do nosso programa. No caso de variáveis de tipos primitivos numéricos inteiros ou reais, podemosusar os operadores matemáticos tradicionais como soma (“+”), subtração (“-“), multiplicação (“*”) e divisão (“/”).

A Listagem 2 apresenta diversos exemplos de uso dos operadores. Inicialmente, são declaradas duas variáveis(salario1, salario2) do tipo float. Em seguida, uma nova variável (somaSalario) é criada e seu valor é inicializado com asoma das variáveis salario1 e salario2.

A variável poupanca1 é calculada como o dobro do salario1, ou seja, é o valor do salario1 multiplicado (operador “*”) pelo valor 2. A variável do tipo double gastoMes é calculada como a subtração entre o valor do salario1 e o valor de 590.68. Finalmente, a variável idade é calculada como a subtração entre dois valores inteiros: 2010(que representa o ano corrente) e 1980(o ano do seu nascimento).

1. float salario1 = 700.0, salario2 = 855.0;2. float somaSalario = salario1 + salario2;3. double poupanca1 = salario1 * 2;4. double gastoMes = salario1 – 590.68;

5. int idade = 2010 – 1980;

Listagem 2 - Manipulação de variáveis de tipos numéricos

Atividade 21. Estenda a classe TesteTiposPrimitivos criada no exercício anterior para incluir a declaração

de variáveis acima.2. Em seguida, imprima os valores de tais variáveis usando o método System.out.println().

A classe String

A classe String é usada em Java para representar um conjunto de caracteres. Apesar de ser uma classe, a criação deobjetos do tipo String não exige o uso da palavra chave new.

A Listagem 3 apresenta a declaração de uma variável nome1 sendo inicializada com o valor “João Santos”, assim comode outra variávelnome2com o valor “Maria das Graças”.

Observe que para criar objetos do tipo String não é necessário criar um objeto usando a palavra-chave new, como podeser visto no exemplo da variável nome2.

Uma string em Java é nada mais nada menos do que um conjunto de caracteres separados por aspas eque podem ser atribuídos diretamente para variáveis do tipoString.Adaptada por Wagner José dos Santos Júnior 46

Page 47: Apostila_Programação Orientada a Objetos

47

A terceira linha da listagem mostra a declaração da variável frase do tipo String. No caso, está sendo atribuído para elaa concatenação (união) da variável nome1 com a string “gosta de “ e, finalmente, a variável nome2. Observe que essaconcatenação é feita através do operador “+”. O próprio compilador Java consegue interpretar tais comandos e traduzirpara que ocorra uma concatenação de strings em tais casos. Dessa forma, o valor final que a variável fraseiráarmazenar será “João Santos é o pai de Maria das Graças”.

1. String nome1 = new String(“João Santos”);2. String nome2 = “Maria das Graças”;

3. String frase = nome + “ é o pai de “ + nome2;

Listagem 3 – Declaração e inicialização de variáveis em Java

Para imprimir uma variável do tipo String, é possível usar o comandoSystem.out.println() normalmente, de formaidêntica como fazemos com os tipos primitivos.

A Listagem 4 mostra uma classe que contém um método main() para impressão das variáveis apresentadas na Listagem 3.

1. public class ProgramaPrincipal {2. public static void main(String args[])3. String nome 1 = “João Santos”;4. String nome2 = “Maria das Graças”;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 – Declaração e inicialização de variáveis em Java

Atividade 31. Crie, compile e execute uma classe de nomeTesteStringscom as variáveis do tipo String

declaradas na Listagem 4.2. Em seguida, estenda o programa criando novas variáveis que criam novas frases usando

variáveis String, por exemplo.3. Crie variáveis com o seu nome e alguém da sua família.

4. Faça concatenações das Strings usando o operador “+”.

Declaração de variáveis em classes

Em um programa Java, as variáveis 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 método main() quanto diretamente comoatributos de classes ou variáveis locais de métodos.

Na Listagem 5, por exemplo, vemos inicialmente a declaração da variável idade do tipo inte salario do tipo float naforma de atributos da classe Pessoa. Observe que tais atributos podem ser usados nos métodos set e get da própriaclasse Pessoa. Essas variáveis da classe Pessoa são criadas para cada objeto que é instanciado em qualquer trecho deum programa Java. Ou seja, se criarmos dois objetos da classe Pessoa, cada objeto irá manter internamente em

Adaptada por Wagner José dos Santos Júnior 47

Page 48: Apostila_Programação Orientada a Objetos

48

memória seu próprio nome, idade e salario.

Essa situação é ilustrada na Listagem 6. Nesse exemplo, vemos a declaração de duas variáveis objetos da classe Pessoa (pessoa1, pessoa2), além de uma variável inteira (anoAtual) do tipo int. Observe que, logo a seguir, os nomes dos objetos da classe Pessoa, assim como o anoAtual, são também impressos.

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

22. }

Listagem 5 – Declaração de variáveis em uma Classe

1. public class ProgramaPrincipal {2. public static void main(String args[])3. Pessoa pessoa1 = new Pessoa(“João”, 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 – Declaração de variáveis no métodomain

Aula 7 – Comandos da Linguagem

Apresentação

Nesta aula, iremos aprender um pouco mais sobre os comandos de fluxo de controle (if, switch) e repetição (while,for), que podemos utilizar na linguagem Java. Tais comandos são também fundamentais para a construção de qualquer

Adaptada por Wagner José dos Santos Júnior 48

Page 49: Apostila_Programação Orientada a Objetos

49

sistema e elaboração de nossos algoritmos.

ObjetivosAo final desta aula, você será capaz de:

saber quais são os comandos de fluxo de controle e repetição existentes na linguagem Java;

usar nas situações adequadas cada um desses comandos.

Introdução

Toda linguagem de programação oferece comandos para o desenvolvimento de nossos programas e algoritmos. Com a linguagem Java, também não é diferente, ela oferece uma série de comandos para fluxos de controle e repetição. Uma boa parte de tais comandos são derivados das linguagens C e C++, que serviram de inspiração para a criação 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 são os comandos condicionais. Eles servem para alterar o fluxo normal de execução seqüencial das instruções do seu programa. Ou seja, eles permitem que sejam feitos desvios ao longo da execução, afim de executar determinados trechos do programa apenas nas situações desejadas.

Comando IF

Um dos comandos mais conhecidos e usados nas linguagens de programação moderna é o comando IF. A palavra“IF” em inglês significa “se” em português. Ela indica alguma condição de decisão que é feita para controlar se um dado trecho de código é executado. Em Java, o comando IF pode apresentar duas formas: IF e IF-ELSE (em português: “Se – Senão”).

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 condição. Caso essa condição seja avaliada como verdadeira, o trecho de código que fica no bloco do comando (entre as chaves) é executado.

Adaptada por Wagner José dos Santos Júnior 49

Page 50: Apostila_Programação Orientada a Objetos

50

Listagem 2 – Exemplo do comando IF

A Listagem 2 mostra um exemplo concreto de tal comando, apresentando a implementação do método imprimirFaixaEtaria()da classePessoa. Observe que no conteúdo do código 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 utilização do comando IF, em que o programa só executa certo trecho de código, se e somente se, o teste avaliado tiver resultado verdadeiro. Já a segunda forma IF-ELSE fornece outro trecho de código 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 teríamos:

Adaptada por Wagner José dos Santos Júnior 50

Page 51: Apostila_Programação Orientada a Objetos

51

Listagem 4 – Exemplo do comando IF

Inserimos na Listagem 4 o comando ELSE que determina o bloco de comandos a serem executados caso a condição de teste oIF for falsa. Neste caso, mostra que o objeto Pessoa em questão é maior de idade.

Comando IF aninhados

Aninhar o comando IF significa que podemos colocar comandos IF’s dentro de outros comandos IF. Vamos mostrar através dorefinamento do exemplo anterior.

Listagem 5 – Exemplo do comando IF Aninhado

Observe que agora temos outras condições de teste, caso a idade da pessoa seja menor que 18. Nosso programa tambémestá analisando se a pessoa é criança (linha 15). Assim, como verifica se a pessoa é adolescente (linha 17). E, finalmente,temos simplesmente o comando ELSE(linha 19), pois não é necessário testar, uma vez que já sabemos se a pessoa possui

idade entre 16 e 17 anos, dado os testes dos IFs anteriores.

Atividade 1Modifique a classe apresentada na Listagem 5 usando o comando IF de forma aninhada para testar sea “Pessoa maior de idade” é adulto ou idoso.

Em seguida, crie um método main()que cria dois objetos da classe Pessoa com idades diferentes, everifica qual a faixa etária de tais pessoas chamando o métodoimprimirFaixaEtaria().

Comando SWITCH

Outro comando condicional existente na linguagem Java é o comando SWITCH (do inglês: desvio, mudar, trocar), assim comoo IF, ele permite várias possibilidades para a execução do programa. Um detalhe é que o SWITCH efetua sua condição de teste apenas nos tipos primitivos: byte, short, char e int. Mas, assim como a avaliação de condição verdadeiro (true) ou falso (false) é suficiente para o comando IF, esses tipos são suficientes para tomar todas as decisões necessárias para o fluxo de seu programa.A Listagem 6 mostra a estrutura geral do comando SWITCH.

Adaptada por Wagner José dos Santos Júnior 51

Page 52: Apostila_Programação Orientada a Objetos

52

Listagem 6 – A forma geral do comando SWITCH

A Listagem 7 mostra como seria o uso do SWITCH para um exemplo de um dos métodos usado pela classe Automóvel.Observe no exemplo que dependendo do valor que a variável cambio possui podemos imprimir a marcha que foi passada noautomóvel. Ou seja, caso a variável cambio possua o valor 1, será exibida a mensagem “Passou a 1ª marcha”. Vale observaro funcionamento do comando break, pois é ele quem define que uma vez encontrado um dadocase (caso), outro caso (case)não será procurado, ocasionando assim a saída do comando switch.

Adaptada por Wagner José dos Santos Júnior 52

Page 53: Apostila_Programação Orientada a Objetos

53

Listagem 7 – Exemplo com o comando SWITCH

Outra possibilidade com o uso do SWITCH é a situação em que, para várias possibilidades, temos o mesmocaminho 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 umamensagem indicando que existe uma porta aberta. Caso seja os sensores 5 ou 6, será mostrada a mensagemindicando que a mala do carro está aberta. Observe que nesse exemplo a busca só é interrompida pelocomando break quando se defineo que se deseja fazer (nesse caso, exibir uma mensagem). Pois enquanto ocomando SWITCH não encontrar o break, mesmo já tendo encontrado o case, ele continuará verificando osdemais casos.

Adaptada por Wagner José dos Santos Júnior 53

Page 54: Apostila_Programação Orientada a Objetos

54

Listagem 8 – Comando SWITCH com case sem break

Atividade 21. Crie um método publicvoidmudarDirecao(char direção)para a classe Automóvelque defina a

direção que o automóvel deve tomar de acordo com os comandos recebidos. Aspossibilidades de comandos são: F = Frente, E = Esquerda, D = Direita.

Observação Veja as dicas seguintes:

defina cases no comando switch usando o tipo primitivo char.;

se tiver dúvidas na hora de uso do comando SWITCH, releia o exemplo da Listagem 7.

Comandos de repetição

Os comandos de repetição das linguagens de programação são responsáveis pelas rotinas que nós humanosconsideramos tediosas. E isso torna os computadores mais úteis. Primeiro, pela capacidade de repetiçãoautomática; segundo, em função da velocidade pelas quais são processadas. Por exemplo, imagine a tarefa deprocurar um nome em um enorme banco de dados, ou uma palavra em vários textos, ou mesmo efetuar a mesmasequência de cálculos para uma grande lista de valores.

Comando WHILE

O comando WHILE (do inglês, “Enquanto”) repete um comando ou um bloco de comandos enquanto a condiçãode teste for verdadeira. Ele possui a seguinte estrutura geral:

Adaptada por Wagner José dos Santos Júnior 54

Page 55: Apostila_Programação Orientada a Objetos

55

Listagem 9 – Comando WHILE

A Listagem 10 apresenta um exemplo do comando WHILE. No caso, temos um método que inicia uma contagemde 0 a 99 para servir de temporizador para chamar outro método que trava as portas do automóvel. Nesse caso,“enquanto” o contador for menor que 100, o método disparaTravaPortas()não será executado. E ainda quandoexecutado será exibido cada valor do contador antes de ser incrementado. Vale observar que ainstruçãocontador++(linha 07) representa o incremento da variável inteiracontadorem uma unidade, o quesignifica que sempre que essa linha é executada o valor da variávelcontador passa a ser o seu valor atual maisuma unidade.

Listagem 10 – Exemplo comando WHILE

Atividade 31. Crie um método 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 osnúmeros pares.

Comando DO-WHILE

O comando DO-WHILE tem a mesma finalidade do comando WHILE com apenas uma diferença. A diferença é quecom o comando WHILE a condição de teste é efetuada antes de executar uma instrução ou bloco de instruções, jácom o comando DO-WHILE a condição de teste só será efetuada depois de executar instrução ou bloco deinstruções. A Listagem 11 apresenta a forma geral do comando.

Listagem 11 –Estrutura geral do comando DO-WHILE

Adaptada por Wagner José dos Santos Júnior 55

Page 56: Apostila_Programação Orientada a Objetos

56

Para entendermos melhor a diferença, vejamos primeiro o exemplo usando WHILE. Para a nossa classeAutomóvel, considere que para ligar o automóvel é preciso que o usuário entre através do método acesso comuma senha num teclado do painel do carro.

Listagem 12 – Exemplo com o WHILE

Observe, na Listagem 12, que após 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 usuário digite a senhacorreta. Para só então exibir a mensagem de “Acesso Permitido” e chamar o método ligarAutomovel().Nessecaso, como o teste do WHILE é executado antes das instruções, nosso método tem as linhas 9 e 10 idênticas àslinhas 12 e 13.

Agora, veja na Listagem 13 o mesmo exemplo usando o DO-WHILE. Observe nesse exemplo, que agora não énecessário repetir as linhas 10 e 11, porque o teste é efetuado depois de pedir a senha. E ainda assim funcionaexatamente como o comando WHILE.

Adaptada por Wagner José dos Santos Júnior 56

Page 57: Apostila_Programação Orientada a Objetos

57

Listagem 13 – Exemplo com o DO-WHILE

Comando FOR

Quando usamos os comandos de repetição WHILE e DO-WHILE controladas por contadores muito usualmente,temos que criar uma variável de controle e iniciar essa variável antes dos comandos. Dentro do bloco doscomandos, essa variável terá seu valor modificado para ser comparada na condição de teste.

O comando FOR já possui uma estrutura especializada para a implementação de repetição controlada porcontadores, que agrupa a inicialização do contador, modificação do contador e condição de teste em um únicocomando. A Listagem 14 apresenta a estrutura geral do comando FOR.

Na inicialização,é onde se define o valor inicial para o contador. Nacondição,é onde efetuamos o teste derepetição. E opassoé onde o contador sofre a modificação a cada iteração, normalmente o contador pode serincrementado ou decrementado. O comando FOR é interrompido apenas quando a condição de teste temresultado falso.

Listagem 14 – Comando FOR

A Listagem 15 apresenta um exemplo concreto do Comando FOR. Observe que usamos o mesmo exemplo docomando WHILE apresentado na Listagem 10, mas o código ficou mais enxuto devido à estrutura do FOR.

Adaptada por Wagner José dos Santos Júnior 57

Page 58: Apostila_Programação Orientada a Objetos

58

Listagem 15 –Exemplo do comando FOR

Dica

Use o comando WHILE e DO-WHILE quando não se sabe quando vai terminar a repetição. Normalmente,quando não são necessários contadores.

E o comando FOR quando se tem bem definido no términodo ciclo de repetição. Normalmente, quando oscontadores são necessários.

Por exemplo : o FOR não seria muito adequado para implementar os exemplos de leitura de senha apartir do teclado (Listagens 13 e 14).

Listagem 15 – Comando FOR aninhado

O FOR Aninhado é usado quando se deseja trabalhar com a modificação do passo de dois (ou mais) contadores.Por exemplo: quando se deseja percorrer as informações contidas em matrizes.

Comando FOR para vetores e coleções

O comando FOR possui outra estrutura, quando se trabalha com vetores ou coleções (doinglês: Arrays eCollections). Vejamos em um trecho de código um exemplo dessa estrutura.

Adaptada por Wagner José dos Santos Júnior 58

Page 59: Apostila_Programação Orientada a Objetos

59

Listagem 16 – Comando FOR para vetores e coleções

Observe que aqui a ideia de contador está implícita e existe uma variável do mesmo tipo do vetor (variável itemdo tipo int no exemplo) ou o item da coleção é que recebe uma nova informação a cada interação até passar portodos os itens do vetor.

Atividade 41. Usando o comando FOR, crie uma classe qualquer, que possua diferentes métodos que faça

os seguintes tipos de contagem.

a) Contagem e exibição crescente para um dado número inicial e final.

b) Contagem e exibição decrescente para um dado número inicial e final.

c) Contagem e exibição de números PARES para um dado número inicial e final.

d) Contagem e exibição de números ÍMPARES para um dado número inicial e final.

e) Contagem e exibição de números de passo 2 (contador varia de 2 em 2, ou seja, éincrementado em 2 a cada rodada do comando FOR) para um dado número inicial e final.

f) Contagem e exibição de números de passo 3 (contador varia de 3 em 3, ou seja, éincrementado em 3 a cada rodada do comando FOR) para um dado número inicial e final.

g) Contagem e exibição de números de passo 5 (contador varia de 5 em 5, ou seja, éincrementado em 5 a cada rodada do comando FOR) para um dado número inicial e final.

h) Não deixe de criar um método main() na sua classe para fazer uma chamada de testepara cada um dos métodos acima.

Autoavaliação1 - Quais são os comandos de controle de fluxo existentes na linguagem Java?

2 - Quando devemos usar os comandos de controle de fluxo?

3 - Quais são os comandos de repetição existentes na linguagem Java?

4 - Quando devemos usar os comandos de repetição?

Adaptada por Wagner José dos Santos Júnior 59

Page 60: Apostila_Programação Orientada a Objetos

60

Aula 8 – Composição ou Agregação

Apresentação

Compor, juntar, reunir, formar, constituir... Essas ações nos levama uma ideia muito interessante na programaçãoorientada a objetos, chamada Composição. Nesta aula, você vai ver esse interessante conceito da POO, que nos dá agrande possibilidade da reutilização de código. Além disso, a ideia de composição também aproxima a ideia daOrientação a Objetos ao senso comum de sistematização das coisas, em que um objeto mais complexo pode sercomposto de partes mais simples. Boa aula!!

ObjetivosAo final desta aula, você será capaz de:

saber o que significa Composição ou Agregação; criar objetos na linguagem Java que são compostos por outros objetos, fazendo uso prático

do conceito de Composição;

entender como se comporta os modificadores de acesso de Java na Composição.

Composição ou Agregação

Composição ou Agregação é um mecanismo de reaproveitamento (reutilização) de classes utilizado pelaPOO para aumentar a produtividade e a qualidade no desenvolvimento de software.

Reaproveitamento ou reutilização de classes significa que você pode usar uma ou várias classes para compor outraclasse. Já o aumento de produtividade está relacionado com a possibilidade de não ser necessário reescrever código dedeterminadas classes, se alguma outra já existe com estado (atributos) e comportamento similar. Finalmente, com acomposição, é possível também aumentar a qualidade dos sistemas gerados, porque há a possibilidade clara dereutilizar classes que já foram usadas em outros sistemas, e, portanto, já foram testadas e têm chances de contermenos erros.

Vejamos um exemplo: um carro é um objeto COMPOSTO por vários outros objetos. Ele é composto pelos objetosmotor, pneus, direção, faróis etc. A Figura 1 dá uma ideia do conceito de composição para um objeto do tipo Carro.

Adaptada por Wagner José dos Santos Júnior 60

Page 61: Apostila_Programação Orientada a Objetos

61

Figura 1 - Composição do objeto Automóvel

Legal não é?!! Isso mesmo que você entendeu, você pode criar um objeto a partir de vários outros objetos. E isso émuito natural.

Veja o computador que você está usando, ele é um objeto composto por outros objetos: teclado, monitor, placa mãe,memória, mouse etc.

E tem mais, quando uma classe é composta de outras classes ela pode tanto usar os objetos que são gerados pelasclasses que a compõem, como pode também usufruir dos atributos e métodos dessas classes.

Atividade 1

Para praticar o conceito de composição que você acabou de aprender, tente olhar o mundo ao seuredor, outros exemplos de objetos do mundo real que são compostos por outros objetos menores.Anote tais exemplos para que possamos usá-los em outros exercícios ao longo da nossa aula.

Exemplos na práticaVejamos agora um exemplo na prática! Vamos utilizar a mesma ideia do objeto Automóvel. Dado uma classeAutomóvel que é composta pelas classes Direção e Motor.

Adaptada por Wagner José dos Santos Júnior 61

Page 62: Apostila_Programação Orientada a Objetos

62

Figura 2 - Composição da classe Automóvel: motor e direção

Nas linhas de código, essa Composição é expressa da seguinte maneira, veja Listagem 1:

Listagem 1 - Classes Motor, Direção e Automóvel

Observe que a classe Automóvel é composta pelas classes Motor e Direção, eis aqui a nossa Composição! Mas,lembre-se de que primeiro criamos as classes Motor e Direção para só a partir daí podermos criar aclasse Automóvel.

Atividade 21. Crie, baseado no exemplo apresentado, outras classes compostas de várias outras classes.

Lembre-se: para que uma classe possa compor uma outra é necessário que ela já exista.Elabore também classes para os exemplos que você mesmo criou no exercício 1. As classessão:

Classe Composta Classes Componentes (“Partes”) da Classe Composta

Adaptada por Wagner José dos Santos Júnior 62

Page 63: Apostila_Programação Orientada a Objetos

63

Computador Teclado, Monitor, Memória, Placa Mãe...

Livro Título, Autor, Capítulo, Editora ...

Monstro Cabeça,Olho,Boca,Braço,Perna...

Mas, o conceito e vantagens do uso da Composição não acabam por aí, analisando as classes, vamos incrementá-lasum pouco mais e descobrir os benefícios de se utilizar a Composição.

Observe que a classe Automóvel possui atributos que são referências para instâncias (1) (objetos) das classes Motor eDireção.Observe que as classes possuem a propriedade do Encapsulamento (visto na aula 5), consequentemente,

para acessar os atributos das classes usaremos os métodos get e set (vistos na aula 2). Assim, nossas classes ficamconforme indicam as listagens a seguir: Listagem 2, Listagem 3 e Listagem 4:

Listagem 2 -Classe Motor

Listagem 3 - Classe Direção

Adaptada por Wagner José dos Santos Júnior 63

Page 64: Apostila_Programação Orientada a Objetos

64

Listagem 4 - Classe Automóvel

Da maneira que está o código das classes, se nós criarmos um objeto (instanciarmos) da classe Automóvel, osatributos motor e direção continuam com valor nulo (null).

Automovelautomovel = newAutomovel();

Isso significa que para instanciarmos os objetos que compõem a classe Automóvel podemos decidir de que maneirafaremos.

A Composição e o método construtorOs métodos construtores das classes componentes (Motor,Direção) que fazem parte da classe composta (Automóvel),podem ser chamados de três maneiras diferentes, são elas:

CASO 1: chamadas nos construtores da classe que é composta; CASO 2: chamadas em qualquer método da classe que é composta; CASO 3: chamadas fora da classe que é composta.

Para mostrar cada uma dessas situações, vamos considerar inicialmente que a classe Automóvel é composta apenaspela classe Motor. Acrescentamos dois métodos construtores para a classe Motor. O primeiro utiliza a potência domotor 1000 (por default), já o segundo espera que o usuário forneça a informação da potência do motor quando criadoo objeto Motor, veja a Listagem 5.

Adaptada por Wagner José dos Santos Júnior 64

Page 65: Apostila_Programação Orientada a Objetos

65

Listagem 5 - Classe Motor com dois construtores

Listagem 6 - Classe Automóvel composta pela classe Motor

CASO 1: chamadas nos construtores da classe que é composta

Para a primeira situação, quando o construtor da classe componente é chamado no construtor da classe que usa acomposição, ilustrada na Listagem 7, temos:

Adaptada por Wagner José dos Santos Júnior 65

Page 66: Apostila_Programação Orientada a Objetos

66

Listagem 7 - Classe Automóvel com dois métodos construtores

Nesse exemplo, os construtores da classe motor são chamados dentro dos construtores da classe Automóvel.

CASO 2: chamadas em qualquer método da classe que é composta

Outra maneira seria a situação, na qual os construtores são chamados em qualquer método da classe que é composta. Vejamos a Listagem 8:

Listagem 8 - Construtor chamado a partir de um método

CASO 3: chamadas fora da classe que é composta

Por fim, a terceira situação, onde o construtor da classe componente é chamado de fora da classe que usa a composição, vejaa Listagem 9. Considere que a classe Automóvel utilizada possui o código apresentado na Listagem 6.

Adaptada por Wagner José dos Santos Júnior 66

Page 67: Apostila_Programação Orientada a Objetos

67

Listagem 9 -Criação da classe Motor fora da classe Automóvel

Observe que o construtor da classe Motor foi chamado de fora da classe Automóvel, dentro do método main()daclasse. Ou seja, antes de usar o método setMotor() o objeto motor não tem nenhum vínculo com o objeto automóvel.

Comparando as possibilidadesObservando a Listagem 10, analisaremos as possíveis maneiras de criar o objeto da classe componente (Motor)através da classe composta (Automóvel) ou dentro do método main() que define o comportamento de execução de umprograma Java.

Listagem 10 - Possibilidades de criação da classe Motor para uso pela classe Automóvel

Para o caso 1: temos duas possibilidades, na linha 1, é ocultado do usuário a existência de um objeto motor quecompõe a classe Automóvel. Já na linha 2, o usuário define a potência a ser adotada pelo motor do automóvel.

Para o caso 2, podemos observar na linha 3 que quando criamos o objeto automóvel o objeto motor ainda não existe.Ele permanece nulo (null) dentro do objeto motor até que o automóvel seja ligado pela primeira vez. Para isso, pode-

Adaptada por Wagner José dos Santos Júnior 67

Page 68: Apostila_Programação Orientada a Objetos

68

se usar um dos dois métodos ligarPrimeiraVez()(linhas 4 e 5), sem ou com parâmetro, respectivamente.

Finalmente, para o caso 3, apresentado a partir da linha 6, tem-se a mesma observação da linha 3. Nesse caso, ousuário cria normalmente o objeto motor, escolhendo um dos dois construtores (linhas 7 e 8) e, em seguida, defineque esse objeto componha o objeto automóvel (linha 9.)

Atividade 3Seguindo o exemplo apresentado para as classes Automóvel e Motor,

1. Aplique o caso 1 para a classe Computador que agrega uma placa mãe, o caso 2 para aclasse Livro que agrega seu título e autor, e o caso 3 para a classe Monstro que agregacabeça e boca.

Composição e os modificadores de acessoDuas observações importantes, podemos considerar com relação à composição e aos modificadores de acesso (1). Elasestão mencionadas a seguir.

Quando declaramos atributos públicos nas classes e reutilizamos essas classes dentro de outras, esses atributos podemnão ser acessados facilmente, através da classe de composição, veja Listagem 11.

(1) Veja sobre modificadores de acesso na Aula 5 sobre Encapsulamento.

Listagem 11 - Tentativa de uso de um atributo público de um objeto privado

No exemplo acima, apesar do atributo cor da classe Direção ser public, esse atributo não é diretamente acessível apartir do método main(), porque o objeto Direção está encapsulado (é um atributo privado) dentro daclasse Automóvel.

Quando temos atributos privados nas classes e reusamos essas classes, declarando suas instâncias comopúblicas, os atributos não passam a ser públicos, veja a Listagem 12.

Adaptada por Wagner José dos Santos Júnior 68

Page 69: Apostila_Programação Orientada a Objetos

69

Listagem 12 - Tentativa de uso de um atributo privado de um objeto público.

Aqui é o inverso do caso anterior, mas reforça que private não deixa de ser privado mesmo quando na classe que usa da Composição (Automóvel) torna seu atributo (Direção) public.

Anote a Dica

Quando uma classe usa a Composição para agregar outras classes, podemos dizer que ela tem umrelacionamento chamado “Tem um”, o qual descreve um relacionamento em que uma classe contém umainstância de outra classe.

Autoavaliação1 - Sem consultar o material, responda: O que você entendeu por Composição?

2 - Quais são as vantagens de se usar a Composição?

3 - Dos três casos de instanciação dos objetos componentes, qual você usaria se quisesse omitir apresença da composição para quem irá criar os objetos das classes que usa a composição?

4 - Crie as classes apresentadas no diagrama abaixo e aplique a Composição para a classe Pessoa, quealém de possuir um atributo Nome será composta pelas classes Data, Endereço e Contato para osatributosdataNasc, endereço e contato,respectivamente.

Adaptada por Wagner José dos Santos Júnior 69

Page 70: Apostila_Programação Orientada a Objetos

70

Aula 9 - Arrays, coleções e listas

Apresentação

Precisamos constantemente manipular muitas informações e muitos objetos ao mesmo tempo. Para isso, é necessáriauma estrutura que permita armazená-los e recuperá-los sempre que desejarmos. A linguagem Java oferece váriasdessas estruturas de dados em um conjunto de classes chamadas de coleções. Tais coleções ajudam a armazenar erecuperar nossos objetos dentro de um sistema. É isso que você verá nesta aula.

ObjetivosAo 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 introdutória, um conjunto de classes da bibliotecapadrão de Java relacionadas à manipulação de coleções de objetos.

Armazenando objetosExistem várias situações durante a construção de sistemas e programas que precisamos armazenar um númeroexpressivo de objetos, onde a criação e manuseio de uma variável para cada um dos objetos torna-se impraticável.Esse fato ocorre, por exemplo, quando precisamos armazenar uma lista de alunos de uma turma, ou mesmo da escolainteira, e em um dado momento precisamos recuperar apenas um dos objetos aluno dessa lista. Outro exemplo, seriaquando queremos encontrar um número de telefone e recorremos à lista telefônica, ela é nosso repositório de dados.

Imagine termos que criar 100 (cem) variáveis para 100 nomes de alunos! É possível criar um tipo especial de variávelpara armazenar um número específico de objetos ou valores primitivos. Esse tipo de variável é o que chamamosde array, e é ela que veremos na sequência.

ArraysConsidere a seguir um exemplo que motiva o uso de arrays. Constantemente, precisamos tomar nota de um valor quemuda ao longo do tempo, e precisamos medir sua média, valores máximo e mínimo. Por exemplo, suponha que você éum treinador de um atleta velocista de 100 metros raso, como parte do treinamento,você irá fazer 5 medições de tirosde 100 metros. Para cada tentativa do atleta, você vai medir o tempo e colocar o resultado em sua planilha de

Adaptada por Wagner José dos Santos Júnior 70

Page 71: Apostila_Programação Orientada a Objetos

71

rendimento.

Precisamos armazenar 5 valores numéricos reais para representar a marca de tempo obtida. Porém, não podemos criar5 variáveis, e sim, apenas uma para comportar esses valores. Veja tal código na Listagem 1.

Listagem 1 - Declaração de um array

Conforme pode ser observado, um novo operador entrou em cena: o par de colchetes “[“ e “]”. Eles servem paraindicar uma dimensão, ou seja, uma posição onde iremos colocar um valor inteiro que indica a quantidade deelementos que precisamos armazenar na variável em questão (marca). Por conta de tais colchetes, a variável marcanão mais é capaz de armazenar um único valor do tipo double, mas sim irá armazenar um conjunto de valores do tipodouble. Dessa forma, caracteriza-se a declaração de uma variável/atributo do tipo array (também chamada de vetor)em Java.

Observe que o atributo marca representa um array, mas é necessário o operador new para alocar espaço paraarmazenar o conjunto de valores. Assim, a palavra new é usada com o objetivo de indicar quantos valores do tipoDouble serão necessários 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, após a chamada comnew. Isso significaque no nosso exemplo o atributo marca será capaz de armazenar 5 elementos.

O código logo após a declaração indica uma atribuição de valor para armazenar uma determinada marca em cadaposição do array. Veja que colocamos um número para indicar que posição estamos acessando. Esse valor semprecomeça 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) posições conforme foi declarado.

Listagem 2 - Impressão dos valores do Array

Para exibirmos os valores, o programa da Listagem 1pode ser incrementado pelas seguintes linhas de código (Listagem2). Não indicamos a primeira tomada de tempo como sendo o tempo 0 (zero), pois naturalmente costumamos realizar

Adaptada por Wagner José dos Santos Júnior 71

Page 72: Apostila_Programação Orientada a Objetos

72

contagens a partir do número 1 (um).

Há outra forma de definir os valores de um array, no momento de sua declaração podemos indicar seus valores, sendoque já precisamos conhecê-los de antemão. Veja a Listagem 3. Observe que não precisarmos indicar o comprimento dovetor, pois ele sabe de antemão pela quantidade de elementos definidos na sua inicialização.

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

Tanto na definição do array quanto no acesso para leitura ou escrita de suas posições, é possível usar um comando derepetição para acessá-lo diretamente. Na verdade, na programação diária, isso é o mais comum.

Vejamos como ficaria a exibição dos valores acima com um comando FOR na Listagem 4.

Listagem 4 - Impressão 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 dearmazenar 10 (dez) nomes de ferramentas para uso de um mecânico. Inicialize cada uma dasferramentas armazenadas no array, em seguida, imprima cada um deles.

Arrays bidimensionais

Primeiramente, vamos definir o que é uma dimensão de um array. A dimensão, ou quantidade de dimensões, é oconjunto de valores que precisamos definir para localizar uma informação. Por exemplo, uma lista de alunosde 0 a 100 pode ser organizada em um array de uma dimensão, pois para localizar um aluno nessa lista basta indicarum valor da sequência.

Já para localizar uma peça em um tabuleiro de xadrez precisamos de duas coordenadas, linha e coluna. Assim, pararepresentarmos um tabuleiro de xadrez com arrays,são necessárias duas dimensões. A Listagem 5mostra esseexemplo 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 também supor que cada valor representa uma String com onome da peça que ocupa a casa. Observe a utilização de dois valores distintos para localizar uma casa no tabuleiro, epara cada valor um par de colchetes, um par para cada dimensão do array.

Adaptada por Wagner José dos Santos Júnior 72

Page 73: Apostila_Programação Orientada a Objetos

73

Listagem 5 - Exemplo de Array bidimensional

É possível definir n dimensões, porém, na prática, não é comum nem recomendável trabalhar com tantas dimensões.Na prática, é extremamente comum trabalharmos com apenas 1 (uma), e algumas vezes com 2 (duas), e, quasenunca com 3 (três) dimensões, pois há outros recursos na programação orientada a objetos que desencorajam eoferecem alternativas melhores a essa prática.

1. Observe o tabuleiro da Figura 1abaixo e crie um programa em Java que o represente

através de um array de duas dimensões, em que cada casa irá conter a sua cor BRANCA ouPRETA, como sendo valores do tipo String. Imprima cada uma das casas do array, apósiniciá-los.

Dica: não tente definir uma a uma, pois serão 64 linhas de códigos. Ao invés disso, crieestruturas com comandos de repetição para preenchê-lo e imprimí-lo.

Figura 1 - Tabuleiro

Arrays como objetosVimos que arrays são estruturas para armazenar objetos, tais como Strings. Mas, é preciso dizer que arrays são também objetos, por isso é usado o comando new() para alocar espaço de armazenamento para ele. Graças a sua capacidade de se comportar como um objeto, os arrays possuem métodos e um atributo muito útil, o length,que indica seu comprimento.

É necessário conhecê-lo para não passarmos do limite, e para realizar operações de manutenção em seus dados. Pois bem, vamos alterar o exemplo anterior (Listagem 1) que exibe os valores do array marca para utilizar seu atributo length. Tal programa modificado é apresentado na Listagem 6.

Adaptada por Wagner José dos Santos Júnior 73

Page 74: Apostila_Programação Orientada a Objetos

74

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

Coleções JavaA linguagem Java possui um conjunto de classes que servem para armazenar na memória vários objetos. Tais classes não possuem o inconveniente de termos que saber de antemão a quantidade exata de elementos que iremos armazenar, como nocaso de arrays. E em alguns casos, nem mesmo o tipo.

Há 3 (três) tipos principais de objetos Java definidos para esse fim, veja-os a seguir.

1. Set – representa a mesma ideia de conjuntos da matemática, ou seja, um grupo de objetos sem ordem definida, porém, únicos. Como mostra a Figura 2.

Figura 2 - Conjunto de objetos

Nunca poderemos prever a ordem com a qual serão apresentados os seus elementos. Essa situação pode não ser umincômodo diante do problema que tivermos.

Os sets possuem uma característica importante em relação às buscas de objetos em seu interior, pois não precisampercorrer todos eles.

O principal representante dos Set é a classe HashSet, vejamos um exemplo da sua utilização, como mostra a Listagem7:

Adaptada por Wagner José dos Santos Júnior 74

Page 75: Apostila_Programação Orientada a Objetos

75

Listagem 7 - Exemplo de um Set

2. List – como o próprio 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 mantém a ordem com que foram adicionados. Uma classedo tipo List bastante utilizada é a ArrayList, a qual representa uma alternativa aos arrays convencionais vistosanteriormente. Vejamos um exemplo da utilização de um ArrayList na Listagem 8:

Listagem 8 - Exemplo de ArrayList

3. Map – Mapas são estruturas que relacionam um objeto a outro, por exemplo, um número de CEP ao nome de uma rua.

Podemos imaginar dois conjuntos, um de campos-chave e outro de objetos-valor que queremos armazenar. Observe a Figura 4:

Adaptada por Wagner José dos Santos Júnior 75

Page 76: Apostila_Programação Orientada a Objetos

76

Figura 4 - Dois conjuntos de objetos

Observe que para encontrarmos nossos objetos precisamos localizá-los através de suas chaves. Vejamos umaaplicação desses conceitos na Listagem 9:

Listagem 9 - HashMap na prática

Os Sets e Lists são do tipo Collection. Apesar de Map não descender de Collection, é também uma classe que definemétodos de armazenamento e recuperação de objetos.

Adaptada por Wagner José dos Santos Júnior 76

Page 77: Apostila_Programação Orientada a Objetos

77

Figura 5 -Collection e Map

Todas as classes do tipo Set e List descendem (implementam) a interface Collection. Veremos mais detalhes sobreinterfaces em aulas futuras. Por hora, podemos entender interfaces como contratos que definem um conjunto demétodos que devem ser implementados pelas classes. No caso da interface Collection, ela define métodos paraadicionar, remover, verificar a presença de um dado objeto. Tais métodos devem necessariamente existir em todas asList e Sets definidos para a linguagem Java. Segue abaixo uma lista básica desses métodos:

Lista básica de Métodos da Interface Collection

boolean add(Object) Adiciona um elemento na coleção. Como algumas coleções não suportam elementos duplicados (exemplo: Sets), esses métodos retornam verdadeiro (true) ou falso (false) para indicar se a adição foi bem sucedida.

boolean remove(Object) Remove determinado elemento da coleção. Se ele não fizer parte da coleção, retorna falso (false).

intsize() Retorna a quantidade de elementos presentes na coleção.

boolean contains(Object) Procura por um determinado objeto na coleção.Vale salientar: a comparação é feita pelo método equals().

Anote a Dica

As coleções Java mantêm um mecanismo interno de ordenação e recuperação de dados e para isso fazemuso de tabelas hash. Tais tabelas são utilizadas para que a pesquisa de um objeto seja feita de maneirarápida.

Mas, como funciona?

Cada objeto é “classificado” pelo seu hashCode, método de java.lang.Object que retorna um int, e comisso podemos agrupar os objetos por esse valor. Quando é realizada uma busca, só é percorrido o grupo

Adaptada por Wagner José dos Santos Júnior 77

Page 78: Apostila_Programação Orientada a Objetos

78

de objetos com o mesmo hashCode.

Atividade 3

Crie um programa que registra uma lista de compras semanais com itens como: arroz, feijão,carne, pão etc. Utilize os três tipos de coleções vistos até aqui: oHashSet, ArrayList e HashMap.

Aula 10 - Herança

Apresentação

Hoje, você vai aprender sobre mais um pilar de sustentação da Programação Orientada a Objetos: a Herança. Ela éconsiderada um dos conceitos mais importantes na POO. A herança trouxe para a programação um novo olhar sobre amaneira de se programar, até então não atendido pela Programação Estruturada.

ObjetivosAo final da aula, o aluno deve:

entender o que é Herança; conhecer quais os tipos de Herança existentes em POO; entender o funcionamento da Herança durante a execução do programa;

programar em Java usando a Herança.

Herança

Você já ouviu falar sobre herança relacionada à programação? Estranho não é? A Figura 1 mostra os pilares daorientação objetos com destaque para a Herança.

Adaptada por Wagner José dos Santos Júnior 78

Page 79: Apostila_Programação Orientada a Objetos

79

Figura 1 - Orientação a Objetos

Vamos começar pela definição de herança. Herança é o mecanismo que permite a uma classe herdar todos os atributose métodos de outra classe. Ela permite definir a implementação de uma nova classe na definição de uma classepreviamente implementada. Como exemplo, observe a Figura 2 a seguir.

Figura 2 -Exemplo de Herança entre classes

Considere como classes as seguintes abstrações: Transporte, Aquático, Terrestre, Aéreo, Barco,Automóvel e Avião. Considere capacidade como um atributo da classe Transporte, que indica a quantidade de pessoas que o transporte em questão pode transportar. E número de rodas como um atributo da classe Terrestre. E cor, número de portas e placa como atributos da classe Automóvel.

Adaptada por Wagner José dos Santos Júnior 79

Page 80: Apostila_Programação Orientada a Objetos

80

A Figura 2 apresenta um exemplo de Herança, onde as classes Aquático, Terrestre e Aéreo herdam da classe Transporte. A classe Barco herda da classe Aquático. A classe Automóvel herda de Terrestre. E, finalmente, Avião de Aéreo.

Um aspecto importante que podemos também observar na figura é que toda classe que herda de uma outra, acaba herdando também, como consequência, os seus atributos. Por exemplo, de acordo com a Figura 2, a classe Transporte possui um atributo chamado capacidade. Para a classe Aquático, como ela herda de Transporte, pode-se dizer que também possui o atributo capacidade. E Barco, como herda de Aquático, tambémpossui o atributo capacidade. Com essa lógica, percebemos que na herança os atributos (e também os métodos) são herdados naturalmente pelas classes subsequentes na hierarquia.

Hierarquia de Classe ou de Herança:é o mapeamento do tipo árvore de relacionamentos que se formamentre as classes como resultado da herança. Exemplo: a Figura 2 representa uma hierarquia de herançaou hierarquia de classe.

Usando a mesma lógica, responda: Quantos e quais são os atributos da classe Terrestre? E da classe Automóvel?

Respondendo: a classe Terrestre possui dois atributos: capacidade (que é herdado de Transporte) enúmero derodas. Já a classe Automóvel possui cinco atributos: capacidade (herdado de Transporte), número derodas (herdado de Terrestre), cor, número de portas e placa.

Observe na Figura 2 que, quanto mais alta na hierarquia, está a classe, mais ela tende a ser abstrata em comparaçãocom as suas subsequentes. Ou seja, quanto mais alto na hierarquia, menos definida (abstrata) é a classe, e assim eladefine menos atributos e métodos. Isso também garante que a classe tenha mais chance de ser reusada por outrasclasses que herdem da mesma. Entendeu? Não, então vamos ao exemplo da figura. Suponha que aclasse Transporte, além do atributo capacidade, possuísse também o atributo número de rodas. Ou seja, ela passaa ser uma classe mais concreta, menos abstrata. Mas nesse caso, consequentemente, não seria interessante nemfaria sentido para as classes Aquático e Aéreo herdar os atributos de Transporte (ou herdar de Transporte), pois oatributo número de rodas não é desejado por tais classes.

Atividade 1

Defina alguns atributos adicionais para as classes Aéreo e Avião da Figura 2. Em seguida, baseadona hierarquia de herança da qual elas fazem parte, indique quantos e quais são os atributos decada uma delas.

Termos usados para Herança

Na literatura, são encontrados diversos termos para nomear tanto as classes que fornecem a herança quanto asclasses que herdam de alguma outra. Veja exemplos de termos usados no Quadro 1 a seguir.

Classes que Fornecem a Herança Classes que Herdam de Outras

Superclasse Subclasse

Mãe Filha

Tipo Subtipo

Quadro 1 - Termos usados na Herança

Adaptada por Wagner José dos Santos Júnior 80

Page 81: Apostila_Programação Orientada a Objetos

81

Nota: a classe filha não pode remover os atributos e métodos da classe mãe.Abaixo, são apresentados outros termos que são também comumente usados.

Ancestral: é uma classe que aparece na hierarquia de classes em uma posição acima daprogenitora (mãe).

Descendente: dada uma classe, toda classe que aparece abaixo dela na hierarquia é umadescendente da classe dada.

Raiz (ou Base): é a classe topo da hierarquia.

Folha: é uma classe sem filhas.

Atividade 2Considerando a hierarquia de herança entre classes da Figura 2, dê exemplos de:

1. classes superclasse e subclasse;2. classe raiz e classe folha;3. classe ancestral da classe Automóvel, que não seja superclasse dela;4. classe descendente da classe Veículo, que não seja subclasse dela.

Especialização e generalizaçãoAssim como os conceitos de classes Abstratas e Concretas, tem-se também nos extremos da árvore hierárquica deherança, os conceitos de Generalização e Especialização. Na Generalização, como o próprio nome sugere, háclasses mais genéricas e abstratas disponíveis, as quais podem ser usadas para outras descenderem delas. Jáa Especialização é usada para indicar que classes que estão numa posição inferior na hierarquia possuem estado ecomportamento mais especializados, ou seja, com mais detalhes de informações.

A Figura 3 ilustra tais conceitos dentro da hierarquia de classes de transportes, apresentada anteriormente. Como pode ser observado, classes em posição inferior na hierarquia, tal como a classe Automóvel, representam especializações de classes em posição superior (Transporte, Terrestre) na hierarquia. Já classes em posição superior, como a classe Transporte, representam generalizações de classes em posições inferiores (Automóvel, Terrestre)

Adaptada por Wagner José dos Santos Júnior 81

Page 82: Apostila_Programação Orientada a Objetos

82

Figura 3 -Generalização e Especialização

Herança múltipla e simplesHerança Múltipla: é a capacidade de uma classe possuir mais de uma superclasse e herdar as variáveis e métodos combinados de todas as superclasses.

Herança Simples: Cada classe pode ter apenas uma superclasse, embora uma superclasse possa ter várias subclasses.

Na linguagem Java, a Herança é simples e na codificação usa-se a palavra reservada extends para declarar que uma classe é herdeira de outra. Para simular a herança múltipla em Java, usa-se Interfaces.

Funcionamento da HerançaVocê viu os conceitos sobre Herança, mas é importante também que possamos entender o que acontece com umaclasse que utiliza a Herança durante sua execução. Para melhor entendermos o funcionamento da Herança durante aexecução do programa, vejamos a Figura 4.

Figura 4 -Herança em ação

Sabemos que quando criamos um objeto, temos uma instância concreta da classe a qual esse objeto representa. NaFigura 3, esse objeto é representado pelo Objeto1. Agora, vamos supor que o Objeto2quer saber o valordo atributoX desse objeto, através do envio de uma mensagem. Para obter o valor do atributo X, o Objeto1 saiconsultando sua árvore hierárquica de classes até encontrar o atributo solicitado pelo Objeto2. No caso da Figura 4, oobjeto consulta a classe da qual ele foi instanciado (ClasseC), não encontrando, consulta a classe mãe dessa mesma(ClasseB), e assim sucessivamente até encontrar o atributo e o valor. Vale ressaltar que o Objeto1 não percorre todaa árvore hierárquica, percorre o caminho da classe filha em direção à classe mãe.

Outro ponto importante é que o objeto não acumula todos os atributos das classes que fazem parte da hierarquia deherança, mas apenas os atributos das classes ancestrais a ele. O usuário (programador ou outros objetos, tal como oObjeto 2 na Figura 4) de um determinado objeto não sabe (nem precisa saber) se o atributo é dele ou se o atributo éherdado de uma outra classe ancestral dele.

Herança em Java

Depois de termos visto os conceitos sobre Herança, vamos finalmente ver a herança nas linhas de código Java. Comomencionamos anteriormente, em Java a palavra-chave extends é usada para indicar que uma dada classe herda deoutra. A Listagem 1 apresenta exemplos de código em Java, indicando que Terrestre herda de Transporte e

Adaptada por Wagner José dos Santos Júnior 82

Page 83: Apostila_Programação Orientada a Objetos

83

que Automóvel herda de Terrestre.

Listagem 1 - Exemplo de Herança em Java

Vale lembrar que quando uma classe herda de outra, todos os atributos (e métodos) da outra classe passam a fazerparte dessa mesma. Isso significa que, para o exemplo acima, o programador (ou outro objeto) pode solicitar àclasse Automóvel, os atributos de Transporte e Terrestre. Os atributos de Terrestre são acessíveis naclasse Automóvel porque a segunda herda da primeira. E os atributos de Transporte são acessíveisa Automóvel devido ao fato de Terrestre herdar de Transporte.

Uma dúvida que você pode estar se perguntando é: como os atributos são acessíveis se eles estão declarados comoprivate?

Respondendo: considere que para os códigos das classes da Listagem 1 foram declarados os métodos get e set paracada um dos atributos. Através desses métodos, que são também herdados pelas subclasses, podemos acessarfacilmente qualquer um dos atributos herdados. Eles só não foram escritos para ressaltarmos a construção extends deJava definir a herança entre classes. Veremos códigos mais completos na próxima aula.

Dica

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

Anote a Dica

Quando uma classe usa a relação de Herança, podemos dizer que essa classe possui um relacionamentochamado “É um” com a classe da qual ela herda. Tal relação também indica que uma classe é do mesmotipo que outra. Assim, nos exemplos anteriores, podemos dizer que Automóvel “é um”transporte Terrestre, assim como que Terrestre “é um” (ou tipo de) Transporte.

Autoavaliação

Adaptada por Wagner José dos Santos Júnior 83

Page 84: Apostila_Programação Orientada a Objetos

84

1 - Sem consultar o material responda: o que você entendeu por Herança?

2 - Qual a diferença entre Herança simples e Herança múltipla?

3 - Como funcionaria o processo de busca pelos atributos na herança, se fosse solicitado aoobjeto Automóvel a sua capacidade? (Dica: dê uma relida na explicação da Figura 3 da nossa aula).

4 - Considerando o código das classes Transporte, Terrestre e Automóvel apresentados na Figura 4,finalize a implementação delas, adicionando os métodos get() eset() para cada um de seus atributos.Em seguida, crie uma classe Principal com um método main() que cria um objeto da classe Automóvel, echama todos os métodos set() e get() criados, inclusive das classes Transporte e Terrestre. Observe noseu exemplo, que é possível chamar todos os métodos get() e set() herdados pela classe Automóvel.

5 - Das opções abaixo, qual se refere ao conceito de Herança?

a) Herança é a capacidade de reaproveitar outras classes para compor uma nova classe.

b) Herança é a característica da OO de ocultar partes da implementação interna de classes do mundoexterior.

c) Herança é a habilidade de objetos de classes diferentes responderem a mesma mensagem dediferentes maneiras.

d) Herança é o mecanismo que permite a uma classe herdar todos os atributos e métodos de outraclasse.

e) As letras a e d estão corretas

Adaptada por Wagner José dos Santos Júnior 84

Page 85: Apostila_Programação Orientada a Objetos

85

Aula 11 - Herança II

Apresentação

Na aula passada, foram dados os primeiros passos sobre o assunto Herança, um dos pilares da POO. Considerando aimportância desse tema, continuaremos a abordá-lo na aula de hoje, focalizando, sobretudo, a herança decomportamento (método). Serão também apresentados outros exemplos mais sofisticados de implementação deherança na linguagem Java.

ObjetivosAo final desta aula, você deve ser capaz de:

relacionar a herança e o modificador de acesso protected; entender o uso da palavra-chave super no contexto de herança entre classes;

saber como funciona a herança para os métodos, durante a execução do programa.

A Herança e o protectedNa 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 Herança.

Naquela aula, nós mencionamos que o modificador protected funciona como o private exceto que as classes filhastambém terão acesso ao atributo ou método declarado como protected. Isso significa que apenas as classesdescendentes de uma determinada classe poderão ter acesso aos atributos e métodos declarados com essemodificador.

Adaptada por Wagner José dos Santos Júnior 85

Page 86: Apostila_Programação Orientada a Objetos

86

Listagem 1 - Herança em Java com protected e private

Figura 1 - Esquema de Herança

A Figura 1 e a Listagem 1 apresentam o exemplo da aula anterior com algumas pequenas modificações.

As classes Transporte e Terrestre tiveram seus atributos modificados para serem protected, isso significa queapenas classes que pertencem à hierarquia de herança podem acessar diretamente esses atributos. Em outraspalavras, apenas subclasses (ou classes descendentes) de Transporte e Terrestre terão acesso aos seusatributos protected.

A Listagem 2 abaixo mostra a definição de mais um método na classe Automóvel, o qual faz acesso aosatributos protectedcapacidade e numRodas, definidos nas classes ancestrais Transporte e Terrestre,respectivamente. Observe que tais atributos são acessados e usados livremente nométodoimprimeDadosAutomovel(). Isso só é possível 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 classeAutomóvel, dentro de um método main(). Nesse caso, não é possível acessar tais atributos, porque aclasse Principal não herda da classe Terrestre e, portanto, não tem direito a acessar os atributos protected.

Listagem 3 -Acesso a atributos protected

Atividade 11. Modifique as classes Transporte, Terrestre e Automóvel 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

classe Principal da Listagem 3.

Adaptada por Wagner José dos Santos Júnior 86

Page 87: Apostila_Programação Orientada a Objetos

87

3. O que acontece?

4. A compilação e execução funcionaram corretamente? Se sim, explique o que você acha queaconteceu.

A Herança e o superEm suas pesquisas em outras fontes (tutoriais na internet, livros), além do material desta aula, você pode terencontrado o uso da palavra (ou operador) super nos códigos exemplos.

A palavra super é mais uma das palavras reservadas da linguagem Java que tem uma forte ligação com a herança. Apalavra super refere-se à classe ancestral imediata da classe, ou seja, a classe mãe ou super-classe. Ela é usada nosconstrutores para chamada de construtores em cascata das classes mães.

Listagem 4 - Herança em Java com uso do operador super

A Listagem 4 ilustra um exemplo de herança em Java, que faz uso da palavra-chave super. Vamos então entender o

Adaptada por Wagner José dos Santos Júnior 87

Page 88: Apostila_Programação Orientada a Objetos

88

que acontece quando usamos o comando super em tais contextos.

Primeiro, observe que o super é usado para chamar o método construtor da classe mãe. Na classe Transporte,como aclasse mãe de Transporte é Object (vimos na aula passada que Object é o ancestral de todas as classes),o super não tem parâmetro. A chamada de super equivale a uma chamada explícita ao construtor sem parâmetro daclasse Object.

Já no construtor da classe Terrestre, o super tem como parâmetro a capacidade exigida no construtor daclasse Transporte. Portanto, a chamada a super na classe Terrestre é no fundo a chamada ao construtor deTransporte. Já o construtor da classe Automóvel, o super tem como parâmetros a capacidade eonumRodas exigidos pelo construtor da classe Terrestre.

Observando a Listagem 4 dá para observar que uma chamada a super ocasiona a invocação do construtor da classemãe. Isso acaba permitindo uma chamada em cadeia dos construtores de classes ancestrais, permitindo assim aconfiguração de todos os atributos herdados da classe.

Vale ressaltar que se o construtor não possui parâmetro, o compilador Java aceita a omissão do super sem parâmetro,porque durante o processo de compilação ele insere explicitamente tal chamada. Para o nosso exemplo, sequiséssemos poderíamos omitir o super do construtor da classe Transporte.

Anote a Dica

Apenas comentários são permitidos antes da palavra super nos construtores. Assim, não é possívelincluir nenhum comando antes de super() no código de métodos construtores de classes.

Anote a Dica

Da mesma maneira que se usa a palavra-chave this para acessar os atributos (ou métodos) da própriaclasse. Pode-se usar super, para acessar os atributos (ou métodos) da classe mãe.

Atividade 2Hoje, os celulares estão cada vez mais sofisticados, mp3, mp4, acesso web, câmera digital... Crie umahierarquia de classes que possui no topo da hierarquia o celular mais básico, aquele que simplesmenteliga e atende ligações, e que vai sendo refinada com várias outras classes que definem celulares maissofisticados e modernos. Para isso, use a hierarquia e nos construtores das classes use o operador super.Na hierarquia, defina no mínimo três classes.

Um exemplo completo

Vimos até agora diversos exemplos do uso de herança para acessar atributos das classes ancestrais. Vamos mostraragora a herança utilizando os métodos dessas classes.

Adaptada por Wagner José dos Santos Júnior 88

Page 89: Apostila_Programação Orientada a Objetos

89

Listagem 5 - Classe Transporte

Listagem 6 - Classe Terrestre

Adaptada por Wagner José dos Santos Júnior 89

Page 90: Apostila_Programação Orientada a Objetos

90

Listagem 7 - Classe Automóvel

As Listagens 5, 6 e 7 apresentam o código das classes Veículo, Terrestre e Automóvel, incluindo a implementação dosmétodos get e set para cada atributo das classes.

Cada um dos métodos declarados na classe Veículo são herdados pelas classes Terrestre e Automóvel, assim como osmétodos declarados pela classe Terrestre são herdados pela classe Automóvel, exatamente como ocorre com osatributos.

A Figura 8 apresenta um de método main() que cria um objeto da classe Automóvel, em seguida, chama dois métodossetCapacidade() e setNumRodas(). Observe pelas Figuras 5 , 6 e 7 que tais métodos não pertencem à classeAutomóvel, mas são na verdade herdados de suas ancestrais. Dessa forma, percebe-se claramente que uma vezdeclarado um método (público ou protected) em uma das classes ancestrais, aquele método é visível em objetos dasclasses filhas.

Adaptada por Wagner José dos Santos Júnior 90

Page 91: Apostila_Programação Orientada a Objetos

91

Listagem 8 - Classe Principal

Um pergunta: será que a Herança também permite o uso de outros métodos diferentes dos get e set para as classesdescendentes?

A resposta é sim, a Herança serve para todos os métodos, desde que a classe mãe permita. Se um método estiver commodificador private, esse método não estará acessível para classes filhas. Assim, apenas estão acessíveis para classesfilhas, os métodos declarados como public e protected na classe mãe.

Vejamos um exemplo do uso de outros métodos. Vamos acrescentar agora à classe Terrestre um método que calculao número de pneus reservas.

Listagem 9 - Classe Terrestre com método calculaNumPneusReserva()

Na Figura 10, vemos a classe Principal modificada para criar um objeto Automóvel e acessar diretamente o métodocalculaNumPneusReserva() que foi herdado da classe Transporte. Como era de se esperar, mesmo o método sendo daclasse Terreste a classe Automóvel usa sem restrição.

Listagem 10 -Método main modificado

Adaptada por Wagner José dos Santos Júnior 91

Page 92: Apostila_Programação Orientada a Objetos

92

Atividade 3Continuando a Atividade 2, acrescente agora os métodos que darão as funcionalidades dostelefones móveis (celulares). Uma observação é que os métodos ligar() e atender() não precisamser criados novamente nas classes filhas. Uma vez que ele deve está presente na classe Mãe dahierarquia (celular mais simples).

Funcionamento da Herança para os métodosA Herança funciona para os métodos durante a execução do programa, de maneira similar ao funcionamento para osatributos (ver Aula 10). A Figura 11 ilustra tal situação.

Quando o Objeto2 solicita a execução do metodoX() ao Objeto1, esse último inicialmente procura pelo método naprópria classe C que o define. Caso não encontre, ele sai percorrendo sua árvore hierárquica. Nesse caso, emparticular, o metodoX() é encontrado logo na primeira classe ancestral visitada, a ClasseB.

Figura 2 - Herança e os métodos

Autoavaliação1 - Para que serve o modificador de acesso protected? Como ele funciona no caso de Herança entreclasses?

2 - Para que serve a palavra-chave super? Dê um exemplo concreto do seu funcionamento.

3 - Existe alguma diferença entre o funcionamento da Herança para os atributos e métodos?

4 - Descreva o que acontece com o acesso aos atributos e métodos quando são do tipo:

public private protected

5 - Crie as classes utilizando o princípio da Herança, obedecendo à hierarquia da figura abaixo: (Obs: Para

Adaptada por Wagner José dos Santos Júnior 92

Page 93: Apostila_Programação Orientada a Objetos

93

facilitar, substitua na figura o tipo Calendar por String)

a) Acrescente aos construtores a lista de parâmetros necessária para instanciar o objeto. Porexemplo, a classe Pessoa deve ter nome, CPF e dataNasc. E essa lista é acumulativa, ou seja, oconstrutor da classe Funcionário deve ter a lista de seus atributos mais os atributos necessáriospara a classe Pessoa. Dica: não deixe de usar a palavra-chave super em cada um dos construtorespara chamar o construtor da classe mãe, passando os atributos que são mantidos por ela e seusancestrais.

b) Insira os seguintes métodos, para apresentar os valores dos atributos das classes,mostrarPessoa(), mostrarFuncionario(), mostrarChefe() e mostrarAluno(), respectivamente, àsclasses Pessoa, Funcionário,ChefeDepartamento e Aluno. Para imprimir os atributos, use o métodoSystem.out.println() em cada um dos métodos.

c) Crie uma classe TestaTudo com um método main(), que instancia um objeto de cada uma dasclasse e exibe os valores dos atributos através de chamadas aos métodos mostrarPessoa(),mostrarFuncionario(), mostrarChefe() e mostrarAluno().

Aula 12 - Polimorfismo

Apresentação

Hoje, iremos iniciar o aprendizado do último princípio que serve de base para a Programação Orientada a Objeto – oPolimorfismo. Esse princípio também aposta na ideia da reutilização para facilitar o dia a dia da programação. Ele étambém bastante importante tanto para o entendimento de programas OO em Java e outras linguagens, como tambémé um mecanismo bastante sofisticado para permitir a reutilização e flexibilidade durante o desenvolvimento de tais

Adaptada por Wagner José dos Santos Júnior 93

Page 94: Apostila_Programação Orientada a Objetos

94

programas.

ObjetivosAo final desta aula, você deve ser capaz de:

entender o princípio do Polimorfismo; saber quais são os tipos existentes de Polimorfismo; conhecer Polimorfismo de Sobrecarga, de Sobreposição e de Inclusão;

saber o que é Conversão 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, várias formas de responder à mesma mensagem. Veja a figura a seguir para entender onde se localiza opilar do poliformismo dentro da Programação Orientada a Objetos.

Figura 1 - Pilares da POO

Vejamos o seguinte exemplo: um dono de uma fábrica de brinquedos solicitou que seus engenheiros criassem ummesmo controle remoto para todos os brinquedos de sua fábrica. A única restrição era que cada brinquedo atendesseaos comandos específicos definidos pelo controle.

O controle remoto teria vários botões, sendo que todos eles seriam úteis para todos os brinquedos. Assim, quando ousuário clicasse no botão mover,o controle enviaria o sinal MOVER para todos os brinquedos que estivessem no raio dedois metros. A Figura 2 ilustra tal situação.

Adaptada por Wagner José dos Santos Júnior 94

Page 95: Apostila_Programação Orientada a Objetos

95

Figura 2 -Exemplo de polimorfismo

Assim quando o brinquedo recebe o sinal MOVER, ele se move de acordo com a sua função. Para o avião, moversignifica VOAR, para o barco significa NAVEGAR, e para o automóvel CORRER. Observe que os brinquedos respondemao mesmo sinal de formas diferentes. Temos aqui então um caso de polimorfismo.

O Polimorfismo permite que diferentes objetos (avião, barco, automóvel) respondam uma mesmamensagem (mover) de formas diferentes (voar, navegar e correr).

Tipos de polimorfismoO Polimorfismo pode ser classificado de três maneiras:

Polimorfismo de Sobrecarga Polimorfismo de Sobreposição Polimorfismo de Inclusão

Polimorfismo de sobrecarga

Polimorfismo de sobrecarga permite que um método de determinado nome tenha comportamentos distintos, em funçãode diferentes parâmetros(1) que ele recebe. Cada método difere no número e no tipo de parâmetros.Exemplo

Considere uma classe Maior capaz de calcular e retornar o maior entre dois números de tipos diferentes. A Listagem 1ilustra o código de tal classe.

(1) Lembrando: parâmetros são as variáveis que estão dentro dos parêntesis na declaração do método.

Adaptada por Wagner José dos Santos Júnior 95

Page 96: Apostila_Programação Orientada a Objetos

96

Listagem 1 - Polimorfismo de Sobrecarga com tipos de parâmetros diferentes

Veja no exemplo uma aplicação prática do uso do polimorfismo de sobrecarga. Observe que temos vários métodos como mesmo nome, no caso calcMaior(), cujo objetivo é indicar qual é o maior dentre dois números.

O que diferencia cada um deles é o tipo de parâmetros. No primeiro método, os parâmetros são do tipo int. Já nosegundo método, os dois parâmetros são float. Finalmente, no terceiro método, os parâmetros são do tipo double.Esses métodos fazem a mesma coisa (calculam o maior entre dois números), mas de maneiras diferentes, poisrecebem e retornam tipos diferentes.

Observe agora o último método calcMaior() declarado na classe Maior. Esse método, apesar de diferenciar do anteriorpelo tipo de retorno de double para int, não será aceito pelo compilador Java como um polimorfismo de sobrecarga.

O motivo é que já existe um método com o nome calcMaior() e dois parâmetros do tipo double. Esse método seriaaceito se houvesse um número diferente de parâmetro ou um dos parâmetros tivesse o tipo diferente de double.Como mostra a Listagem 2.

Listagem 2 - Polimorfismo de sobrecarga com tipo e número de parâmetros diferentes

Observe que agora os dois últimos métodos possuem número e tipos de parâmetros diferentes dos métodos anteriores.

Adaptada por Wagner José dos Santos Júnior 96

Page 97: Apostila_Programação Orientada a Objetos

97

A sobrecarga e os construtores

O polimorfismo de sobrecarga normalmente acontece sobre os métodos construtores, pois é comum para uma classeter várias maneiras de instanciá-la.

A Listagem 3 ilustra um exemplo de polimorfismo de sobrecarga nos construtores da classe Pessoa. Observe que sãodeclarados 3 construtores e todos eles têm o mesmo nome da classe. Entretanto, cada um deles recebe um númerodiferente de parâmetros.

Assim, durante a criação de objetos do tipo Pessoa em um método main, por exemplo, o construtor que será chamadoirá depender da quantidade e parâmetros passados durante a invocação do comando new.

Listagem 3 - Polimorfismo de sobrecarga de construtores

A sobrecarga e a conversão

Conversão e sobrecarga frequentemente andam lado a lado.

A Conversão é a capacidade de um tipo ser convertido em outro tipo de maneira automática ou pela forçabruta também chamada de coerção.

Veja o quadro abaixo sobre conversão de tipos primitivos.

Conversão de Tipos Primitivos

Java converte um tipo de dado em outro sempre que isso for apropriado.

As conversões ocorrem automaticamente quando há garantia de não haver perda de informação. Asconversões automáticas são permitidas para tipos de maior precisão e para tipos de menor precisão.

Adaptada por Wagner José dos Santos Júnior 97

Page 98: Apostila_Programação Orientada a Objetos

98

Exemplos de Conversões Automáticas

São permitidas as conversões do tipo byte para o tipo short, de short para int, e assim sucessivamente,até chegar o tipo de maior precisão, que é o double.

Observe também algumas conversões permitidas baseadas nas variáveis criadas pelas letras no quadro“Algumas conversões legais”.

A conversão também pode fazer com que um método pareça como se fosse polimórfico. A conversão ocorre quando umargumento de um tipo é convertido para o tipo esperado, internamente. Por exemplo, suponha que a classe Maior,descrita anteriormente, tivesse apenas atributos e métodos para lidar com o tipo primitivo, conforme ilustra a Listagem4.

Listagem 4 - Classe Maior com o método calcMaior para os tipos int e float

Agora suponha que em uma aplicação (método main) usamos um objeto da classe Maior, mas, na chamada de seumétodo calcMaior, fossem passados, ao invés de valores do tipo float, valores do tipo int., conforme ilustra a Listagem5.

Adaptada por Wagner José dos Santos Júnior 98

Page 99: Apostila_Programação Orientada a Objetos

99

Listagem 5 - Conversão automática de tipos primitivos

Observe que, apesar do método esperar parâmetros do tipo float, o compilador aceitou receber parâmetros dotipo int, e os converteu automaticamente para float dentro do método calcMaior da classe Maior apresentada naListagem 5.

Nesse caso, parece um caso de polimorfismo de sobrecarga, mas na verdade o que acontece é uma conversãoautomática de tipos.

Atividade 2Implemente em Java, a classe Brinquedo apresentada na Figura 3 a seguir, aplicando opolimorfismo de sobrecarga nos métodos apontados pelas setas. Em seguida, escreva um métodomain que cria diferentes brinquedos fazendo chamadas para seus diferentes métodos construtorese chamando diferentes métodos velocidade().

Figura 3 - Esquema da classe brinquedo

Polimorfismo de sobreposiçãoPolimorfismo de sobreposição é a redefinição de métodos em classes descendentes. Ou seja, um método de uma classe filha com o mesmo nome de um método de uma classe mãe 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 um metodoX(); (ii)uma classeB, que implementa um método com o mesmo nome; e, finalmente, (iii)uma classeC, que implementa um métodoY().

Adaptada por Wagner José dos Santos Júnior 99

Page 100: Apostila_Programação Orientada a Objetos

100

Figura 4 -Sobreposição de métodos em uma hierarquia de Herança

O que aconteceria se fosse solicitado ao Objeto1 da classeC a execução do metodoX() ?

Conforme você viu nas aulas anteriores sobre Herança, esse método será procurado na hierarquia da classe instanciadapelo Objeto1.

Devemos observar que, nesse caso, o métodoX() que também é implementado na ClasseB, foi encontrado primeiroque o metodoX() da ClasseA.

Nesse caso, o método que de fato será executado será o da ClasseB.

E nesse caso, o metodoX() da ClasseA jamais será alcançado, a menos que seja criado um objeto da ClasseA.Dizemos então que ocorreu uma SOBREPOSIÇÃO DE MÉTODO ou um POLIMORFISMO DE SOBREPOSIÇÃO.O métodoX da classeB sobrepôs (ou redefiniu) o método de sua classe mãe.

O polimorfismo de sobreposição em Java

Considere que a classe Brinquedo (usada no exercício anterior) possui como descendentes asclasses Carro, Avião e Barco, conforme ilustra a Figura 5.

Adaptada por Wagner José dos Santos Júnior 100

Page 101: Apostila_Programação Orientada a Objetos

101

Figura 5 - Hierarquia de Herança da classe Brinquedo

Observe que as classes filhas sobrepõem o método mover() da classe Brinquedo. Vejamos então como ficam essasclasses codificadas em Java na Listagem 6.

Adaptada por Wagner José dos Santos Júnior 101

Page 102: Apostila_Programação Orientada a Objetos

102

Listagem 6 – Implementação em Java da Hierarquia da Classe Brinquedo

Considerando o método mover() de cada classe filha, como poderíamos chamar o método mover() do brinquedo(classe) correto? Ou seja, como o ControleRemoto saberá que método mover ele deve chamar se ele tem disponíveltrês tipos de mover diferentes (um para cada brinquedo)? Vamos ver inicialmente como fica a implementação doControle Remoto na Listagem 7.

Adaptada por Wagner José dos Santos Júnior 102

Page 103: Apostila_Programação Orientada a Objetos

103

Listagem 7 -Classe ControleRemoto

Você lembra que na primeira vez que apresentamos esse exemplo dissemos que a única restrição para um controleremoto tão versátil seria que “quando criado o controle remoto, ele receberia o tipo de brinquedo que iria acionar emum dado instante”?

Pois é, é aí que está o segredo para o controle remoto saber qual deve ser o método mover() que ele deve chamar(CORRER, NAVEGAR ou VOAR). O método construtor da classe ControleRemotoexige que o controle para serinicializado receba um parâmetro do tipoBrinquedo. E isso acontece quando oatributo brinquedo do ControleRemoto recebe “b”(um objeto do tipo Brinquedo).

Então, quando o método mover() da classe ControleRemoto for acionado (isso significa dizer que o botão mover foiapertado), esse faz com que seu atributo brinquedo chame o métodomover()correto, dependendo do tipode Brinquedo que recebeu quando foi instanciado.

A Listagem 8 mostra como fica a classe Principal que instancia um objeto controleRemoto e um objeto carro para sercontrolado automaticamente.

Listagem 8 - Classe Principal com o método main

Observe que criamos um brinquedo do tipo Carro, e quando criamos o ControleRemoto, enviamos esse objeto carropara o objeto controleRemoto através da chamada ao seu construtor. Assim, quando acionado o comandocontroleRemoto.mover(), será chamado o método mover() do carro.

O resultado será a impressão da palavra:

CORRER

Atividade 31. Implemente as classes da hierarquia da classe FiguraGeometrica mostrada na Figura 6

Adaptada por Wagner José dos Santos Júnior 103

Page 104: Apostila_Programação Orientada a Objetos

104

abaixo em Java, aplicando o polimorfismo de sobreposição para o método desenha().

2. Em seguida, crie uma classe Principal com um método main que cria um objeto de cada umadas classes e chama seus respectivos métodos desenha().

Figura 6 - Hierarquia da classe FiguraGeométrica

Polimorfismo de inclusão

Polimorfismo de inclusão usa a capacidade de substituição da Herança(2), de uma classe mãe por qualquer classedescendente, para permitir um comportamento polimórfico nos métodos que usam a classe mãe.

No exemplo visto na seção anterior,veja a classe Principal na Listagem 8, onde criamos um objeto do tipo Carro eoutro do tipo ControleRemoto, nós utilizamos o comportamento polimórfico do polimorfismo de inclusão. Fizemos issoquando substituímos a classe Brinquedo (mãe) pela classeCarro (filha) dentro da classe ControleRemoto.

Assim, o atributo interno do tipo Brinquedo da classe ControleRemoto pode receber qualquer objeto que seja de umaclasse filha de Brinquedo. Para entender melhor o que aconteceu, veja a Figura 7.

(2) Para você entender melhor, veja aula 10 (Tipos de Herança: substituição de tipos).

Figura 7 - Hierarquia da Classe Brinquedo e da classe Controle Remoto

Observe que a classe ControleRemoto está relacionada com a classe Brinquedo, pois possui um atributo do

Adaptada por Wagner José dos Santos Júnior 104

Page 105: Apostila_Programação Orientada a Objetos

105

tipo Brinquedo. Mas, como as classes Carro, Avião e Barco são descendentes deBrinquedo, elas podem substituir a classe Brinquedo em qualquer método que a utilize.

Nesse caso, isso foi feito explicitamente, através da passagem de um objeto da classe Carro para o método construtor de ControleRemoto na Listagem 8.

Caso o programador deseje mudar o controle remoto para interagir com algum outro tipo de brinquedo, bastaria passar um objeto da classe Avião ou Barco na chamada ao construtor da classe ControleRemoto. A capacidade do objeto (brinq) do tipo Brinquedo da classe ControleRemoto de receber qualquer um objeto de subclasses da classe Brinquedo é que caracteriza o polimorfismo de inclusão.

Autoavaliação1 - Sem consultar o material, responda: o que você entendeu por polimorfismo?

2 - Quais são os tipos de polimorfismo?

3 - Qual é a finalidade de se usar o polimorfismo de sobrecarga? Dê um exemplo.

4 - O que é conversão de tipos?

5 - Como funciona o polimorfismo de sobreposição? Dê exemplos.

6 - Explique como funciona o polimorfismo de inclusão? Dê um exemplo.

7 - Implemente o diagrama de classes representado pela Figura 8 abaixo. Para aclasseCadastroPessoas considere o atributo pessoas como um array do tipo Pessoa.

O método cadastrarPessoa(): deve acrescentar ao arraypessoas, um objeto descendente da classePessoa.O método mostraCadastro(): deve percorrer todo o array de pessoas e mostrar todos os dados dodescendente de Pessoa.

Aplique os tipos de polimorfismo em cada uma das situações solicitadas:

a) Polimorfismo de Sobrecarga: crie mais de um método construtor para cadaclasse: Pessoa, Cliente, Funcionario e Gerente.

b) Polimorfismo de Sobreposição: faça com que o método mostraCadastro() utilize o métodomostraDados() correto, dependendo se a Pessoa é umCliente, Funcionario ou Gerente.

c) Polimorfismo de Inclusão: quando for adicionar ao arraypessoas uma nova pessoa que pode ser de umdos tipos descendentes de Pessoa.

Adaptada por Wagner José dos Santos Júnior 105

Page 106: Apostila_Programação Orientada a Objetos

106

Figura 8 - Diagrama de classe

Aula 13 - Atributos e métodos estáticos, classes abstratas e interfaces

ApresentaçãoAté agora, para efeitos de projeto de sistemas, você viu classes (concretas) e objetos, unicamente. Porém, é importanteque você saiba que há recursos mais sofisticados na linguagem Java que permitem que a gente projete de forma maisgenérica e aproximada o mundo real diante de situações que ainda não foram apresentadas nos exemplos anteriores,mas que farão sentido à medida que formos observando as sutilezas que envolvem a arte de desenvolver soluções emTecnologias de Informação (TI)!

Para tanto, teremos a apresentação de atributos e métodos comuns a todos objetos de uma classe, os chamadosatributos e métodos estáticos. Veremos também classes da qual não podemos instanciar objetos diretamente, aschamadas classes abstratas.

Finalmente, conheceremos o conceito de interface em Java, que representa um “contrato” assumido por classes e queas obrigam a implementar um determinado conjunto de métodos de uma determinada forma. Lembre que você vairealizar práticas através dos exercícios apresentados.

ObjetivosAo final desta aula, você será capaz de:

compreender os conceitos que motivam a utilização das técnicas de:atributos e métodosestáticos, classes abstratas einterfaces;

saber a aplicação e contextualização desses conceitos.

Adaptada por Wagner José dos Santos Júnior 106

Page 107: Apostila_Programação Orientada a Objetos

107

Atributos estáticos

Primeiramente, vejamos essa denominação: “atributo estático”.

Nas aulas anteriores, abordamos de forma exaustiva o conceito de atributos, os quais são variáveis declarados nasclasses, e que possuem tipo e nome. Você viu também que os valores dos atributos são definidos pelos próprios objetosinstanciados de uma dada classe. Essa atribuição pode ocorrer de forma direta (caso o atributo seja público), ou atravésde métodos setters que permitem acessá-los (que é o caso dos atributos que são privados), ou mesmo através dospróprios construtores da classe.

Agora, vejamos a denominação “estático”. O que você compreende por esse termo? Algo imóvel, imutável, paralisado?

Pois bem, é aí que “mora o perigo”, pois o termo escolhido para tal variável não foi tão adequado, e dá tipicamente aideia de uma constante.

Atributo Estático ≠ Atributo Constante

A ideia por trás do conceito de atributos e métodos estáticos é a de que objetos de uma mesma classe podem e, emalgumas situações devem, compartilhar valores em comum, caso contrário, teríamos que criar atributos que precisariamser atualizados todos ao mesmo tempo, em cada objeto criado.

Vejamos o seguinte exemplo. Um sistema que controle relógios de ponto de várias filiais com o mesmo fuso horário,nessa situação, quando tivermos que fazer um ajuste ou atualizar a hora, minutos e segundos teremos que fazê-lo emtodos os relógios. Porém, se esse atributo não “pertencer” aos objetos, e sim à própria classe, todos saberão a horacerta, pois se baseiam no mesmo valor. Observe na Listagem 1, o código da classe RelogioPonto.

Adaptada por Wagner José dos Santos Júnior 107

Page 108: Apostila_Programação Orientada a Objetos

108

Listagem 1 - Classe RelogioPonto

Veja o uso da palavra reservada static na declaração dos atributos hora, minuto e segundo. Esse faz com que ocompilador entenda que não será necessário reservar um espaço de memória em cada objeto da classeRelogioPontopara armazenar o valor da hora, minuto e segundo, pois esses valores serão compartilhados por todos os objetos dessaclasse. Logo será necessário apenas um único espaço para armazenar esse valor, juntamente com os códigos dosmétodos da classe.

Vamos criar uma aplicação simples para exemplificar o uso dos atributos estático hora, minuto e segundo. A Listagem2apresenta o código de tal aplicação.

Adaptada por Wagner José dos Santos Júnior 108

Page 109: Apostila_Programação Orientada a Objetos

109

Listagem 2 - Aplicação usando a classe RelogioPonto

Observe que criamos 3 (três) objetos RelogioPonto e na sequência pegamos um desses (filialAlecrim) para atribuir osvalores de hora, minuto e segundo. Logo, em seguida, imprimimos os valores dos três objetos e teremos o seguinteresultado:

Isso ocorre, pois, quando atribuímos valores a variáveis estáticas através de um objeto, estamos atribuindo o valor paratodos os objetos da mesma classe. Por isso, alguns chamam os atributos estáticos de atributos de classe. Para nãosermos redundantes, faremos uma substituição da instrução.

De...

Para...

Adaptada por Wagner José dos Santos Júnior 109

Page 110: Apostila_Programação Orientada a Objetos

110

Pois, quando estamos tratando de atributos de classe (atributos estáticos) em Java, é comum e é uma boa práticausarmos o seu valor utilizando o nome da classe seguido do operador ponto “.” e o atributo que desejarmos.

Observe que, com essa mudança, mostramos que não é necessário criar um objeto da classe RelogioPonto para que sepossa acessar seus atributos estáticos. Quando estáticos, eles estão disponíveis antes mesmo de se criar o objeto.

Com isso, temos como análise geral o seguinte quadro:

Atributo Estático = Atributo Comum ou Compartilhado

Métodos estáticos

A mesma ideia dos atributos estáticos pode ser ampliada e aplicada para os métodos, pois, se quisermos alterar o modode acesso dos atributos hora, minuto e segundo, tornando-os privados (private), por exemplo, teremos que criarmétodos que sejam capazes de alterá-los.

Não é uma boa prática modificar valores de atributos estáticos através de referências para seus objetos. Imagine 10objetos tentando alterar os valores compartilhados, a probabilidade do sistema se tornar caótico (ou dar algum erro) émuito grande. Os métodos estáticos surgiram basicamente para operarem sobre os atributos estáticos, ou que nãorealizam operação alguma sobre os atributos dos objetos. Ou seja, não é do contexto do objeto, mas sim, de sua classe.

Alterando o exemplo apresentado anteriormente (Listagem 1) para trabalhar com métodos estáticos, chegaremos aoexemplo apresentado na Listagem 3. Observe o uso da palavra reservada static na declaração dos métodos que operamsobre os atributos estáticos.

publicclassRelogioPonto { publicstaticinthora; // atributoestatico publicstaticintminuto;// atributoestatico publicstaticintsegundo;// atributoestatico privateintid; private String nomeFilial; publicRelogioPonto(){ } publicRelogioPonto(intident, String filial){ this.id = ident; this.nomeFilial = filial; }

publicstaticintgetHora() { returnhora; }

publicstaticvoidsetHora(inthora) { RelogioPonto.hora = hora;

Adaptada por Wagner José dos Santos Júnior 110

Page 111: Apostila_Programação Orientada a Objetos

111

}

publicstaticintgetMinuto() { returnminuto; }

publicstaticvoidsetMinuto(intminuto) { RelogioPonto.minuto = minuto; }

publicstaticintgetSegundo() { returnsegundo; }

publicstaticvoidsetSegundo(int segundo) { RelogioPonto.segundo = segundo; }

publicintgetId() { returnid; }

publicvoidsetId(int id) { this.id = id; }

public String getNomeFilial() { returnnomeFilial; }

publicvoidsetNomeFilial(String nomeFilial) { this.nomeFilial = nomeFilial; } }

Listagem 3 - Classe RelogioPonto com métodos estáticos

Agora, mais uma alteração deve ser feita na Listagem 2 , de...

Para...

Com isso, temos a utilização dos métodos estáticos diretamente da classe RelogioPonto. Assim como no caso deatributos, também não é necessário criar o objeto da classe para que se possa usar o método.

Adaptada por Wagner José dos Santos Júnior 111

Page 112: Apostila_Programação Orientada a Objetos

112

Atividade 1

Crie uma classe para representar Livros em uma biblioteca, com os seguintes campos: título,autor, gênero, editora e edição. Assuma que o atributo gênero pode ter um dos seguintes tipos:Ficção, Ciências Naturais, Literatura ou Ciências Humanas. Assuma que tais tipos de gêneros sãovalores já conhecidos pela classe Livro, e que todos os objetos devem compartilhá-los.

Classes abstratas

Ao longo dos nossos estudos sobre a programação orientada a objetos em Java, vimos os conceitos e vários exemplosde implementações de classes e objetos. Você viu que as classes são como “moldes” que geram os objetos segundo asua definição.

Todas as classes vistas até agora são o que chamamos de classes concretas, pois são utilizadas para gerar objetosdiretamente. Ou, ainda, estão “prontas” para serem usadas para gerar seus objetos, como formas de bolo ou biscoitosprontas para receberem a massa e darem objetos quentinhos! Mas, existem classes das quais não é possível gerar(instanciar) objetos, são as chamadas classes abstratas.

Primeiro, vejamos o que é uma classe abstrata:

Classe abstrata é aquela declarada como tal, através da palavra reservada abstract, e que pode definirpelo menos um método abstrato.

A Listagem 4 apresenta um exemplo de uma classe abstrata, chamada FiguraAbstrata. Uma figura abstrata representauma figura qualquer, por isso não sabe como ser desenhada e, de fato, não pode ser instanciada, pois ela define ummétodo abstrato (desenha) para se autodesenhar, que ainda está indefinido.

No nosso exemplo, a classe FiguraAbstrata indica que métodos as figuras derivadas dela (subclasses ou classes filha damesma) devem realizar ou implementar. Esses métodos são os chamados métodos abstratos. Uma classe abstrata nãopode instanciar objetos, porém, pode ser derivada por outras classes que, por sua vez, deverão implementar seusmétodos ou declarar-se também abstratas.

Listagem 4 - Classe abstrata FiguraAbstrata

A Listagem 5 apresenta a classe derivada Quadrado (subclasse) da classe FiguraAbstrata.

A classe Quadrado realiza o que precisa para ser desenhada, implementando o método desenha(). É possível criarinstâncias (objetos) da classe Quadrado, porque ela não é abstrata nem é declarada como tal, e também define umaimplementação concreta para o método desenha().

Adaptada por Wagner José dos Santos Júnior 112

Page 113: Apostila_Programação Orientada a Objetos

113

Listagem 5 - Classe Quadrado

A importância das classes abstratas dar-se principalmente em tempo de projeto do sistema, cria um nível a mais deabstração e torna o projeto mais reutilizável.

Atividade 21. Para exercitar o conceito de classes abstratas, crie outras classes derivadas (subclasses) de

FiguraAbstrata como Trapezio, Triangulo etc. Em seguida, implemente o método desenha().

2. Finalmente, crie também uma classe com método main() para tentar instanciar objetostanto da classe FiguraAbstrata quanto das subclasses que você criou. Não deixe de fazerchamada ao método desenha() para ver o que acontece.

Interface

Imagine uma grande equipe de desenvolvimento de software, onde há subdivisões de acordo com a parte que osoftware irá atuar, logo, é necessária uma espécie de contrato para garantir “independência” entre as equipes. Assim,saberão o que deverão fazer sem que saibam exatamente como está sendo implementado pela outra equipe.

Imaginemos que fabricamos softwares para serem implantados em brinquedos como robôs, carrinhos e aviões quepossuem como característica principal a capacidade de se locomoverem segundo os comandos de um controle remoto.Cada brinquedo entende o que precisa fazer para mover-se para frente ou para trás, parar e emitir um sinal delocalização.

Os brinquedos são fabricados por uma companhia e os controles por uma empresa parceira em produção de eletrônicos.Ambos são implementados na linguagem Java. O contrato estabelecido entre os desenvolvedores é de que todos osprodutos que necessitam ser controlados por um controle remoto deverão implementar a interface Mobilidade, cujocódigo é apresentado na Listagem 6.

Listagem 6 – Interface mobilidade

Adaptada por Wagner José dos Santos Júnior 113

Page 114: Apostila_Programação Orientada a Objetos

114

De um lado, as classes que representam os produtos a serem controlados irão “inscrever-se” ou declarar-se implementadoras dessa interface. De outro lado, a classe controle remoto irá operar sobre esses métodos semconhecer nada além do que ela precisa saber, ou seja, o conjunto de métodos da interface mobilidade. Por isso,chamados de interface, ou modo de ver os objetos.

A Listagem 7 apresenta a classe Robô que implementa a interface Mobilidade.

Listagem 7 - Classe Robô

Veja que a classe Robô se define implementadora da interface Mobilidade através da palavra reservada implements,seguida do nome da interface Mobilidade. Outros métodos podem ser definidos livremente pelas classes queimplementam interfaces. O que vemos na definição dos métodos moveBracoDireito() e moveBracoEsquerdo(), porexemplo, são típicos de funções de um robô, mas que certamente não se aplicaria a um veículo de brinquedo.

A Listagem 8 apresenta a classe Trator, que também implementa a interface Mobilidade. Assim como a classe Robô, aclasse Trator implementa a interface Mobilidade e declara outro método chamado de ergueEscavadeira(), querepresenta uma funcionalidade extra e que não será controlada remotamente.

Adaptada por Wagner José dos Santos Júnior 114

Page 115: Apostila_Programação Orientada a Objetos

115

Listagem 8 - Classe Trator

Assim, como o método moveBracoDireito() da classe Robô, o método ergueEscavadeira() da classe Trator faz umaatividade específica para o brinquedo. E, por isso, só é definido no próprio brinquedo.Por fim, temos a classeControleRemoto que realiza operações sobre objetos “Móveis” que implementam a interface Mobilidade. Veja a Listagem9.

Adaptada por Wagner José dos Santos Júnior 115

Page 116: Apostila_Programação Orientada a Objetos

116

Listagem 9 - Classe ControleRemoto

Observe que a classe ControleRemoto possui métodos que operam sobre objetos de classes que implementam ainterface Mobilidade, sejam eles quais forem. Por isso, na declaração dos métodos, não está explícito classes comoTrator ou Robô, pois o controle trata-os de forma transparente. Esse exemplo também representa uma das formas depolimorfismo.

Atividade 3

Para praticar os conceitos aprendidos, crie uma classe com um método main() que teste a classecontrole remoto, através da criação de objetos da classe Trator e Robô e veja como são tratados deforma idêntica pela classe ControleRemoto.

Autoavaliação1 - Defina o que é um atributo estático.

2 - Defina o que é um método estático.

3 - Exercite a imaginação e crie para cada classe a seguir um atributo estático:

a) Pessoa

b) Carro

c) Livro

d) ConsultaMédica

e) HistóricoEscolar

4 - Você é capaz de comparar os conceitos de interface e classe abstrata, destacando semelhanças de um

Adaptada por Wagner José dos Santos Júnior 116

Page 117: Apostila_Programação Orientada a Objetos

117

lado e diferenças do outro?

5 - Defina uma outra interface, cujas classes Trator e Robô irão implementar, que represente a suamanutenção energética, pois ambos precisam recarregar baterias, ligar, desligar etc.

Aula 14 - Juntando as Peças

Apresentação

Nesta aula, você verá vários conceitos da Programação Orientada a Objetos sendo usados de forma conjunta. O objetivo éentender como a POO funciona de fato. Através de exemplos e exercícios, vamos ver em ação os mecanismos dalinguagem Java na implementação desse revolucionário paradigma. Assim, durante a aula você vai praticar os conceitos ea linguagem Java de forma mais ampla.

ObjetivosAo final desta aula, você será capaz de:

compreender como os conceitos da POO podem ser usados conjuntamente;

perceber a aplicação dos conceitos OO e mecanismos da linguagem Java.

Encapsulamento e Herança

Os conceitos de Encapsulamento e Herança são relacionados e se entrelaçam. Vimos anteriormente que cada classe defineseus atributos e a forma de acesso aos mesmos, de forma a preservar a segurança dos dados (atributos) com relação aalterações acidentais ou não desejadas.

Uma das formas de controlar tal acesso é simplesmente impossibilitar que código externo possa acessá-la. Isso é o quechamamos de encapsulamento. Você viu também que uma classe pode possuir outras classes descendentes, e que nocaso herdam seus respectivos atributos e comportamentos. Isso é o que chamamos Herança. Veja os pilares daprogramação orientada a objetos.

Adaptada por Wagner José dos Santos Júnior 117

Page 118: Apostila_Programação Orientada a Objetos

118

Figura 1 - Pilares da POO

Um dos pontos que não discutimos em aulas anteriores, diz respeito à forma de acesso (visibilidade) dos atributos declasses filhas. Voltemos a esse ponto.

Considere uma classe mãe (Listagem1) com os seguintes atributos: idade, nome, sobrenome materno e sobrenomepaterno. E uma classe filha, chamada Filha (Listagem 2), em que iremos experimentar os modificadores de acesso dianteda estrutura hierárquica definida entre essas classes.

Listagem 1 - Classe Mãe

Listagem 2 - Classe Filha

Observe que a classe Filha herda todos os atributos de sua Mãe, porém, o atributo sobrenomeMaterno não pode seracessado diretamente de dentro da classe Filha por ser do tipo private. Logo, a linha comentada representa um erro para

Adaptada por Wagner José dos Santos Júnior 118

Page 119: Apostila_Programação Orientada a Objetos

119

o compilador Java.

Os demais atributos são do tipo protected e public. Atributos public podem ser acessados de qualquer lugar no programa erepresentam o extremo do acesso livre em Java. Atributos protected são aqueles que podem ser acessados apenas pelassubclasses da classe que declara tais atributos.

Os atributos public e protected são sempre visíveis em classes filhas.

Os atributos private não. Porém, eles estão lá! Não se esqueça, o fato de não estar visível não significa nãoexistir. Pois, podemos modificá-los através dos construtores da classe mãe (fazendo chamadas como super), assim como usando os métodos get e set definidos na classe mãe.

Lembre-se:

A classe filha sempre herda as característica da mãe, mas só pode ver o que a mamãe deixa ;-).

Para praticar, que tal fazermos um exercício?

Atividade 11. Altere a classe Filha adicionando novos atributos, um deles chamado apelido, que pode ser

acessado por qualquer classe, outro chamado esportePreferido, restrito a classes queherdam da classe Filha.

2. Adicione uma classe Filha de Filha, chamada Neta e nela crie métodos para acessar todosos atributos

Os exemplos que vimos sobre herança e encapsulamento demonstraram sua utilização através deatributos, porém, tudo que vimos se aplica exatamente da mesma maneira com os métodos.

Encapsulamento e composição

Vimos durante nossa viagem pelo mundo OO que objetos podem ser compostos por outros e mantêm as referências detais objetos como seus atributos. Pois bem, esses atributos que representam referências para outros objetos estãosujeitos às mesmas regras de encapsulamento dos demais atributos de tipos primitivos de dados que cada classemantém.

É interessante nos indagarmos em que situações queremos que a composição de um objeto tenha seu acessopreservado pelas demais instâncias, ou, até mesmo de classes filhas. Os exemplos vistos até então foram bastantesimples e usados apenas para observar como funciona o compartilhamento de atributos entre os métodos. Porém, emsistemas complexos, é comum termos que tomar decisões como essa, pois desenvolver sistemas também pressupõegerenciar complexidade.

Vejamos um exemplo de um sistema que gerencia a rotina diária de operações de uma oficina mecânica.Geralmente,um sistema é pensado, projetado e implementado, segundo competências bem específicas. Isso significaque a oficina possui diferentes setores para atendimento ao cliente, manutenção, estoque de peças, almoxarifado deferramentas e equipamentos. Cada setor lida com uma competência específica do sistema. Logo, internamente, osistema precisa encapsular informações que não interessam a determinadas competências.

Vamos isolar uma pequena situação e localizar no código como a composição e o encapsulamento resolvem nossoproblema. Vejamos a Listagem 3 a seguir.

Adaptada por Wagner José dos Santos Júnior 119

Page 120: Apostila_Programação Orientada a Objetos

120

Listagem 3 -Classe Peça

A classe Peça representa um elemento atômico de todos os veículos. Ela é usada para representar diferentes peçasmecânicas, tais como, parafuso, porcas, rolamentos, presilhas, correias etc.

Essa classe define todos os seus atributos como private, porém, sendo ela uma classe que servirá apenas comorepositório desses dados, alguns projetistas iriam preferir defini-los como public, o que a tornaria equivalente a umaestrutura structexistente nas linguagens procedurais. Embora, por boa prática de POO, seja comum sempre mantertodos os atributos privados ou protected, que é o princípio do encapsulamento.

Já a classe Componente, apresentada naListagem 4, representa um elemento de mais alto nível no conjunto deelementos mecânicos de um carro, ou seja, um componente é um conjunto de peças organizadas de forma lógica e comuma determinada função no veículo. Por exemplo, roda é um conjunto de rolamento, aro, parafusos com função bemdefinida; já a direção do carro é composta da barra e rolamento; e assim por diante.

Finalmente, o motor de um veículo é tão complexo em relação a outros componentes que só ele poderia ser umacategoria específica, sendo definido como uma classe que herda da classe Componente, composto por um conjunto deoutros componentes.

A Listagem 5 ilustra uma estratégia de implementação da classe Motor. Observe que ela é definida como sendocomposta de um Arrayde objetos da classe Componente, mas por ser também um Componente, ela herda de tal classe.

Por fim, toda a estrutura mecânica do veículo irá fazer parte de um conjunto separado dos acessórios e demaiscomponentes do acabamento do veículo, como estofamento, pintura etc.

Listagem 4 - Classe Componente

Adaptada por Wagner José dos Santos Júnior 120

Page 121: Apostila_Programação Orientada a Objetos

121

Listagem 5 - Classe Motor

Atividade 2Defina uma classe Carro composta por diversos componentes e peças, de acordo com as classesdefinidas anteriormente. Incremente as classes se necessário.

Atenção:não esqueça de criar uma classe com um método main() para verificar o funcionamentocorreto dos métodos criados.

Herança, composição e polimorfismo

Vejamos agora como os conceitos de herança, composição e polimorfismo podem co-existir numa mesma solução. Vamos partir do seguinte ponto de vista: existem objetos que possuem um fim em si mesmo, como um lápis, chave defenda, mouse. No entanto, existem objetos que são usados para complementar outros, como um apontador,ummousepad; há outros que servem apenas como repositório: bolsas, organizadores, gavetas etc.

Para exemplificar, considere um objeto que funciona como repositório: um guarda-roupas!

Como o próprio nome diz, ele serve para guardar outros objetos do tipo Roupa. Vamos imaginar os objetos que estãoenvolvidos nessa perspectiva, desde os objetos mais abstratos até os mais detalhados (ou concretos), conformedesejamos. Por exemplo, uma roupa possui características, como cor, tecido, manequim, preço, estampa etc. Umaroupa pode ser de vários tipos, como esportiva, social, casual, de banho, fardamento etc.

Logo surge a questão: iremos definir os tipos existentes de roupa como subclasses da classe Roupa? Assim como nomundo real, no mundo OO não existe uma resposta certa para todas as situações. Isso irá variar dependendo do nívelde detalhamento que você desejar implementar sua solução. Uma alternativa é definir um atributo, chamado tipo, naclasse Roupa.

Outra forma é definir uma subclasse para cada tipo de roupa que existir. Uma solução intermediária é definir subclassespara os tipos de roupas mais comuns e reservar um atributo para descrevê-la quando não houver uma classificação pré-definida. Devido a restrições de espaço, ilustraremos apenas essa última solução. A seguir, são apresentadas as classesde tal solução. A Listagem 6 ilustra a classe Roupa.

Adaptada por Wagner José dos Santos Júnior 121

Page 122: Apostila_Programação Orientada a Objetos

122

Listagem 6 -Classe Roupa

Vamos agora definir os tipos principais de roupas existentes, são eles: esportivas, sociais e fardamentos. Logo,precisamos gerar mais três classes derivadas de roupa. A Listagem 7, Listagem 8 e a Listagem 9 ilustram o código detais classes.

Adaptada por Wagner José dos Santos Júnior 122

Page 123: Apostila_Programação Orientada a Objetos

123

Listagem 7 - Classe Esporte

Listagem 8 - Classe Social

Adaptada por Wagner José dos Santos Júnior 123

Page 124: Apostila_Programação Orientada a Objetos

124

Listagem 9 - Fardamento

Listagem 10 -Classe GuardaRoupa

Adaptada por Wagner José dos Santos Júnior 124

Page 125: Apostila_Programação Orientada a Objetos

125

Vamos agora criar uma classe que serve para armazenar objetos do tipo Roupa e suas derivadas. A classeGuardaRoupas, apresentada na Listagem 10, é responsável por armazenar as roupas em compartimentos distintos porcategoria.

Observe que os métodos da classe GuardaRoupa adicionam e retiram roupas independentes se são social, esportiva oufardamento. No método confereRoupas(), será mandado uma mensagem para que cada objeto roupa exiba seus dados,através do polimorfismo. Observe que cada objeto irá executar o método como sua classe definiu e as mensagens serãoenviadas de forma transparente a todos eles.

Vejamos, na Listagem 11, agora, uma classe que define um método main() para criação de objetos Roupa eGuardaRoupa.

Listagem 11 - Classe VestuarioMain

Juntando as peças

Até agora, vimos os conceitos um a um, como se relacionam os mecanismos básicos da linguagem Java. Acredite, você já é capaz de escrever sistemas mais complexos!

Mas, sejamos realistas, saber “mexer as peças” de um tabuleiro de xadrez não nos faz um bom enxadrista. Para tanto, precisamos dominar realmente as técnicas, praticar diariamente e adquirir experiência na resolução de problemas.

Iniciamos a jornada, precisamos nunca parar, pois: programar é preciso! Vamos começar explorando nossa habilidade em

Adaptada por Wagner José dos Santos Júnior 125

Page 126: Apostila_Programação Orientada a Objetos

126

interpretar problemas e projetar soluções.

Atividade 3Resolva os problemas a seguir.

PROBLEMA 1 – Vestuário

O último problema apresentado tratava do manejo de peças de um vestuário. Sendo que apenaspara armazená-lo em um guarda-roupas.

Vamos ampliar a situação e tratarmos o problema de forma mais ampla. Para isso, vamos organizaras ideias da seguinte forma: iremos listar todos os pontos observados do problema, em seguida,projetar as classes que irão compor o sistema, só então partiremos para a codificação.

Eis o problema:

1. As roupas se dividem em categorias, sendo essas:o Socialo Esporteo Esporte Finoo Trabalho

2. Todas as roupas possuem características como:o Coro Número do manequimo Tecido com o qual é feitoo Preço

3. As roupas podem se encontrar em 3 (três) situações (status) distintas:o No guarda-roupaso Em usoo Na lavanderia

4. O sistema deve nos dizer:o Quantas roupas estão na lavanderiao Quantas roupas estão no guarda-roupaso Qual a cor predominante no guarda-roupaso Adicionar e remover roupas

Dica: utilize o código apresentado durante esta aula como ponto de partida e faça as modificações necessárias. Será preciso criar uma classe Lavanderia para agrupar as roupas em não estão em usonem no guarda-roupas.

PROBLEMA 2 – Oficina Mecânica

Vamos voltar ao exemplo da nossa Oficina. Lembra das competências pelas quais as empresas organizam suas atividades?Pois bem, nossa oficina está passando por um processo de modernização e, dentre os investimentos, resolveu encomendar um sistema que gerencie as etapas fundamentais do processo.

Vamos dividir o problema para definirmos melhor a solução, da forma apresentada a seguir.

Atendimento ao cliente

A oficina precisa guardar os dados de clientes como:Nome, CPF, endereço e telefone.

Manutenção

A oficina precisa conhecer bem os automóveis, claro! Todo veículo possui os seguintes dados:

Adaptada por Wagner José dos Santos Júnior 126

Page 127: Apostila_Programação Orientada a Objetos

127

Placa, ano, marca, modelo, numeração do chassi, tipo de combustível, proprietário (um cliente).

Almoxarifado

Suponha que a oficina tenha todas as peças de reposição necessárias à manutenção dos veículos; eque cada peça é consultada por seu nome, ano, marca e modelo do veículo.

Exemplo: “o mecânico Antônio precisa de um carburador para um Volkswagen Fox 2005”.

Nosso desafio é criar todas as classes necessárias para implementar esse sistema, observando as composições, herança e polimorfismo vistos até aqui.

Adaptada por Wagner José dos Santos Júnior 127

Page 128: Apostila_Programação Orientada a Objetos

128

REFERÊNCIAS

BARNES, David J.; KÖLLING Michael.Programação orientada a objetos com Java. São 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. Tradução: Daniel Vieira. Rio de Janeiro: Campos, 2003.

SANTOS, Rafael. Introdução à programação orientada a objetos usando Java. São Paulo: Editora Campus, 2003.

SINTES, Anthony. Aprenda a programar orientada a objeto em 21 dias. Tradução: João Eduardo Nóbrega Tortello. São Paulo: Pearson Education do Brasil, 2002.

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

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

______. About the Java Technology. Disponível em: <http://java.sun.com/docs/books/tutorial/getStarted/intro/definition.html>. Acesso em: 13 maio 2010.

WIKIPÉDIA. Máquina virtual Java. Disponível em: <http://pt.wikipedia.org/wiki/Máquina_virtual_Java>. Acesso em: 13 maio 2010.

Adaptada por Wagner José dos Santos Júnior 128