Professional Documents
Culture Documents
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:
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.
E dessa maneira que iremos aprender a ver o mundo em nossa volta. O mundo dos 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.
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.
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.
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:
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.
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
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.
10
11
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 :
11
12
12
13
13
14
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.
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.
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:
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
15
16
anterior, veja a Listagem 1:
16
17
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:
17
18
na Figura 2.
18
19
Atividade 1
Insira uma instruo que exiba o seu nome e idade na sada do programa.
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:
20
21
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:
22
23
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
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
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.
24
25
Agora, vejamos outro exemplo, este no mundo OO Java, relembrando nosso programa:
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
25
26
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.
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:
26
27
27
28
Observe a linha:
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.
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.
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
4 - Vamos adicionar outros mtodos classe Pessoa para interagir (trocar mensagens) com seu carro.
29
30
Listagem 9 Classe Pessoa recebe mtodos para interagir com a classe Carro
30
31
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:
31
32
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.
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:
Encapsulamento
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
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.
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
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 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;
}
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
}
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.
Agora, vamos querer que essa classe anote a informao. Assim, nossa classe fica:
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:
36
37
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().
37
38
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.
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.
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.
39
40
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.
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:
40
41
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.
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
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.
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 onde podemos declarar as variveis que representam tipos primitivos ou referncias para
objetos dentro de uma classe Java.
43
44
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.
1.
2.
3.
4.
5.
6.
7. char caracter1 = A;
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.
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.
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.
1.
2.
3.
4.
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.
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.
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 +.
47
48
48
49
Objetivos
Ao final desta aula, voc ser capaz de:
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.
49
50
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.
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.
51
52
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.
52
53
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.
53
54
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:
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:
54
55
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.
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.
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.
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.
56
57
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.
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.
57
58
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).
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.
ou
colees
(do
58
59
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?
59
60
Objetivos
Ao final desta aula, voc ser capaz de:
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.
60
61
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.
61
62
Nas linhas de cdigo, essa Composio expressa da seguinte maneira, veja Listagem 1:
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
62
63
Computador
Livro
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:
63
64
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.
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.
64
65
Para a primeira situao, quando o construtor da classe componente chamado no construtor da classe que usa a
composio, ilustrada na Listagem 7, temos:
65
66
Nesse exemplo, os construtores da classe motor so chamados dentro dos construtores da classe Automvel.
Outra maneira seria a situao, na qual os construtores so chamados em qualquer mtodo da classe que composta.
Vejamos a Listagem 8:
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.
66
67
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-
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.
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.
68
69
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.
69
70
Objetivos
Ao final desta aula, voc ser capaz de:
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
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.
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.
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
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.
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.
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.
72
73
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.
Figura 1 - Tabuleiro
73
74
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.
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:
74
75
2. List como o prprio nome sugere, representa uma lista de objetos, sendo que nela os objetos podem se repetir. Veja a
figura.
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:
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:
75
76
Observe que para encontrarmos nossos objetos precisamos localiz-los atravs de suas chaves. Vejamos uma
aplicao desses conceitos na Listagem 9:
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.
76
77
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:
boolean add(Object)
boolean remove(Object)
intsize()
boolean contains(Object)
Anote a Dica
As colees Java mantm um mecanismo interno de ordenao e recuperao de dados e para isso fazem
uso de tabelas hash. Tais tabelas so utilizadas para que a pesquisa de um objeto seja feita de maneira
rpida.
Mas, como funciona?
Cada objeto classificado pelo seu hashCode, mtodo de java.lang.Object que retorna um int, e com
isso podemos agrupar os objetos por esse valor. Quando realizada uma busca, s percorrido o grupo
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:
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.
78
79
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.
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.
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.
Superclasse
Subclasse
Me
Filha
Tipo
Subtipo
Quadro 1 - Termos usados na Herana
80
81
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.
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)
81
82
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
82
83
que Automvel herda de Terrestre.
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
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:
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.
85
86
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.
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.
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.
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.
A Listagem 4 ilustra um exemplo de herana em Java, que faz uso da palavra-chave super. Vamos ento entender o
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.
88
89
89
90
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.
90
91
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.
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.
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).
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
92
93
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
93
94
programas.
Objetivos
Ao final desta aula, voc deve ser capaz de:
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.
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.
94
95
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.
95
96
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.
Observe que agora os dois ltimos mtodos possuem nmero e tipos de parmetros diferentes dos mtodos anteriores.
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.
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.
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.
98
99
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().
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().
99
100
anterior)
possui
como
descendentes
as
100
101
Observe que as classes filhas sobrepem o mtodo mover() da classe Brinquedo. Vejamos ento como ficam essas
classes codificadas em Java na Listagem 6.
101
102
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.
102
103
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.
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
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().
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).
Observe que a classe ControleRemoto est relacionada com a classe Brinquedo, pois possui um atributo do
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
de
um
mtodo
construtor
para
cada
mtodo
c) Polimorfismo de Incluso: quando for adicionar ao arraypessoas uma nova pessoa que pode ser de um
dos tipos descendentes de Pessoa.
105
106
Objetivos
Ao final desta aula, voc ser capaz de:
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.
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.
107
108
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.
108
109
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...
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:
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;
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
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.
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.
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.
112
113
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.
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.
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.
114
115
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.
115
116
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
116
117
Objetivos
Ao final desta aula, voc ser capaz de:
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.
117
118
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
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
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.
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.
119
120
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.
120
121
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.
121
122
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.
122
123
123
124
Listagem 9 - Fardamento
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.
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
125
126
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:
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.
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.
128