You are on page 1of 128

2

Programao Orientada a Objetos

1 Introduo Programao Orientada a Objetos

Apresentao
Nesta disciplina de Programao Orientada a Objetos(POO),voc vai estudar os conceitos necessrios para se aplicar o
paradigma da Orientao a Objetos na programao de computadores. Nas primeiras aulas, voc vai estudar
basicamente a teoria e no decorrer do curso iremos colocar em prtica os conceitos tericos aprendidos.
Os exerccios prticos sero desenvolvidos usando a linguagem Java. natural e previsvel que, aps esse curso, voc
no seja ainda um excelente programador, pois isso leva anos de prtica, mas podemos afirmar que voc ter uma
base slida para construir sua carreira como programador utilizando esse que o principal paradigma de
desenvolvimento de software atualmente, a Orientao a Objetos.

Objetivos
Ao final desta aula, voc ser capaz de:

diferenciar Programao Estruturada e POO;


conceituar Classes e Objetos;
conceituar Atributos e Mtodos;
entendera realidade sob o ponto de vista da POO.

Introduo
A Programao Orientada a Objetos (POO) um paradigma de programao de computadores que usa os conceitos
de Objetos e Classes como elementos centrais para representar e processar dados usados nos programas.

Voc sabe o que um Paradigma?


Segundo o dicionrio Houaiss, paradigma significa modelo, padro, exemplo. Assim um paradigma de POO
a maneira como pensamos e iremos fazer nossos programas.

E dessa maneira que iremos aprender a ver o mundo em nossa volta. O mundo dos objetos!

Adaptada por Wagner Jos dos Santos Jnior

Como tudo comeou


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

Figura 1 Alan Kay

Conceitos da Programao Orientada a Objetos


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

Figura 3 Colaborao de Objetos


A Programao Orientada a Objetos est sedimentada sobre quatro pilares derivados do princpio da abstrao, so

Adaptada por Wagner Jos dos Santos Jnior

eles: Encapsulamento, Herana, Composio e Polimorfismo.


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

Figura 4 Pilares da Orientao a Objetos

Objetos
O que so objetos? Na programao OO, objetos so usados para representar entidades do mundo real ou
computacional. Ou seja, os objetos so usados para representar aqueles elementos e abstraes que fazem parte da
soluo do programa que estamos desenvolvendo.
Se observarmos ao nosso redor, veremos vrias entidades ou abstraes as quais podem ser representadas como
objetos no nosso programa. As pessoas e seus carros podem ser vistas como objetos. Na Figura 5, ilustramos, por
exemplo, a pessoa de nome Camila que tem um carro Ferrari.
Os objetos possuem caractersticas pelas quais os identificamos e finalidades para as quais os utilizamos. Essas
caractersticas so tipicamente chamadas de atributos, no linguajar da programao OO. Cada objeto Pessoa, por
exemplo, possui um RG, um nome, uma data de nascimento, etc. J os objetos do tipo Carro possuem um tipo, uma
cor, uma quantidade de portas. A Figura 5 mostra os diferentes atributos que os objetos Camila e Ferrari possuem,
assim como os valores que esto assumindo.
Finalmente, objetos podem tambm ter comportamentos associados. Objetos do tipo Pessoa, por exemplo, podem
andar, correr ou dirigir carros. J os objetos do tipo Carro podem ter os seguintes comportamentos: ligar, desligar,
acelerar, frear. A Figura 5tambm ilustra os comportamentos que objetos Pessoa e Carro podem ter.
Assim, na POO os objetos possuem caractersticas e comportamentos. As caractersticas tambm podem ser chamadas
de dados ou atributos. Enquanto os comportamentos tambm podem ser chamados de operaes ou mtodos.

Adaptada por Wagner Jos dos Santos Jnior

Exemplos
Caractersticas: (dados, atributos)
tipo: Ferrari
placa: KZE1018
cor: vermelha
nmero de portas: 2
Comportamentos: (operaes, mtodos)
ligar
desligar
acelerar
frear
Caractersticas:
nome: Camila
cor do cabelo: negro
biotipo: magro
Comportamentos:
andar
correr
dirigir Carro
Figura 5 Exemplos de objetos

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

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

Adaptada por Wagner Jos dos Santos Jnior

6
Tipo: ?
Cor: ?
Placa: ?
Nmero de Portas: ?
Figura 6 Classe Carro
A Figura 7 mostra como a partir da classe (entidade abstrata) podemos criar vrios objetos diferentes (entidades
concretas). Dois diferentes carros foram criados tomando como base a estrutura da classe. Outros objetos carro podem
ser criados usando a classe Carro como molde.

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

OBJETOS

Tipo: Porsche

Tipo: Ferrari

Cor: Cinza

Cor: Vermelho

Placa: MHZ-4345

Placa: JKL-0001

Nmero de Portas: 2

Nmero de Portas: 4
Classe Carro e dois objetos concretos

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

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

Adaptada por Wagner Jos dos Santos Jnior

Exemplos de classes e objetos


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

objetos fsicos (um livro, uma mercadoria, uma nota fiscal);


funes de pessoas para os sistemas (cliente, vendedor);
eventos (uma compra, um telefonema);
lugares (loja matriz, revenda norte).

Adaptada por Wagner Jos dos Santos Jnior

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

Objetivos
Ao final da aula, voc ser capaz de:

conhecer um pouco da histria da linguagem Java e sua importncia no desenvolvimento


de software da atualidade;
entender a teoria sobre Classe;
entender em detalhes uma classe codificada usando a linguagem Java;
criar atributos e mtodos em classes Java.

Introduo linguagem Java


Voc j conhece a linguagem Java? J pesquisou sobre isso? Bem, a linguagem Java atualmente uma das mais
utilizadas e com maior nmero de programadores no mundo inteiro. Sua popularidade se deve principalmente s
seguintes caractersticas: 1. a portabilidade capacidade de escrever cdigo capaz de ser executado em vrias
plataformas e sistemas operacionais; 2. suporte a vrias tecnologias (redes, acesso a banco de dados etc.); 3.
disponibilidade em vrios dispositivos mveis, como celular, palmtop e PDAs. Outra caracterstica fundamental ser
uma linguagem aberta e que evolui de acordo com os desejos da sua comunidade de programadores, alm de possuir
vrias ferramentas gratuitas disponveis para os desenvolvedores.
Para saber mais...
Funcionamento geral de programas Java
Um arquivo .java quando compilado, atravs do compilador Java, torna-se um arquivo .class. Esse .class
contm cdigos bytecodes que a linguagem utilizada pela Mquina Virtual Java (JVM ou Java VM). Veja
a Figura 1.

Figura 1 Converso de cdigo Java em Linguagem de mquina


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

Adaptada por Wagner Jos dos Santos Jnior

Figura 2 Java para os vrios Sistemas Operacionais

Histrico
No inicio dos anos 1990,a Sun Microsystems estava implementando um projeto chamado Green Project cujo objetivo
era gerar a interao, sem a participao humana, entre os eletrodomsticos comuns usados pelas pessoas. Para a
execuo dessa ideia, James Gosling, um dos mentores do projeto, sentiu a necessidade de criar uma nova linguagem
que superasse as limitaes encontradas na linguagem C. Essa linguagem foi chamada de OAK (em portugus
significa carvalho) que, segundo conta-se, foi inspirado na rvore que James via janela de seu escritrio. Infelizmente, a
ideia e o projeto original de Oak no obtiveram sucesso!
Entretanto, a Internet estava crescendo e se apresentando como uma nova alternativa de interao. Em maio de 1995,
James Gosling adaptou a linguagem OAK para Internet e batizou-a de Java. A linguagem que foi projetada para
dispositivos heterogneos encontrou seu ambiente na rede mundial atravs de aplicaes que podiam ser executada
dentro dos browsers nos Applets Java. A partir da, usurios e fornecedores (como a IBM) cresceram de maneira
assustadora e ela tornou-se a linguagem que se expandiu mais que qualquer outra linguagem da histria da
computao. Hoje, a linguagem Java referncia popular para o desenvolvimento de software na Internet,
Celulares, Palmtops,
Jogos,
Solues
de
Negcios,
Cartes
Inteligentes
etc.
(Baseado
em:
<http://pt.wikipedia.org/wiki/Java e http://www.java.com/en/javahistory>. Acesso em: 4 fev. 2010.)

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

A classe o modelo ou molde de construo de objetos.


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

Adaptada por Wagner Jos dos Santos Jnior

10

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

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

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

Palavra obrigatria para indicar


a criao de uma classe.

Nome da classe escolhido pelo


programador. Por padro,
utiliza-se sempre a primeira
letra maiscula.

Conjunto de caractersticas dos objetos da


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

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

Adaptada por Wagner Jos dos Santos Jnior

10

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 numrico inteiro.

Listagem 2 Classe Pessoa em Java


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

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

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

Adaptada por Wagner Jos dos Santos Jnior

11

12

Listagem 3 Classe Carro com mtodos


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

Listagem 4 Classe Carro com mtodos sem a palavra chave this


A regra Java para definirmos os mtodos :

Adaptada por Wagner Jos dos Santos Jnior

12

13

Listagem 5 Exemplos de mtodos


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

Adaptada por Wagner Jos dos Santos Jnior

13

14

Listagem 6 Classe Carro completa

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

Adaptada por Wagner Jos dos Santos Jnior

14

15

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

Autoavaliao
1.
2.
3.
4.
5.

O que uma classe e para que serve?


Como se escreve uma classe em Java?
Como se representam as caractersticas em uma classe?
Quais tipos de atributos voc conhece?
Qual a regra bsica de criao de um mtodo de uma classe?

3 Um Programa em Java e a criao de Objetos

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

Objetivos
Ao final desta aula, voc ser capaz de:

aprender como criar um programa executvel em Java;


aprender como criar um objeto em Java;
conhecer o conceito e a criao dos mtodos Construtores.

O ponto de partida
Para que um programa Java execute ou rode, como costumamos dizer, necessrio que exista um mtodo especial
chamado main(...), o qual veremos em detalhe na sequncia. Esse mtodo responsvel pelo incio da execuo
do Aplicativo ou Programa escrito em Java.
Aplicativos so programas que podem ser executados sozinhos. A classe que serve de ponto de partida
para o aplicativo. Todo aplicativo em Java precisa ter um mtodo main().
publicstaticvoidmain(String arguments[]){
//corpo do mtodo
}
Se em um mesmo aplicativo houver mais de uma classe com o mtodo main(),quando ummain de uma das
classes for executado, os demais sero ignorados enquanto o programa executado.

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

Adaptada por Wagner Jos dos Santos Jnior

15

16
anterior, veja a Listagem 1:

Listagem 1 Classe Carro


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

Adaptada por Wagner Jos dos Santos Jnior

16

17

Listagem 2 Classe Main


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

criar um objeto Carro;


definir seus atributos;
exibir seus atributos.

Antes disso, vamos preparar o nosso ambiente de desenvolvimento:

Ambiente de desenvolvimento

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

Figura 1 Prompt de comandos com as pastas poo\aula3


2. Compile os cdigos com o comando javac. Esse comando executa um programa responsvel por traduzir o cdigo
Java contido nos arquivos .java para arquivos executveis .class, ou seja, o compilador java ou Java compiler.Veja isso

Adaptada por Wagner Jos dos Santos Jnior

17

18

na Figura 2.

Figura 2 Compilando os arquivos java


3. Execute o mtodo main() da classe Main. Veja a execuo na Figura 3.

Figura 3 Execuo da classe Main


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

Adaptada por Wagner Jos dos Santos Jnior

18

19

Listagem 3 Mtodo main() com um comando de impresso de informao


Aps a execuo,obtemos o resultado apresentado na Figura 4:

Figura 4 Execuo do Main com impresso de informao


A nova linha escrita representa um comando responsvel por exibir uma mensagem na tela do terminal. Como a
linguagem Java totalmente orientada a objetos, essa instruo construda como uma chamada do mtodo println()
do objeto out da classe System. Mais na frente, veremos em detalhe essa instruo. No momento, basta sabermos que
tal chamada imprime mensagens na tela do computador.

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

Adaptada por Wagner Jos dos Santos Jnior

19

20

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

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

Figura 5 Esquema de criao de um Objeto


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

Listagem 5 Definio de atributos usando o mtodo set


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

Listagem 6 Exibio dos valores dos atributos


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

Adaptada por Wagner Jos dos Santos Jnior

20

21

Listagem 7 - Mtodo main completo


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

Figura 6 Execuo do mtodo main

Adaptada por Wagner Jos dos Santos Jnior

21

22

Atividade 2
1. Crie no exemplo apresentado outra varivel Carro chamada outroCarro.
2. Defina valores distintos aos seus atributos atravs de seus respectivos mtodos set e os exiba como foi
feito com a varivel meuCarro.

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

Listagem 8 Construtor para classe carro


Observe que esse mtodo possui o mesmo nome da Classe Carro e no possui tipo de retorno, pois seu retorno, como
j mencionamos, justamente a referncia para o objeto na memria,lembra-se disso?
Ateno, se fizermos apenas essa alterao, iremos nos deparar com um erro de compilao na classe
Main. Voc sabe por qu?
Toda classe possui um construtor implcito e padro, sem argumentos, por isso, utilizamos o operador new mais o nome
classe Carro e os ( ):
Carro meuCarro = new Carro();
Observe que quando utilizamos o operador new no existem argumentos (ou parmetros)dentro dos parnteses. Isso
significa que podemos estar usando o construtor padro (ou em ingls:default).
Quando em uma classe define-se outro construtor, no podemos mais usar o construtor padro, a no ser que se defina
explicitamente um construtor sem parmetros, como mostra o construtor 1 na Listagem 9. Com isso, a classe Carro
ficar com dois construtores.

Adaptada por Wagner Jos dos Santos Jnior

22

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 foram
inicializados (receberam valores). Isso significa que existem duas maneiras de se construir um objeto derivado da classe
Carro, ou do tipo Carro, com ou sem inicializao dos valores dos atributos.
Com isso, fechamos a base para se criar um objeto a partir de uma classe e ainda executar um programa que utilize
esse objeto.

O que so construtores?
Construtores so mtodos especiais para a criao e inicializao de novas instncias de
classe(objetos).
Inicializam o novo objeto e seus atributos.
Criam todos os outros objetos de que esse objeto necessita.
Realiza todas as outras operaes que ele precisa para ser inicializado.
O que faz o operador new?
Ele inicializa o novo objeto e seus atributos, criam todos os outros objetos de que esse objeto
necessita e realizam todas as outras operaes de que ele precisa para ser inicializado.

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

Autoavaliao
1. Edite o arquivo Carro.java adicionando mais atributos classe, como marca, modelo, ano de fabricao,
tipo de combustvel (lcool, gasolina ou flex).
2. Edite o arquivo Main.java para definir e exibir os novos atributos.
3. Crie um segundo carro na classe Main utilizando o construtor com parmetros.

Aula 4 Sistemas OO

Adaptada por Wagner Jos dos Santos Jnior

23

24

Apresentao
Agora, voc ser apresentado ao verdadeiro mundo da Orientao a Objetos. Voc ter a oportunidade de estudar de
que maneira construmos sistemas de grande porte utilizando princpios bsicos desse paradigma e mecanismos da
linguagem Java.

Objetivos

entender o que realmente um Sistema OO;

compreender o mecanismo de troca de mensagem entre os objetos.

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

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

24

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

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

Nos sistemas orientados a objetos, quando objetos de classes distintas possuem uma troca de mensagens muito
frequente, por possurem uma autodependncia forte, ou cooperarem entre si por objetivos mtuos, comum
estabelecermos um relacionamento entre essas classes.
O nosso exemplo do mundo real expresso atravs do computador e da impressora possui um relacionamento entre
ambos, pois quando solicitada a impresso de um documento meu computador j possui um cadastro das
impressoras de que disponho, caso contrrio, terei que instalar uma nova. Logo, a classe Computador possui um
relacionamento com a classe Impressora, se assim formos traduzir para o mundo OO.
Esses relacionamentos costumam ser definidos atravs de suas cardinalidades.
Mas, o que isso?
Bem, quando relacionamos coisas no mundo real fazemos isso de forma natural e espontnea, teremos que ser mais
observadores daqui pra frente. Vejamos, quantas pessoas cabem em um automvel? Na maioria deles, a lotao
de no mximo 5 pessoas, incluindo seu condutor.Mas uma pessoa pode estar em quantos automveis ao mesmo
tempo? At onde as leis da fsica permitem, s em um, de cada vez!
Chamamos esse relacionamento de um-para-muitos, um (automvel) para muitos (pessoas). Em outras situaes,
vemos que um marido para uma, e somente uma, esposa, e a recproca verdadeira, temos ento um
relacionamento um-para-um. A outra combinao possvel seria muitos-para-muitos, o que verificamos no nosso
exemplo computador e impressora, pois do meu computador posso imprimir em vrias impressoras e cada uma

Adaptada por Wagner Jos dos Santos Jnior

25

26

dessas podem receber documentos dos outros computadores do escritrio.

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

Continuando nosso programa...


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

Camila possui um carro vermelho


Figura 2 Exemplo de relacionamento entre objetos

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

Listagem 2 Codificao do relacionamento entre as classes Carro e Pessoa

E os respectivos mtodos get e set:

Adaptada por Wagner Jos dos Santos Jnior

26

27

Listagem 3 Mtodos 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 Jnior

27

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

A troca de mensagens comumente denominada de chamada de mtodo

At agora,voc estudou a troca de mensagens entre objetos para definir ou recuperar algum atributo, unicamente.
Os sistemas OO precisam de mtodos mais complexos, que verifiquem a validade dos dados, realizem atualizaes
em outras entidades, pesquisem em banco de dados, escrevam em arquivos de log, atualizem objetos da interface
etc.
Vamos colocar um pouco da complexidade do mundo real no nosso programa?!Vamos l!
Faremos as seguintes alteraes:
1- Adicionar os mtodos ligar(), desligar(), acelerar(), frear() classe Carro.

Listagem 6 Novos mtodos para a classe Carro

Adaptada por Wagner Jos dos Santos Jnior

28

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

Listagem 7 Novo atributo e mtodos da classe Carro

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

Listagem 8 Mtodos que implementam o relacionamento entre Carro e Pessoa

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

Adaptada por Wagner Jos dos Santos Jnior

29

30

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

5 - Vamos ao Main! Nosso programa precisa:

1. criar uma Pessoa;


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

Adaptada por Wagner Jos dos Santos Jnior

30

31

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

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

Adaptada por Wagner Jos dos Santos Jnior

31

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 os
elementos fundamentais da orientao a objetos e os mecanismos bsicos da linguagem Java foram apresentados e
combinados para gerar uma aplicao simples, mas bastante significativa. Os sistemas so arranjos complexos de
objetos que se relacionam trocando mensagens entre si e cooperando para atingir objetivos planejados pelo seu
programador. necessrio um bom planejamento para manter a complexidade do sistema sob controle.

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

Adaptada por Wagner Jos dos Santos Jnior

32

33

Captulo 5 Encapsulamento

Apresentao
Nesta aula, vamos aprender sobre encapsulamento, voc sabe o que isso? Cpsula nos lembra qualquer forma
pequena que protege algo em seu interior, como um medicamento, fruto seco ou mesmo um compartimento para
astronautas cheio de instrumentos para uma misso espacial. Voc ver na aula de hoje uma importante
caracterstica da Programao Orientada a Objetos, o encapsulamento, que nos ajuda a desenvolver programas com
maior qualidade e flexibilidade para mudanas futuras.

Objetivos
Ao final desta aula, voc ser capaz de:

conhecer os conceitos ligados a encapsulamento;


entender, atravs de um contra-exemplo (exemplo errado), a importncia do encapsulamento;

entender com a correo do exemplo como se aplica essa caracterstica de encapsulamento,


to importante para a programao OO.

Encapsulamento

Encapsulamento a caracterstica da OO capaz de ocultar partes (dados e detalhes) de implementao


interna de classes do mundo exterior.

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

Adaptada por Wagner Jos dos Santos Jnior

33

34

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

Figura 1 Um objeto com encapsulamento

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

atender

solicitao

da Pessoa.

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

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

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

public: garante que o atributo ou mtodo da classe seja acessado ou executado a partir de qualquer
outra classe.
private: pode ser acessado, modificado ou executado apenas por mtodos da mesma classe, sendo

Adaptada por Wagner Jos dos Santos Jnior

34

35

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

Atributos de objetos (de instncia)


Um atributo de objeto (tambm conhecido por atributo de instncia) uma varivel declarada sem o
modificador static. Os atributos de instncia pertencem (so associados) aos objetos e no s classes. Quando um
atributo de objeto modificado, somente o objeto a que ele pertence enxerga a alterao (isso porque cada objeto
possui o seu). Um atributo de objeto (ou instncia) criado quando o objeto criado (comando new) e destrudo
quando o objeto a que pertence for destrudo.
Veja o exemplo:
class Empregado{
public int cargo;
public void contrataComoProgramador(void){
cargo = 2; // Dois o cdigo de programador
}
}
Para acessar o atributo de objeto em um mtodo pertencente mesma classe da qual o objeto foi criado (ou seja,
um mtodo tambm pertencente ao objeto), simplesmente especifique o nome do atributo (o nome da varivel).

Atributos de classes
Um atributo de classe um atributo declarado com o modificador static. Os atributos de classe so associados com
a classe e no com os objetos (ou instncias) criados a partir dela. Isso significa que quando um atributo de classe
modificado, todos os objetos criados a partir da mesma classe enxergam a alterao. Veja o exemplo:
class Empregado{
static int numeroDeEmpregados; // atributo de classe
public int cargo;

// atributo de instncia (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 varivel de classe
System.out.println(empregado1.cargo); // imprime o cargo do empregado1
System.out.println(empregado1.numeroDeEmpregados);
// vai mostrar 2
// porque a varivel numeroDeEmpregados da classe Empregado (inteira)
// e no somente do empregado1 ou do empregado2
System.out.println(empregado2.cargo); // imprime o cargo do empregado2
}

Adaptada por Wagner Jos dos Santos Jnior

35

36
}

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

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

Listagem 1 Classe agenda

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

Listagem 2 Adicionando comportamento

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

Adaptada por Wagner Jos dos Santos Jnior

36

37

Listagem 3 Validao das datas

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

Adaptada por Wagner Jos dos Santos Jnior

37

38

Listagem 4 - Testando a agenda

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

Figura 3 - Sada impressa no terminal

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

Listagem 6 - Modificando o mtodo main

O resultado dessa aplicao seria...

Adaptada por Wagner Jos dos Santos Jnior

38

39

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

Aplicando o encapsulamento ao exemplo


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

Adaptada por Wagner Jos dos Santos Jnior

39

40

Listagem 7 - Exemplo sem modificadores de acesso explcito

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

Listagem 8 - Acesso direto aos mtodos e atributos da classe

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

Adaptada por Wagner Jos dos Santos Jnior

40

41

Listagem 9 - Adicionando explicitamente os modificadores de acesso

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

Adaptada por Wagner Jos dos Santos Jnior

41

42

Listagem 10 - Encapsulamento em ao

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

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

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

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

public
private

Adaptada por Wagner Jos dos Santos Jnior

42

43

package

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

Aula 6 Tipos Primitivos em Java

Apresentao
Nesta aula, voc vai aprender um pouco sobre os tipos primitivos oferecidos pela linguagem Java. Esses tipos so
fundamentais para a construo de programas e sistemas de mdio e grande porte na linguagem. Alm de conhecer os
diferentes tipos oferecidos pela linguagem, apresentamos diversos exemplos de como us-los e manipul-los.
Finalmente, a aula ser finalizada com uma apresentao mais detalhada da classe String.

Objetivos
Ao final desta aula, voc ser capaz de:

saber quais so os tipos primitivos e respectivas caractersticas existentes na linguagem Java;


aprender como manipular alguns tipos numricos;
saber sobre a classe String;

saber onde podemos declarar as variveis que representam tipos primitivos ou referncias para
objetos dentro de uma classe Java.

Tipos Primitivos em Java


A linguagem Java oferece um total de 8 tipos primitivos para criao de nossos programas. Tais tipos so usados para
declararmos as variveis que auxiliam na construo dos algoritmos e classes dos programas que descrevemos. A
Tabela 1 apresenta um resumo dos tipos primitivos oferecidos pela linguagem.

Adaptada por Wagner Jos dos Santos Jnior

43

44

Tabela 1 Tipos primitivos de Java

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

Usando os tipos primitivos de Java


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

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

int idade = 18;


long tamanho;
float salarioFuncionario;
double poupanca = 100.0;
boolean casado;
boolean ferias = false;

7. char caracter1 = A;

Adaptada por Wagner Jos dos Santos Jnior

44

45
Listagem 1 Declarao e inicializao de variveis em Java

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

Tabela 2 Valores default de tipos primitivos de Java

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

Regras e convenes para declaraes de variveis


Na linguagem Java, existe um conjunto de regras que devem ser seguidas para nomear as variveis. O
primeiro smbolo de declarao de uma varivel pode ser uma letra (minscula a at z ou maiscula
A at Z), ou um dos seguintes caracteres _ (underscore) ou $ (cifro). Na maioria dos
programas, entretanto, comum declarar as variveis com o primeiro smbolo sendo uma letra
minscula, conforme foi ilustrado na declarao das variveis da Listagem 1.
Os demais smbolos de declarao de uma varivel podem ser, alm de qualquer letra (maiscula ou
minscula) e dos caracteres _ e $, tambm algum nmero. Observe, por exemplo, na Listagem 1, a
declarao das variveis caracter1esalarioFuncionario.
Seguindo as regras acima, o compilador da linguagem Java reclama sempre que declaramos uma
varivel comeando com nmeros, ou qualquer outro smbolo que no sejam _ e $. Assim, caso a

Adaptada por Wagner Jos dos Santos Jnior

45

46

gente declare as seguintes variveis, o compilador acusar erro:(i) 1minhaVariavel o nome dessa
varivel est incorreto, porque inicia com um nmero; e (ii) #nome varivel declarada
incorretamente tambm porque se inicia com um #.
Alm das regras acima, importante lembrar que existe um conjunto de palavras reservadas (do
ingls: keywords) na linguagem Java, como, por exemplo: main, new, while, if, for, int, long, float,
double. Tais palavras so reservadas na linguagem para um determinado propsito, e dessa forma o
compilador Java no permite que o desenvolvedor declare alguma varivel de forma idntica a alguma
das palavras chaves. Veja a listagem de todas as palavras reservadas no quadro 1 a seguir.

Trabalhando com os valores das variveis


Ao longo da criao dos nossos programas, comum, alm de declararmos e inicializarmos as variveis, trabalharmos
com ela na lgica do nosso programa. No caso de variveis de tipos primitivos numricos inteiros ou reais, podemos
usar os operadores matemticos tradicionais como soma (+), subtrao (-), multiplicao (*) e diviso (/).
A Listagem 2 apresenta diversos exemplos de uso dos operadores. Inicialmente, so declaradas duas variveis
(salario1, salario2) do tipo float. Em seguida, uma nova varivel (somaSalario) criada e seu valor inicializado com a
soma das variveis salario1 e salario2.
A varivel poupanca1 calculada como o dobro do salario1, ou seja, o valor do salario1 multiplicado (operador *)
pelo valor 2. A varivel do tipo double gastoMes calculada como a subtrao entre o valor do salario1 e o valor de
590.68. Finalmente, a varivel idade calculada como a subtrao entre dois valores inteiros: 2010(que representa o
ano corrente) e 1980(o ano do seu nascimento).

1.
2.
3.
4.

float salario1 = 700.0, salario2 = 855.0;


float somaSalario = salario1 + salario2;
double poupanca1 = salario1 * 2;
double gastoMes = salario1 590.68;

5. int idade = 2010 1980;


Listagem 2 - Manipulao de variveis de tipos numricos

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

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

Uma string em Java nada mais nada menos do que um conjunto de caracteres separados por aspas e
que podem
ser atribudos
diretamente
para variveis do tipoString.
Adaptada
por Wagner
Jos dos Santos
Jnior
46

47

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

1. String nome1 = new String(Joo Santos);


2. String nome2 = Maria das Graas;
3. String frase = nome + o pai de + nome2;
Listagem 3 Declarao e inicializao de variveis em Java

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

1. public class ProgramaPrincipal {


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

Atividade 3
1. Crie, compile e execute uma classe de nomeTesteStringscom as variveis do tipo String
declaradas na Listagem 4.
2. Em seguida, estenda o programa criando novas variveis que criam novas frases usando
variveis String, por exemplo.
3. Crie variveis com o seu nome e algum da sua famlia.
4. Faa concatenaes das Strings usando o operador +.

Declarao de variveis em classes


Em um programa Java, as variveis que declaramos tanto de tipo primitivos quanto de tipos de classes/objetos (como,
por exemplo, a classe String) podem ser declaradas e usadas tanto no mtodo main() quanto diretamente como
atributos de classes ou variveis locais de mtodos.
Na Listagem 5, por exemplo, vemos inicialmente a declarao da varivel idade do tipo inte salario do tipo float na
forma de atributos da classe Pessoa. Observe que tais atributos podem ser usados nos mtodos set e get da prpria
classe Pessoa. Essas variveis da classe Pessoa so criadas para cada objeto que instanciado em qualquer trecho de
um programa Java. Ou seja, se criarmos dois objetos da classe Pessoa, cada objeto ir manter internamente em

Adaptada por Wagner Jos dos Santos Jnior

47

48

memria seu prprio nome, idade e salario.


Essa situao ilustrada na Listagem 6. Nesse exemplo, vemos a declarao de duas variveis objetos da classe
Pessoa (pessoa1, pessoa2), alm de uma varivel inteira (anoAtual) do tipo int. Observe que, logo a seguir, os nomes
dos objetos da classe Pessoa, assim como o anoAtual, so tambm impressos.

1. public class Pessoa {


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

Listagem 5 Declarao de variveis em uma Classe

1. public class ProgramaPrincipal {


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

Listagem 6 Declarao de variveis no mtodomain

Aula 7 Comandos da Linguagem


Apresentao
Nesta aula, iremos aprender um pouco mais sobre os comandos de fluxo de controle (if, switch) e repetio (while,
for), que podemos utilizar na linguagem Java. Tais comandos so tambm fundamentais para a construo de qualquer

Adaptada por Wagner Jos dos Santos Jnior

48

49

sistema e elaborao de nossos algoritmos.

Objetivos
Ao final desta aula, voc ser capaz de:

saber quais so os comandos de fluxo de controle e repetio existentes na linguagem Java;

usar nas situaes adequadas cada um desses comandos.

Introduo

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

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

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

Listagem 1 Comando IF

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

Adaptada por Wagner Jos dos Santos Jnior

49

50

Listagem 2 Exemplo do comando IF

A Listagem 2 mostra um exemplo concreto de tal comando, apresentando a implementao do mtodo


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

Listagem 3 Comando IF-ELSE


E para o nosso exemplo teramos:

Adaptada por Wagner Jos dos Santos Jnior

50

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 condio de teste o
IF for falsa. Neste caso, mostra que o objeto Pessoa em questo maior de idade.

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

Listagem 5 Exemplo do comando IF Aninhado

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

51

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 mtodos usado pela classe Automvel.
Observe no exemplo que dependendo do valor que a varivel cambio possui podemos imprimir a marcha que foi passada no
automvel. Ou seja, caso a varivel cambio possua o valor 1, ser exibida a mensagem Passou a 1 marcha. Vale observar
o funcionamento do comando break, pois ele quem define que uma vez encontrado um dadocase (caso), outro caso (case)
no ser procurado, ocasionando assim a sada do comando switch.

Adaptada por Wagner Jos dos Santos Jnior

52

53

Listagem 7 Exemplo com o comando SWITCH

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

Adaptada por Wagner Jos dos Santos Jnior

53

54

Listagem 8 Comando SWITCH com case sem break

Atividade 2
1. Crie um mtodo publicvoidmudarDirecao(char direo)para a classe Automvelque defina a
direo que o automvel deve tomar de acordo com os comandos recebidos. As
possibilidades de comandos so: F = Frente, E = Esquerda, D = Direita.
Observao
Veja as dicas seguintes:

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

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

54

55

Listagem 9 Comando WHILE

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

Listagem 10 Exemplo comando WHILE

Atividade 3
1. Crie um mtodo dentro de uma classe chamada OperacoesNumericas, usando o comando
WHILE que possua um contador que v de 100 (cem) at 0 (zero) e imprime apenas os
nmeros pares.
Comando DO-WHILE
O comando DO-WHILE tem a mesma finalidade do comando WHILE com apenas uma diferena. A diferena que
com o comando WHILE a condio de teste efetuada antes de executar uma instruo ou bloco de instrues, j
com o comando DO-WHILE a condio de teste s ser efetuada depois de executar instruo ou bloco de
instrues. A Listagem 11 apresenta a forma geral do comando.

Listagem 11 Estrutura geral do comando DO-WHILE

Adaptada por Wagner Jos dos Santos Jnior

55

56

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

Listagem 12 Exemplo com o WHILE

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

Adaptada por Wagner Jos dos Santos Jnior

56

57

Listagem 13 Exemplo com o DO-WHILE

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

Listagem 14 Comando FOR

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

Adaptada por Wagner Jos dos Santos Jnior

57

58

Listagem 15 Exemplo do comando FOR

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

Listagem 15 Comando FOR aninhado

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

Comando FOR para vetores e colees


O comando FOR possui outra estrutura, quando se trabalha com vetores
ingls: Arrays eCollections). Vejamos em um trecho de cdigo um exemplo dessa estrutura.

Adaptada por Wagner Jos dos Santos Jnior

ou

colees

(do

58

59

Listagem 16 Comando FOR para vetores e colees

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

59

60

Aula 8 Composio ou Agregao


Apresentao
Compor, juntar, reunir, formar, constituir... Essas aes nos levama uma ideia muito interessante na programao
orientada a objetos, chamada Composio. Nesta aula, voc vai ver esse interessante conceito da POO, que nos d a
grande possibilidade da reutilizao de cdigo. Alm disso, a ideia de composio tambm aproxima a ideia da
Orientao a Objetos ao senso comum de sistematizao das coisas, em que um objeto mais complexo pode ser
composto de partes mais simples. Boa aula!!

Objetivos
Ao final desta aula, voc ser capaz de:

saber o que significa Composio ou Agregao;


criar objetos na linguagem Java que so compostos por outros objetos, fazendo uso prtico
do conceito de Composio;

entender como se comporta os modificadores de acesso de Java na Composio.

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

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

Adaptada por Wagner Jos dos Santos Jnior

60

61

Figura 1 - Composio do objeto Automvel

Legal no ?!! Isso mesmo que voc entendeu, voc pode criar um objeto a partir de vrios outros objetos. E isso
muito natural.
Veja o computador que voc est usando, ele um objeto composto por outros objetos: teclado, monitor, placa me,
memria, mouse etc.

E tem mais, quando uma classe composta de outras classes ela pode tanto usar os objetos que so gerados pelas
classes que a compem, como pode tambm usufruir dos atributos e mtodos dessas classes.

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

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

Adaptada por Wagner Jos dos Santos Jnior

61

62

Figura 2 - Composio da classe Automvel: motor e direo

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

Listagem 1 - Classes Motor, Direo e Automvel

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

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

Classe Composta

Classes Componentes (Partes) da Classe Composta

Adaptada por Wagner Jos dos Santos Jnior

62

63

Computador

Teclado, Monitor, Memria, Placa Me...

Livro

Ttulo, Autor, Captulo, Editora ...

Monstro

Cabea,Olho,Boca,Brao,Perna...

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

Listagem 2 -Classe Motor

Listagem 3 - Classe Direo

Adaptada por Wagner Jos dos Santos Jnior

63

64

Listagem 4 - Classe Automvel

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

A Composio e o mtodo construtor


Os mtodos construtores das classes componentes (Motor,Direo) que fazem parte da classe composta (Automvel),
podem ser chamados de trs maneiras diferentes, so elas:

CASO 1: chamadas nos construtores da classe que composta;


CASO 2: chamadas em qualquer mtodo da classe que composta;
CASO 3: chamadas fora da classe que composta.

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

Adaptada por Wagner Jos dos Santos Jnior

64

65

Listagem 5 - Classe Motor com dois construtores

Listagem 6 - Classe Automvel composta pela classe Motor

CASO 1: chamadas nos construtores da classe que composta

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

Adaptada por Wagner Jos dos Santos Jnior

65

66

Listagem 7 - Classe Automvel com dois mtodos construtores

Nesse exemplo, os construtores da classe motor so chamados dentro dos construtores da classe Automvel.

CASO 2: chamadas em qualquer mtodo da classe que composta

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

Listagem 8 - Construtor chamado a partir de um mtodo

CASO 3: chamadas fora da classe que composta

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

Adaptada por Wagner Jos dos Santos Jnior

66

67

Listagem 9 -Criao da classe Motor fora da classe Automvel

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

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

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

Para o caso 1: temos duas possibilidades, na linha 1, ocultado do usurio a existncia de um objeto motor que
compe a classe Automvel. J na linha 2, o usurio define a potncia a ser adotada pelo motor do automvel.
Para o caso 2, podemos observar na linha 3 que quando criamos o objeto automvel o objeto motor ainda no existe.
Ele permanece nulo (null) dentro do objeto motor at que o automvel seja ligado pela primeira vez. Para isso, pode-

Adaptada por Wagner Jos dos Santos Jnior

67

68

se usar um dos dois mtodos ligarPrimeiraVez()(linhas 4 e 5), sem ou com parmetro, respectivamente.
Finalmente, para o caso 3, apresentado a partir da linha 6, tem-se a mesma observao da linha 3. Nesse caso, o
usurio cria normalmente o objeto motor, escolhendo um dos dois construtores (linhas 7 e 8) e, em seguida, define
que esse objeto componha o objeto automvel (linha 9.)

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

Composio e os modificadores de acesso


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

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

No exemplo acima, apesar do atributo cor da classe Direo ser public, esse atributo no diretamente acessvel a
partir do mtodo main(), porque o objeto Direo est encapsulado ( um atributo privado) dentro da
classe Automvel.

Quando temos atributos privados nas classes e reusamos essas classes, declarando suas instncias como
pblicas, os atributos no passam a ser pblicos, veja a Listagem 12.

Adaptada por Wagner Jos dos Santos Jnior

68

69

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

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

Anote a Dica

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

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

Adaptada por Wagner Jos dos Santos Jnior

69

70

Aula 9 - Arrays, colees e listas


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

Objetivos
Ao final desta aula, voc ser capaz de:

compreender como armazenar objetos em estruturas de dados conhecidas como arrays;

conhecer e aprender como usar de forma introdutria, um conjunto de classes da biblioteca


padro de Java relacionadas manipulao de colees de objetos.

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

Arrays
Considere a seguir um exemplo que motiva o uso de arrays. Constantemente, precisamos tomar nota de um valor que
muda ao longo do tempo, e precisamos medir sua mdia, valores mximo e mnimo. Por exemplo, suponha que voc
um treinador de um atleta velocista de 100 metros raso, como parte do treinamento,voc ir fazer 5 medies de tiros
de 100 metros. Para cada tentativa do atleta, voc vai medir o tempo e colocar o resultado em sua planilha de

Adaptada por Wagner Jos dos Santos Jnior

70

71
rendimento.
Precisamos armazenar 5 valores numricos reais para representar a marca de tempo obtida. Porm, no podemos criar
5 variveis, e sim, apenas uma para comportar esses valores. Veja tal cdigo na Listagem 1.

Listagem 1 - Declarao de um array

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

Listagem 2 - Impresso dos valores do Array

Para exibirmos os valores, o programa da Listagem 1pode ser incrementado pelas seguintes linhas de cdigo (Listagem
2). No indicamos a primeira tomada de tempo como sendo o tempo 0 (zero), pois naturalmente costumamos realizar

Adaptada por Wagner Jos dos Santos Jnior

71

72
contagens a partir do nmero 1 (um).
H outra forma de definir os valores de um array, no momento de sua declarao podemos indicar seus valores, sendo
que j precisamos conhec-los de antemo. Veja a Listagem 3. Observe que no precisarmos indicar o comprimento do
vetor, pois ele sabe de antemo pela quantidade de elementos definidos na sua inicializao.

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

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

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

72

73

Listagem 5 - Exemplo de Array bidimensional

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

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


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

Figura 1 - Tabuleiro

Arrays como objetos


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

Adaptada por Wagner Jos dos Santos Jnior

73

74

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

Colees Java
A linguagem Java possui um conjunto de classes que servem para armazenar na memria vrios objetos. Tais classes no
possuem o inconveniente de termos que saber de antemo a quantidade exata de elementos que iremos armazenar, como no
caso de arrays. E em alguns casos, nem mesmo o tipo.
H 3 (trs) tipos principais de objetos Java definidos para esse fim, veja-os a seguir.
1. Set representa a mesma ideia de conjuntos da matemtica, ou seja, um grupo de objetos sem ordem definida, porm,
nicos. Como mostra a Figura 2.

Figura 2 - Conjunto de objetos

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

Adaptada por Wagner Jos dos Santos Jnior

74

75

Listagem 7 - Exemplo de um Set

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

Figura 3 - Lista de objetos

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

Listagem 8 - Exemplo de ArrayList

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

Adaptada por Wagner Jos dos Santos Jnior

75

76

Figura 4 - Dois conjuntos de objetos

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

Listagem 9 - HashMap na prtica

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

Adaptada por Wagner Jos dos Santos Jnior

76

77

Figura 5 -Collection e Map

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

Lista bsica de Mtodos da Interface Collection

boolean add(Object)

Adiciona um elemento na coleo. Como algumas colees no


suportam elementos duplicados (exemplo: Sets), esses mtodos
retornam verdadeiro (true) ou falso (false) para indicar se a
adio foi bem sucedida.

boolean remove(Object)

Remove determinado elemento da coleo. Se ele no fizer parte


da coleo, retorna falso (false).

intsize()

Retorna a quantidade de elementos presentes na coleo.

boolean contains(Object)

Procura por um determinado objeto na coleo.


Vale salientar: a comparao feita pelo mtodo equals().

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

Adaptada por Wagner Jos dos Santos Jnior

77

78
de objetos com o mesmo hashCode.

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

Aula 10 - Herana
Apresentao
Hoje, voc vai aprender sobre mais um pilar de sustentao da Programao Orientada a Objetos: a Herana. Ela
considerada um dos conceitos mais importantes na POO. A herana trouxe para a programao um novo olhar sobre a
maneira de se programar, at ento no atendido pela Programao Estruturada.

Objetivos
Ao final da aula, o aluno deve:

entender o que Herana;


conhecer quais os tipos de Herana existentes em POO;
entender o funcionamento da Herana durante a execuo do programa;

programar em Java usando a Herana.

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

Adaptada por Wagner Jos dos Santos Jnior

78

79

Figura 1 - Orientao a Objetos

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

Figura 2 -Exemplo de Herana entre classes

Considere como classes as seguintes abstraes:


Transporte, Aqutico, Terrestre, Areo, Barco,Automvel e Avio. Considere capacidade como um atributo da
classe Transporte, que indica a quantidade de pessoas que o transporte em questo pode transportar. E nmero de
rodas como um atributo da classe Terrestre. E cor, nmero de portas e placa como atributos da classe Automvel.

Adaptada por Wagner Jos dos Santos Jnior

79

80

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

Hierarquia de Classe ou de Herana: o mapeamento do tipo rvore de relacionamentos que se formam


entre as classes como resultado da herana. Exemplo: a Figura 2 representa uma hierarquia de herana
ou hierarquia de classe.
Usando a mesma lgica, responda: Quantos e quais so os atributos da classe Terrestre? E da classe Automvel?
Respondendo: a classe Terrestre possui dois atributos: capacidade (que herdado de Transporte) enmero de
rodas. J a classe Automvel possui cinco atributos: capacidade (herdado de Transporte), nmero de
rodas (herdado de Terrestre), cor, nmero de portas e placa.
Observe na Figura 2 que, quanto mais alta na hierarquia, est a classe, mais ela tende a ser abstrata em comparao
com as suas subsequentes. Ou seja, quanto mais alto na hierarquia, menos definida (abstrata) a classe, e assim ela
define menos atributos e mtodos. Isso tambm garante que a classe tenha mais chance de ser reusada por outras
classes que herdem da mesma. Entendeu? No, ento vamos ao exemplo da figura. Suponha que a
classe Transporte, alm do atributo capacidade, possusse tambm o atributo nmero de rodas. Ou seja, ela passa
a ser uma classe mais concreta, menos abstrata. Mas nesse caso, consequentemente, no seria interessante nem
faria sentido para as classes Aqutico e Areo herdar os atributos de Transporte (ou herdar de Transporte), pois o
atributo nmero de rodas no desejado por tais classes.

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

Termos usados para Herana


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

Classes que Fornecem a Herana

Classes que Herdam de Outras

Superclasse

Subclasse

Me

Filha

Tipo

Subtipo
Quadro 1 - Termos usados na Herana

Adaptada por Wagner Jos dos Santos Jnior

80

81

Nota: a classe filha no pode remover os atributos e mtodos da classe me.


Abaixo, so apresentados outros termos que so tambm comumente usados.

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

Folha: uma classe sem filhas.

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

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

Adaptada por Wagner Jos dos Santos Jnior

81

82

Figura 3 -Generalizao e Especializao

Herana mltipla e simples


Herana Mltipla: a capacidade de uma classe possuir mais de uma superclasse e herdar as variveis e mtodos
combinados de todas as superclasses.
Herana Simples: Cada classe pode ter apenas uma superclasse, embora uma superclasse possa ter vrias subclasses.
Na linguagem Java, a Herana simples e na codificao usa-se a palavra reservada extends para declarar que uma classe
herdeira de outra. Para simular a herana mltipla em Java, usa-se Interfaces.

Funcionamento da Herana
Voc viu os conceitos sobre Herana, mas importante tambm que possamos entender o que acontece com uma
classe que utiliza a Herana durante sua execuo. Para melhor entendermos o funcionamento da Herana durante a
execuo do programa, vejamos a Figura 4.

Figura 4 -Herana em ao

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

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

Adaptada por Wagner Jos dos Santos Jnior

82

83
que Automvel herda de Terrestre.

Listagem 1 - Exemplo de Herana em Java

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

Dica

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

Anote a Dica

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

Autoavaliao
Adaptada por Wagner Jos dos Santos Jnior

83

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

Adaptada por Wagner Jos dos Santos Jnior

84

85

Aula 11 - Herana II
Apresentao
Na aula passada, foram dados os primeiros passos sobre o assunto Herana, um dos pilares da POO. Considerando a
importncia desse tema, continuaremos a abord-lo na aula de hoje, focalizando, sobretudo, a herana de
comportamento (mtodo). Sero tambm apresentados outros exemplos mais sofisticados de implementao de
herana na linguagem Java.

Objetivos
Ao final desta aula, voc deve ser capaz de:

relacionar a herana e o modificador de acesso protected;


entender o uso da palavra-chave super no contexto de herana entre classes;

saber como funciona a herana para os mtodos, durante a execuo do programa.

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

Adaptada por Wagner Jos dos Santos Jnior

85

86

Listagem 1 - Herana em Java com protected e private


Figura 1 - Esquema de Herana

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

Listagem 2 -Acesso a atributos protected

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

Listagem 3 -Acesso a atributos protected

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

Adaptada por Wagner Jos dos Santos Jnior

86

87
3. O que acontece?
4. A compilao e execuo funcionaram corretamente? Se sim, explique o que voc acha que
aconteceu.

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

Listagem 4 - Herana em Java com uso do operador super

A Listagem 4 ilustra um exemplo de herana em Java, que faz uso da palavra-chave super. Vamos ento entender o

Adaptada por Wagner Jos dos Santos Jnior

87

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

Anote a Dica

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

Anote a Dica

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

88

89

Listagem 5 - Classe Transporte

Listagem 6 - Classe Terrestre

Adaptada por Wagner Jos dos Santos Jnior

89

90

Listagem 7 - Classe Automvel

As Listagens 5, 6 e 7 apresentam o cdigo das classes Veculo, Terrestre e Automvel, incluindo a implementao dos
mtodos get e set para cada atributo das classes.
Cada um dos mtodos declarados na classe Veculo so herdados pelas classes Terrestre e Automvel, assim como os
mtodos declarados pela classe Terrestre so herdados pela classe Automvel, exatamente como ocorre com os
atributos.
A Figura 8 apresenta um de mtodo main() que cria um objeto da classe Automvel, em seguida, chama dois mtodos
setCapacidade() e setNumRodas(). Observe pelas Figuras 5 , 6 e 7 que tais mtodos no pertencem classe
Automvel, mas so na verdade herdados de suas ancestrais. Dessa forma, percebe-se claramente que uma vez
declarado um mtodo (pblico ou protected) em uma das classes ancestrais, aquele mtodo visvel em objetos das
classes filhas.

Adaptada por Wagner Jos dos Santos Jnior

90

91

Listagem 8 - Classe Principal

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

Listagem 9 - Classe Terrestre com mtodo calculaNumPneusReserva()

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

Listagem 10 -Mtodo main modificado

Adaptada por Wagner Jos dos Santos Jnior

91

92

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

Funcionamento da Herana para os mtodos


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

Figura 2 - Herana e os mtodos

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

public
private
protected

5 - Crie as classes utilizando o princpio da Herana, obedecendo hierarquia da figura abaixo: (Obs: Para

Adaptada por Wagner Jos dos Santos Jnior

92

93

facilitar, substitua na figura o tipo Calendar por String)

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

Aula 12 - Polimorfismo
Apresentao
Hoje, iremos iniciar o aprendizado do ltimo princpio que serve de base para a Programao Orientada a Objeto o
Polimorfismo. Esse princpio tambm aposta na ideia da reutilizao para facilitar o dia a dia da programao. Ele
tambm bastante importante tanto para o entendimento de programas OO em Java e outras linguagens, como tambm
um mecanismo bastante sofisticado para permitir a reutilizao e flexibilidade durante o desenvolvimento de tais

Adaptada por Wagner Jos dos Santos Jnior

93

94
programas.

Objetivos
Ao final desta aula, voc deve ser capaz de:

entender o princpio do Polimorfismo;


saber quais so os tipos existentes de Polimorfismo;
conhecer Polimorfismo de Sobrecarga, de Sobreposio e de Incluso;

saber o que Converso de Tipos.

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

Figura 1 - Pilares da POO

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

Adaptada por Wagner Jos dos Santos Jnior

94

95

Figura 2 -Exemplo de polimorfismo

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

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

Tipos de polimorfismo
O Polimorfismo pode ser classificado de trs maneiras:

Polimorfismo de Sobrecarga
Polimorfismo de Sobreposio
Polimorfismo de Incluso

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

Adaptada por Wagner Jos dos Santos Jnior

95

96

Listagem 1 - Polimorfismo de Sobrecarga com tipos de parmetros diferentes

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

96

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

Listagem 3 - Polimorfismo de sobrecarga de construtores

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

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

Veja o quadro abaixo sobre converso de tipos primitivos.

Converso de Tipos Primitivos


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

Adaptada por Wagner Jos dos Santos Jnior

97

98
Exemplos de Converses Automticas

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

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

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

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

Adaptada por Wagner Jos dos Santos Jnior

98

99

Listagem 5 - Converso automtica de tipos primitivos

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

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

Figura 3 - Esquema da classe brinquedo

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

Adaptada por Wagner Jos dos Santos Jnior

99

100

Figura 4 -Sobreposio de mtodos em uma hierarquia de Herana

O que aconteceria se fosse solicitado ao Objeto1 da classeC a execuo do metodoX() ?


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

O polimorfismo de sobreposio em Java


Considere
que
a
classe Brinquedo (usada
no
exerccio
classes Carro, Avio e Barco, conforme ilustra a Figura 5.

Adaptada por Wagner Jos dos Santos Jnior

anterior)

possui

como

descendentes

as

100

101

Figura 5 - Hierarquia de Herana da classe Brinquedo

Observe que as classes filhas sobrepem o mtodo mover() da classe Brinquedo. Vejamos ento como ficam essas
classes codificadas em Java na Listagem 6.

Adaptada por Wagner Jos dos Santos Jnior

101

102

Listagem 6 Implementao em Java da Hierarquia da Classe Brinquedo

Considerando o mtodo mover() de cada classe filha, como poderamos chamar o mtodo mover() do brinquedo
(classe) correto? Ou seja, como o ControleRemoto saber que mtodo mover ele deve chamar se ele tem disponvel
trs tipos de mover diferentes (um para cada brinquedo)? Vamos ver inicialmente como fica a implementao do
Controle Remoto na Listagem 7.

Adaptada por Wagner Jos dos Santos Jnior

102

103

Listagem 7 -Classe ControleRemoto

Voc lembra que na primeira vez que apresentamos esse exemplo dissemos que a nica restrio para um controle
remoto to verstil seria que quando criado o controle remoto, ele receberia o tipo de brinquedo que iria acionar em
um dado instante?
Pois , a que est o segredo para o controle remoto saber qual deve ser o mtodo mover() que ele deve chamar
(CORRER, NAVEGAR ou VOAR). O mtodo construtor da classe ControleRemotoexige que o controle para ser
inicializado
receba
um
parmetro
do
tipoBrinquedo.
E
isso
acontece
quando
o
atributo brinquedo do ControleRemoto recebe b(um objeto do tipo Brinquedo).
Ento, quando o mtodo mover() da classe ControleRemoto for acionado (isso significa dizer que o boto mover foi
apertado), esse faz com que seu atributo brinquedo chame o mtodomover()correto, dependendo do tipo
de 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 ser
controlado automaticamente.

Listagem 8 - Classe Principal com o mtodo main

Observe que criamos um brinquedo do tipo Carro, e quando criamos o ControleRemoto, enviamos esse objeto carro
para o objeto controleRemoto atravs da chamada ao seu construtor. Assim, quando acionado o comando
controleRemoto.mover(), ser chamado o mtodo mover() do carro.
O resultado ser a impresso da palavra:
CORRER

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

Adaptada por Wagner Jos dos Santos Jnior

103

104
abaixo em Java, aplicando o polimorfismo de sobreposio para o mtodo desenha().
2. Em seguida, crie uma classe Principal com um mtodo main que cria um objeto de cada uma
das classes e chama seus respectivos mtodos desenha().

Figura 6 - Hierarquia da classe FiguraGeomtrica

Polimorfismo de incluso
Polimorfismo de incluso usa a capacidade de substituio da Herana(2), de uma classe me por qualquer classe
descendente, para permitir um comportamento polimrfico nos mtodos que usam a classe me.
No exemplo visto na seo anterior,veja a classe Principal na Listagem 8, onde criamos um objeto do tipo Carro e
outro do tipo ControleRemoto, ns utilizamos o comportamento polimrfico do polimorfismo de incluso. Fizemos isso
quando substitumos a classe Brinquedo (me) pela classeCarro (filha) dentro da classe ControleRemoto.
Assim, o atributo interno do tipo Brinquedo da classe ControleRemoto pode receber qualquer objeto que seja de uma
classe filha de Brinquedo. Para entender melhor o que aconteceu, veja a Figura 7.
(2) Para voc entender melhor, veja aula 10 (Tipos de Herana: substituio 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 Jnior

104

105
tipo Brinquedo. Mas, como as classes Carro, Avio e Barco so descendentes deBrinquedo, elas podem substituir a
classe Brinquedo em qualquer mtodo que a utilize.
Nesse caso, isso foi feito explicitamente, atravs da passagem de um objeto da classe Carro para o mtodo 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 Avio 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 incluso.

Autoavaliao
1 - Sem consultar o material, responda: o que voc entendeu por polimorfismo?
2 - Quais so os tipos de polimorfismo?
3 - Qual a finalidade de se usar o polimorfismo de sobrecarga? D um exemplo.
4 - O que converso de tipos?
5 - Como funciona o polimorfismo de sobreposio? D exemplos.
6 - Explique como funciona o polimorfismo de incluso? D um exemplo.
7 - Implemente o diagrama de classes representado pela Figura 8
classeCadastroPessoas considere o atributo pessoas como um array do tipo Pessoa.

abaixo.

Para

O mtodo cadastrarPessoa(): deve acrescentar ao arraypessoas, um objeto descendente da classe


Pessoa.
O mtodo mostraCadastro(): deve percorrer todo o array de pessoas e mostrar todos os dados do
descendente de Pessoa.
Aplique os tipos de polimorfismo em cada uma das situaes solicitadas:
a)
Polimorfismo
de
Sobrecarga: crie
mais
classe: Pessoa, Cliente, Funcionario e Gerente.

de

um

mtodo

construtor

para

b) Polimorfismo de Sobreposio: faa com que o mtodo mostraCadastro() utilize


mostraDados() correto, dependendo se a Pessoa umCliente, Funcionario ou Gerente.

cada

mtodo

c) Polimorfismo de Incluso: quando for adicionar ao arraypessoas uma nova pessoa que pode ser de um
dos tipos descendentes de Pessoa.

Adaptada por Wagner Jos dos Santos Jnior

105

106

Figura 8 - Diagrama de classe

Aula 13 - Atributos e mtodos estticos, classes abstratas e interfaces


Apresentao
At agora, para efeitos de projeto de sistemas, voc viu classes (concretas) e objetos, unicamente. Porm, importante
que voc saiba que h recursos mais sofisticados na linguagem Java que permitem que a gente projete de forma mais
genrica e aproximada o mundo real diante de situaes que ainda no foram apresentadas nos exemplos anteriores,
mas que faro sentido medida que formos observando as sutilezas que envolvem a arte de desenvolver solues em
Tecnologias de Informao (TI)!
Para tanto, teremos a apresentao de atributos e mtodos comuns a todos objetos de uma classe, os chamados
atributos e mtodos estticos. Veremos tambm classes da qual no podemos instanciar objetos diretamente, as
chamadas classes abstratas.
Finalmente, conheceremos o conceito de interface em Java, que representa um contrato assumido por classes e que
as obrigam a implementar um determinado conjunto de mtodos de uma determinada forma. Lembre que voc vai
realizar prticas atravs dos exerccios apresentados.

Objetivos
Ao final desta aula, voc ser capaz de:

compreender os conceitos que motivam a utilizao das tcnicas de:atributos e mtodos


estticos, classes abstratas einterfaces;

saber a aplicao e contextualizao desses conceitos.

Adaptada por Wagner Jos dos Santos Jnior

106

107

Atributos estticos
Primeiramente, vejamos essa denominao: atributo esttico.
Nas aulas anteriores, abordamos de forma exaustiva o conceito de atributos, os quais so variveis declarados nas
classes, e que possuem tipo e nome. Voc viu tambm que os valores dos atributos so definidos pelos prprios objetos
instanciados de uma dada classe. Essa atribuio pode ocorrer de forma direta (caso o atributo seja pblico), ou atravs
de mtodos setters que permitem acess-los (que o caso dos atributos que so privados), ou mesmo atravs dos
prprios construtores da classe.
Agora, vejamos a denominao esttico. O que voc compreende por esse termo? Algo imvel, imutvel, paralisado?
Pois bem, a que mora o perigo, pois o termo escolhido para tal varivel no foi to adequado, e d tipicamente a
ideia de uma constante.

Atributo Esttico Atributo Constante

A ideia por trs do conceito de atributos e mtodos estticos a de que objetos de uma mesma classe podem e, em
algumas situaes devem, compartilhar valores em comum, caso contrrio, teramos que criar atributos que precisariam
ser atualizados todos ao mesmo tempo, em cada objeto criado.
Vejamos o seguinte exemplo. Um sistema que controle relgios de ponto de vrias filiais com o mesmo fuso horrio,
nessa situao, quando tivermos que fazer um ajuste ou atualizar a hora, minutos e segundos teremos que faz-lo em
todos os relgios. Porm, se esse atributo no pertencer aos objetos, e sim prpria classe, todos sabero a hora
certa, pois se baseiam no mesmo valor. Observe na Listagem 1, o cdigo da classe RelogioPonto.

Adaptada por Wagner Jos dos Santos Jnior

107

108

Listagem 1 - Classe RelogioPonto

Veja o uso da palavra reservada static na declarao dos atributos hora, minuto e segundo. Esse faz com que o
compilador entenda que no ser necessrio reservar um espao de memria em cada objeto da classeRelogioPonto
para armazenar o valor da hora, minuto e segundo, pois esses valores sero compartilhados por todos os objetos dessa
classe. Logo ser necessrio apenas um nico espao para armazenar esse valor, juntamente com os cdigos dos
mtodos da classe.
Vamos criar uma aplicao simples para exemplificar o uso dos atributos esttico hora, minuto e segundo. A Listagem
2apresenta o cdigo de tal aplicao.

Adaptada por Wagner Jos dos Santos Jnior

108

109

Listagem 2 - Aplicao usando a classe RelogioPonto

Observe que criamos 3 (trs) objetos RelogioPonto e na sequncia pegamos um desses (filialAlecrim) para atribuir os
valores de hora, minuto e segundo. Logo, em seguida, imprimimos os valores dos trs objetos e teremos o seguinte
resultado:

Isso ocorre, pois, quando atribumos valores a variveis estticas atravs de um objeto, estamos atribuindo o valor para
todos os objetos da mesma classe. Por isso, alguns chamam os atributos estticos de atributos de classe. Para no
sermos redundantes, faremos uma substituio da instruo.
De...

Para...

Adaptada por Wagner Jos dos Santos Jnior

109

110

Pois, quando estamos tratando de atributos de classe (atributos estticos) em Java, comum e uma boa prtica
usarmos o seu valor utilizando o nome da classe seguido do operador ponto . e o atributo que desejarmos.
Observe que, com essa mudana, mostramos que no necessrio criar um objeto da classe RelogioPonto para que se
possa acessar seus atributos estticos. Quando estticos, eles esto disponveis antes mesmo de se criar o objeto.
Com isso, temos como anlise geral o seguinte quadro:

Atributo Esttico = Atributo Comum ou Compartilhado

Mtodos estticos
A mesma ideia dos atributos estticos pode ser ampliada e aplicada para os mtodos, pois, se quisermos alterar o modo
de acesso dos atributos hora, minuto e segundo, tornando-os privados (private), por exemplo, teremos que criar
mtodos que sejam capazes de alter-los.
No uma boa prtica modificar valores de atributos estticos atravs de referncias para seus objetos. Imagine 10
objetos tentando alterar os valores compartilhados, a probabilidade do sistema se tornar catico (ou dar algum erro)
muito grande. Os mtodos estticos surgiram basicamente para operarem sobre os atributos estticos, ou que no
realizam operao alguma sobre os atributos dos objetos. Ou seja, no do contexto do objeto, mas sim, de sua classe.
Alterando o exemplo apresentado anteriormente (Listagem 1) para trabalhar com mtodos estticos, chegaremos ao
exemplo apresentado na Listagem 3. Observe o uso da palavra reservada static na declarao dos mtodos que operam
sobre os atributos estticos.

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 Jnior

110

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 mtodos estticos

Agora, mais uma alterao deve ser feita na Listagem 2 , de...

Para...

Com isso, temos a utilizao dos mtodos estticos diretamente da classe RelogioPonto. Assim como no caso de
atributos, tambm no necessrio criar o objeto da classe para que se possa usar o mtodo.

Adaptada por Wagner Jos dos Santos Jnior

111

112

Atividade 1
Crie uma classe para representar Livros em uma biblioteca, com os seguintes campos: ttulo,
autor, gnero, editora e edio. Assuma que o atributo gnero pode ter um dos seguintes tipos:
Fico, Cincias Naturais, Literatura ou Cincias Humanas. Assuma que tais tipos de gneros so
valores j conhecidos pela classe Livro, e que todos os objetos devem compartilh-los.

Classes abstratas
Ao longo dos nossos estudos sobre a programao orientada a objetos em Java, vimos os conceitos e vrios exemplos
de implementaes de classes e objetos. Voc viu que as classes so como moldes que geram os objetos segundo a
sua definio.
Todas as classes vistas at agora so o que chamamos de classes concretas, pois so utilizadas para gerar objetos
diretamente. Ou, ainda, esto prontas para serem usadas para gerar seus objetos, como formas de bolo ou biscoitos
prontas para receberem a massa e darem objetos quentinhos! Mas, existem classes das quais no possvel gerar
(instanciar) objetos, so as chamadas classes abstratas.

Primeiro, vejamos o que uma classe abstrata:

Classe abstrata aquela declarada como tal, atravs da palavra reservada abstract, e que pode definir
pelo menos um mtodo abstrato.

A Listagem 4 apresenta um exemplo de uma classe abstrata, chamada FiguraAbstrata. Uma figura abstrata representa
uma figura qualquer, por isso no sabe como ser desenhada e, de fato, no pode ser instanciada, pois ela define um
mtodo abstrato (desenha) para se autodesenhar, que ainda est indefinido.
No nosso exemplo, a classe FiguraAbstrata indica que mtodos as figuras derivadas dela (subclasses ou classes filha da
mesma) devem realizar ou implementar. Esses mtodos so os chamados mtodos abstratos. Uma classe abstrata no
pode instanciar objetos, porm, pode ser derivada por outras classes que, por sua vez, devero implementar seus
mtodos ou declarar-se tambm 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 mtodo desenha(). possvel criar
instncias (objetos) da classe Quadrado, porque ela no abstrata nem declarada como tal, e tambm define uma
implementao concreta para o mtodo desenha().

Adaptada por Wagner Jos dos Santos Jnior

112

113

Listagem 5 - Classe Quadrado

A importncia das classes abstratas dar-se principalmente em tempo de projeto do sistema, cria um nvel a mais de
abstrao e torna o projeto mais reutilizvel.

Atividade 2
1. Para exercitar o conceito de classes abstratas, crie outras classes derivadas (subclasses) de
FiguraAbstrata como Trapezio, Triangulo etc. Em seguida, implemente o mtodo desenha().
2. Finalmente, crie tambm uma classe com mtodo main() para tentar instanciar objetos
tanto da classe FiguraAbstrata quanto das subclasses que voc criou. No deixe de fazer
chamada ao mtodo desenha() para ver o que acontece.

Interface
Imagine uma grande equipe de desenvolvimento de software, onde h subdivises de acordo com a parte que o
software ir atuar, logo, necessria uma espcie de contrato para garantir independncia entre as equipes. Assim,
sabero o que devero fazer sem que saibam exatamente como est sendo implementado pela outra equipe.
Imaginemos que fabricamos softwares para serem implantados em brinquedos como robs, carrinhos e avies que
possuem como caracterstica 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 trs, parar e emitir um sinal de
localizao.
Os brinquedos so fabricados por uma companhia e os controles por uma empresa parceira em produo de eletrnicos.
Ambos so implementados na linguagem Java. O contrato estabelecido entre os desenvolvedores de que todos os
produtos que necessitam ser controlados por um controle remoto devero implementar a interface Mobilidade, cujo
cdigo apresentado na Listagem 6.

Listagem 6 Interface mobilidade

Adaptada por Wagner Jos dos Santos Jnior

113

114

De um lado, as classes que representam os produtos a serem controlados iro inscrever-se ou declararse implementadoras dessa interface. De outro lado, a classe controle remoto ir operar sobre esses mtodos sem
conhecer nada alm do que ela precisa saber, ou seja, o conjunto de mtodos 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 atravs da palavra reservada implements,
seguida do nome da interface Mobilidade. Outros mtodos podem ser definidos livremente pelas classes que
implementam interfaces. O que vemos na definio dos mtodos moveBracoDireito() e moveBracoEsquerdo(), por
exemplo, so tpicos de funes de um rob, mas que certamente no se aplicaria a um veculo de brinquedo.
A Listagem 8 apresenta a classe Trator, que tambm implementa a interface Mobilidade. Assim como a classe Rob, a
classe Trator implementa a interface Mobilidade e declara outro mtodo chamado de ergueEscavadeira(), que
representa uma funcionalidade extra e que no ser controlada remotamente.

Adaptada por Wagner Jos dos Santos Jnior

114

115

Listagem 8 - Classe Trator

Assim, como o mtodo moveBracoDireito() da classe Rob, o mtodo ergueEscavadeira() da classe Trator faz uma
atividade especfica para o brinquedo. E, por isso, s definido no prprio brinquedo.Por fim, temos a classe
ControleRemoto que realiza operaes sobre objetos Mveis que implementam a interface Mobilidade. Veja a Listagem
9.

Adaptada por Wagner Jos dos Santos Jnior

115

116

Listagem 9 - Classe ControleRemoto

Observe que a classe ControleRemoto possui mtodos que operam sobre objetos de classes que implementam a
interface Mobilidade, sejam eles quais forem. Por isso, na declarao dos mtodos, no est explcito classes como
Trator ou Rob, pois o controle trata-os de forma transparente. Esse exemplo tambm representa uma das formas de
polimorfismo.

Atividade 3
Para praticar os conceitos aprendidos, crie uma classe com um mtodo main() que teste a classe
controle remoto, atravs da criao de objetos da classe Trator e Rob e veja como so tratados de
forma idntica pela classe ControleRemoto.

Autoavaliao
1 - Defina o que um atributo esttico.
2 - Defina o que um mtodo esttico.
3 - Exercite a imaginao e crie para cada classe a seguir um atributo esttico:
a) Pessoa
b) Carro
c) Livro
d) ConsultaMdica
e) HistricoEscolar
4 - Voc capaz de comparar os conceitos de interface e classe abstrata, destacando semelhanas de um

Adaptada por Wagner Jos dos Santos Jnior

116

117

lado e diferenas do outro?


5 - Defina uma outra interface, cujas classes Trator e Rob iro implementar, que represente a sua
manuteno energtica, pois ambos precisam recarregar baterias, ligar, desligar etc.

Aula 14 - Juntando as Peas


Apresentao
Nesta aula, voc ver vrios conceitos da Programao Orientada a Objetos sendo usados de forma conjunta. O objetivo
entender como a POO funciona de fato. Atravs de exemplos e exerccios, vamos ver em ao os mecanismos da
linguagem Java na implementao desse revolucionrio paradigma. Assim, durante a aula voc vai praticar os conceitos e
a linguagem Java de forma mais ampla.

Objetivos
Ao final desta aula, voc ser capaz de:

compreender como os conceitos da POO podem ser usados conjuntamente;

perceber a aplicao dos conceitos OO e mecanismos da linguagem Java.

Encapsulamento e Herana
Os conceitos de Encapsulamento e Herana so relacionados e se entrelaam. Vimos anteriormente que cada classe define
seus atributos e a forma de acesso aos mesmos, de forma a preservar a segurana dos dados (atributos) com relao a
alteraes acidentais ou no desejadas.
Uma das formas de controlar tal acesso simplesmente impossibilitar que cdigo externo possa acess-la. Isso o que
chamamos de encapsulamento. Voc viu tambm que uma classe pode possuir outras classes descendentes, e que no
caso herdam seus respectivos atributos e comportamentos. Isso o que chamamos Herana. Veja os pilares da
programao orientada a objetos.

Adaptada por Wagner Jos dos Santos Jnior

117

118

Figura 1 - Pilares da POO

Um dos pontos que no discutimos em aulas anteriores, diz respeito forma de acesso (visibilidade) dos atributos de
classes filhas. Voltemos a esse ponto.
Considere uma classe me (Listagem1) com os seguintes atributos: idade, nome, sobrenome materno e sobrenome
paterno. E uma classe filha, chamada Filha (Listagem 2), em que iremos experimentar os modificadores de acesso diante
da estrutura hierrquica definida entre essas classes.

Listagem 1 - Classe Me

Listagem 2 - Classe Filha

Observe que a classe Filha herda todos os atributos de sua Me, porm, o atributo sobrenomeMaterno no pode ser
acessado 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 Jnior

118

119
o compilador Java.
Os demais atributos so do tipo protected e public. Atributos public podem ser acessados de qualquer lugar no programa e
representam o extremo do acesso livre em Java. Atributos protected so aqueles que podem ser acessados apenas pelas
subclasses da classe que declara tais atributos.

Os atributos public e protected so sempre visveis em classes filhas.


Os atributos private no. Porm, eles esto l! No se esquea, o fato de no estar visvel no significa no
existir. Pois, podemos modific-los atravs dos construtores da classe me (fazendo chamadas com
o super), assim como usando os mtodos get e set definidos na classe me.
Lembre-se:
A classe filha sempre herda as caracterstica da me, mas s pode ver o que a mame deixa ;-).

Para praticar, que tal fazermos um exerccio?

Atividade 1
1. Altere a classe Filha adicionando novos atributos, um deles chamado apelido, que pode ser
acessado por qualquer classe, outro chamado esportePreferido, restrito a classes que
herdam da classe Filha.
2. Adicione uma classe Filha de Filha, chamada Neta e nela crie mtodos para acessar todos
os atributos

Os exemplos que vimos sobre herana e encapsulamento demonstraram sua utilizao atravs de
atributos, porm, tudo que vimos se aplica exatamente da mesma maneira com os mtodos.

Encapsulamento e composio
Vimos durante nossa viagem pelo mundo OO que objetos podem ser compostos por outros e mantm as referncias de
tais objetos como seus atributos. Pois bem, esses atributos que representam referncias para outros objetos esto
sujeitos s mesmas regras de encapsulamento dos demais atributos de tipos primitivos de dados que cada classe
mantm.
interessante nos indagarmos em que situaes queremos que a composio de um objeto tenha seu acesso
preservado pelas demais instncias, ou, at mesmo de classes filhas. Os exemplos vistos at ento foram bastante
simples e usados apenas para observar como funciona o compartilhamento de atributos entre os mtodos. Porm, em
sistemas complexos, comum termos que tomar decises como essa, pois desenvolver sistemas tambm pressupe
gerenciar complexidade.
Vejamos um exemplo de um sistema que gerencia a rotina diria de operaes de uma oficina mecnica.
Geralmente,um sistema pensado, projetado e implementado, segundo competncias bem especficas. Isso significa
que a oficina possui diferentes setores para atendimento ao cliente, manuteno, estoque de peas, almoxarifado de
ferramentas e equipamentos. Cada setor lida com uma competncia especfica do sistema. Logo, internamente, o
sistema precisa encapsular informaes que no interessam a determinadas competncias.
Vamos isolar uma pequena situao e localizar no cdigo como a composio e o encapsulamento resolvem nosso
problema. Vejamos a Listagem 3 a seguir.

Adaptada por Wagner Jos dos Santos Jnior

119

120

Listagem 3 -Classe Pea

A classe Pea representa um elemento atmico de todos os veculos. Ela usada para representar diferentes peas
mecnicas, tais como, parafuso, porcas, rolamentos, presilhas, correias etc.
Essa classe define todos os seus atributos como private, porm, sendo ela uma classe que servir apenas como
repositrio desses dados, alguns projetistas iriam preferir defini-los como public, o que a tornaria equivalente a uma
estrutura structexistente nas linguagens procedurais. Embora, por boa prtica de POO, seja comum sempre manter
todos os atributos privados ou protected, que o princpio do encapsulamento.
J a classe Componente, apresentada naListagem 4, representa um elemento de mais alto nvel no conjunto de
elementos mecnicos de um carro, ou seja, um componente um conjunto de peas organizadas de forma lgica e com
uma determinada funo no veculo. Por exemplo, roda um conjunto de rolamento, aro, parafusos com funo bem
definida; j a direo do carro composta da barra e rolamento; e assim por diante.
Finalmente, o motor de um veculo to complexo em relao a outros componentes que s ele poderia ser uma
categoria especfica, sendo definido como uma classe que herda da classe Componente, composto por um conjunto de
outros componentes.
A Listagem 5 ilustra uma estratgia de implementao da classe Motor. Observe que ela definida como sendo
composta de um Arrayde objetos da classe Componente, mas por ser tambm um Componente, ela herda de tal classe.
Por fim, toda a estrutura mecnica do veculo ir fazer parte de um conjunto separado dos acessrios e demais
componentes do acabamento do veculo, como estofamento, pintura etc.

Listagem 4 - Classe Componente

Adaptada por Wagner Jos dos Santos Jnior

120

121

Listagem 5 - Classe Motor

Atividade 2
Defina uma classe Carro composta por diversos componentes e peas, de acordo com as classes
definidas anteriormente. Incremente as classes se necessrio.
Ateno:no esquea de criar uma classe com um mtodo main() para verificar o funcionamento
correto dos mtodos criados.

Herana, composio e polimorfismo


Vejamos agora como os conceitos de herana, composio e polimorfismo podem co-existir numa mesma soluo.
Vamos partir do seguinte ponto de vista: existem objetos que possuem um fim em si mesmo, como um lpis, chave de
fenda, mouse. No entanto, existem objetos que so usados para complementar outros, como um apontador,
ummousepad; h outros que servem apenas como repositrio: bolsas, organizadores, gavetas etc.
Para exemplificar, considere um objeto que funciona como repositrio: um guarda-roupas!
Como o prprio nome diz, ele serve para guardar outros objetos do tipo Roupa. Vamos imaginar os objetos que esto
envolvidos nessa perspectiva, desde os objetos mais abstratos at os mais detalhados (ou concretos), conforme
desejamos. Por exemplo, uma roupa possui caractersticas, como cor, tecido, manequim, preo, estampa etc. Uma
roupa pode ser de vrios tipos, como esportiva, social, casual, de banho, fardamento etc.
Logo surge a questo: iremos definir os tipos existentes de roupa como subclasses da classe Roupa? Assim como no
mundo real, no mundo OO no existe uma resposta certa para todas as situaes. Isso ir variar dependendo do nvel
de detalhamento que voc desejar implementar sua soluo. Uma alternativa definir um atributo, chamado tipo, na
classe Roupa.
Outra forma definir uma subclasse para cada tipo de roupa que existir. Uma soluo intermediria definir subclasses
para os tipos de roupas mais comuns e reservar um atributo para descrev-la quando no houver uma classificao prdefinida. Devido a restries de espao, ilustraremos apenas essa ltima soluo. A seguir, so apresentadas as classes
de tal soluo. A Listagem 6 ilustra a classe Roupa.

Adaptada por Wagner Jos dos Santos Jnior

121

122

Listagem 6 -Classe Roupa

Vamos agora definir os tipos principais de roupas existentes, so eles: esportivas, sociais e fardamentos. Logo,
precisamos gerar mais trs classes derivadas de roupa. A Listagem 7, Listagem 8 e a Listagem 9 ilustram o cdigo de
tais classes.

Adaptada por Wagner Jos dos Santos Jnior

122

123

Listagem 7 - Classe Esporte

Listagem 8 - Classe Social

Adaptada por Wagner Jos dos Santos Jnior

123

124

Listagem 9 - Fardamento

Listagem 10 -Classe GuardaRoupa

Adaptada por Wagner Jos dos Santos Jnior

124

125
Vamos agora criar uma classe que serve para armazenar objetos do tipo Roupa e suas derivadas. A classe
GuardaRoupas, apresentada na Listagem 10, responsvel por armazenar as roupas em compartimentos distintos por
categoria.
Observe que os mtodos da classe GuardaRoupa adicionam e retiram roupas independentes se so social, esportiva ou
fardamento. No mtodo confereRoupas(), ser mandado uma mensagem para que cada objeto roupa exiba seus dados,
atravs do polimorfismo. Observe que cada objeto ir executar o mtodo como sua classe definiu e as mensagens sero
enviadas de forma transparente a todos eles.
Vejamos, na Listagem 11, agora, uma classe que define um mtodo main() para criao de objetos Roupa e
GuardaRoupa.

Listagem 11 - Classe VestuarioMain

Juntando as peas
At agora, vimos os conceitos um a um, como se relacionam os mecanismos bsicos da linguagem Java. Acredite, voc j
capaz de escrever sistemas mais complexos!
Mas, sejamos realistas, saber mexer as peas de um tabuleiro de xadrez no nos faz um bom enxadrista. Para tanto,
precisamos dominar realmente as tcnicas, praticar diariamente e adquirir experincia na resoluo de problemas.
Iniciamos a jornada, precisamos nunca parar, pois: programar preciso! Vamos comear explorando nossa habilidade em

Adaptada por Wagner Jos dos Santos Jnior

125

126

interpretar problemas e projetar solues.

Atividade 3
Resolva os problemas a seguir.
PROBLEMA 1 Vesturio
O ltimo problema apresentado tratava do manejo de peas de um vesturio. Sendo que apenas
para armazen-lo em um guarda-roupas.
Vamos ampliar a situao e tratarmos o problema de forma mais ampla. Para isso, vamos organizar
as ideias da seguinte forma: iremos listar todos os pontos observados do problema, em seguida,
projetar as classes que iro compor o sistema, s ento partiremos para a codificao.
Eis o problema:
1. As roupas se dividem em categorias, sendo essas:
o Social
o Esporte
o Esporte Fino
o Trabalho
2. Todas as roupas possuem caractersticas como:
o Cor
o Nmero do manequim
o Tecido com o qual feito
o Preo
3. As roupas podem se encontrar em 3 (trs) situaes (status) distintas:
o No guarda-roupas
o Em uso
o Na lavanderia
4. O sistema deve nos dizer:
o Quantas roupas esto na lavanderia
o Quantas roupas esto no guarda-roupas
o Qual a cor predominante no guarda-roupas
o Adicionar e remover roupas
Dica: utilize o cdigo apresentado durante esta aula como ponto de partida e faa as modificaes
necessrias. Ser preciso criar uma classe Lavanderia para agrupar as roupas em no esto em uso
nem no guarda-roupas.
PROBLEMA 2 Oficina Mecnica
Vamos voltar ao exemplo da nossa Oficina. Lembra das competncias pelas quais as empresas
organizam suas atividades?
Pois bem, nossa oficina est passando por um processo de modernizao e, dentre os
investimentos, resolveu encomendar um sistema que gerencie as etapas fundamentais do
processo.
Vamos dividir o problema para definirmos melhor a soluo, da forma apresentada a seguir.

Atendimento ao cliente
A oficina precisa guardar os dados de clientes como:
Nome, CPF, endereo e telefone.

Manuteno
A oficina precisa conhecer bem os automveis, claro! Todo veculo possui os seguintes dados:

Adaptada por Wagner Jos dos Santos Jnior

126

127

Placa, ano, marca, modelo, numerao do chassi, tipo de combustvel, proprietrio (um cliente).

Almoxarifado
Suponha que a oficina tenha todas as peas de reposio necessrias manuteno dos veculos; e
que cada pea consultada por seu nome, ano, marca e modelo do veculo.
Exemplo: o mecnico Antnio precisa de um carburador para um Volkswagen Fox 2005.
Nosso desafio criar todas as classes necessrias para implementar esse sistema, observando as
composies, herana e polimorfismo vistos at aqui.

Adaptada por Wagner Jos dos Santos Jnior

127

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

Adaptada por Wagner Jos dos Santos Jnior

128

You might also like