Anda di halaman 1dari 154

Alexandre Michael Souza de Melo

Thiers Garretti Ramos Sousa

Programao de
Computadores II

Jouberto Ucha de Mendona


Reitor
Amlia Maria Cerqueira Ucha
Vice-Reitora
Jouberto Ucha de Mendona Junior
Pr-Reitoria Administrativa - PROAD
Ihanmarck Damasceno dos Santos
Pr-Reitoria Acadmica - PROAC
Domingos Svio Alcntara Machado
Pr-Reitoria Adjunta de Graduao - PAGR
Temisson Jos dos Santos
Pr-Reitoria Adjunta de Ps-Graduao
e Pesquisa - PAPGP
Gilton Kennedy Sousa Fraga
Pr-Reitoria Adjunta de Assuntos
Comunitrios e Extenso - PAACE
Jane Luci Ornelas Freire
Gerente do Ncleo de Educao a Distncia - Nead
Andrea Karla Ferreira Nunes
Coordenadora Pedaggica de Projetos - Nead
Lucas Cerqueira do Vale
Coordenador de Tecnologias Educacionais - Nead
Equipe de Elaborao e
Produo de Contedos Miditicos:
Alexandre Meneses Chagas - Supervisor
Ancjo Santana Resende - Corretor
Andira Maltas dos Santos Diagramadora
Claudivan da Silva Santana - Diagramador
Edilberto Marcelino da Gama Neto Diagramador
Edivan Santos Guimares - Diagramador
Fbio de Rezende Cardoso - Webdesigner
Geov da Silva Borges Junior - Ilustrador
Mrcia Maria da Silva Santos - Corretora
Marina Santana Menezes - Webdesigner
Matheus Oliveira dos Santos - Ilustrador
Pedro Antonio Dantas P. Nou - Webdesigner
Rebecca Wanderley N. Agra Silva - Designer
Rodrigo Otvio Sales Pereira Guedes - Webdesigner
Rodrigo Sangiovanni Lima - Assessor
Walmir Oliveira Santos Jnior - Ilustrador
Redao:
Ncleo de Educao a Distncia - Nead
Av. Murilo Dantas, 300 - Farolndi
Prdio da Reitoria - Sala 40
CEP: 49.032-490 - Aracaju / SE
Tel.: (79) 3218-2186
E-mail: infonead@unit.br
Site: www.ead.unit.br
Impresso:
Grfica Gutemberg
Telefone: (79) 3218-2154
E-mail: grafica@unit.br
Site: www.unit.br
Banco de Imagens:
Shutterstock

M528p

Melo, Alexandre Michael Souza de


Programao de computadores II / Alexandre Michael Souza de Melo, Thiers Garretti Ramos Sousa. Aracaju : UNIT, 2011.
152 p.: il.
Inclui bibliografia
1. Informtica 2. Programao de computadores. I. Sousa, Thiers Garretti Ramos
Universidade. II. Tiradentes Educao
Distncia III. Titulo
CDU : 004.42
Copyright Sociedade de educao Tiradentes.

Apresentao
Prezado(a) estudante,
A modernidade anda cada vez mais atrelada ao tempo,
e a educao no pode ficar para trs. Prova disso so as
nossas disciplinas on-line, que possibilitam a voc estudar
com o maior conforto e comodidade possvel, sem perder a
qualidade do contedo.
Por meio do nosso programa de disciplinas on-line
voc pode ter acesso ao conhecimento de forma rpida,
prtica e eficiente, como deve ser a sua forma de comunicao
e interao com o mundo na modernidade. Fruns on-line,
chats, podcasts, livespace, vdeos, MSN, tudo vlido para
o seu aprendizado.
Mesmo com tantas opes, a Universidade Tiradentes
optou por criar a coleo de livros Srie Bibliogrfica Unit como
mais uma opo de acesso ao conhecimento. Escrita por nossos
professores, a obra contm todo o contedo da disciplina que
voc est cursando na modalidade EAD e representa,
sobretudo, a nossa preocupao em garantir o seu acesso
ao conhecimento, onde quer que voc esteja.

Desejo a voc bom


aprendizado e muito sucesso!

Professor Jouberto Ucha de Mendona


Reitor da Universidade Tiradentes

Sumrio
Parte 1: Princpios da Programao Orientada a
Objetos em Java. . . . . . . . . . . . . . . . . . . . . 11
Tema 1: Introduo Orientao a Objetos . . . . . . . . . . . . . . . . . . . . 13
1.1 Revisando a Linguagem Java . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2 Conceitos Bsicos da OO . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.3 Classes e Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.4 Atributos e Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Tema 2: Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
2.1 Construtores e o Gerenciamento da Memria . . . . . . . . . 48
2.2 Membros de Instncia X Membros de Classe . . . . . . . . . 54
2.3 Herana no Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61
2.4 A classe Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Parte 2: Aspectos Avanados da Programao


Orientada a Objetos em Java . . . . . . . . . . 77
Tema 3: Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
3.1 Do Conceito Prtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
3.2 Abstract X Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
3.3 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
3.4 Interfaces Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .110
Tema 4: Excees, Colees e Fluxos . . . . . . . . . . . . . . . . . . . . . . . . 111
4.1 Tratamento de Excees . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
4.2 Avanando nas Excees . . . . . . . . . . . . . . . . . . . . . . . . . 120
4.3 Colees da Java API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
4.4 Fluxo de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

Concepo da Disciplina
Ementa
Introduo Orientao a Objetos: Revisando
a Linguagem Java, Conceitos Bsicos da OO, Classes
e Objetos, Atributos e Mtodos. Herana: Construtores e o Gerenciamento da Memria, Membros de
Instncia X Membros de Classe, Herana no Java, A
classe Object. Polimorfismo: Do Conceito Prtica,
Abstract X Final, Interfaces, Interfaces Especiais.
Excees, colees e fluxos: Tratamento de Excees,
Avanando nas Excees, Colees da Java API, Fluxos
de Dados.

Objetivos:
Geral
Apresentar ao aluno os conceitos do paradigma
da Programao Orientada a Objetos na linguagem
de programao Java.
Especficos

Desenvolver a capacidade de abstrao


do mundo real para implementao em
aplicaes computacionais;

Escrever trechos de cdigo reutilizveis e


de fcil manuteno, viabilizando a construo de aplicaes mais complexas.

Orientao para Estudo


A disciplina prope orient-lo em seus procedimentos de estudo e na produo de trabalhos
cientficos, possibilitando que voc desenvolva
em seus trabalhos e pesquisas o rigor metodolgico e o esprito crtico necessrios ao estudo.
Tendo em vista que a experincia de estudar a distncia algo novo, importante que
voc observe algumas orientaes:
Cuide do seu tempo de estudo! Defina um
horrio regular para acessar todo o contedo
da sua disciplina disponvel neste material
impresso e no Ambiente Virtual de Aprendizagem (AVA). Organize-se de tal forma
para que voc possa dedicar tempo suficiente para leitura e reflexo;
Esforce-se para alcanar os objetivos propostos na disciplina;
Utilize-se dos recursos tcnicos e humanos que esto ao seu dispor para buscar esclarecimentos e para aprofundar as
suas reflexes. Estamos nos referindo
ao contato permanente com o professor
e com os colegas a partir dos fruns,
chats e encontros presenciais. Alm dos
recursos disponveis no Ambiente Virtual de
Aprendizagem AVA.
Para que sua trajetria no curso ocorra de forma
tranquila, voc deve realizar as atividades propostas
e estar sempre em contato com o professor, alm
de acessar o AVA.

Para se estudar num curso a distncia devese ter a clareza que a rea da Educao a Distncia pauta-se na autonomia, responsabilidade, cooperao e colaborao por parte dos envolvidos, o
que requer uma nova postura do aluno e uma nova
forma de concepo de educao.
Por isso, voc contar com o apoio das
equipes pedaggica e tcnica envolvidas na operacionalizao do curso, alm dos recursos tecnolgicos que contribuiro na mediao entre voc
e o professor.

PRINCPIOS DA PROGRAMAO
ORIENTADA A OBJETOS EM
JAVA
Parte 1

Introduo Orientao a
Objetos

Neste nosso primeiro tema, veremos uma introduo ao conceito


de Orientao a Objetos (OO). Inicialmente, comentaremos o novo
paradigma de desenvolvimento de aplicaes e em seguida breves
comentrios sobre os conceitos bsicos. Haver ainda a apresentao
dos conceitos de objetos e tambm de classes, com seus atributos e
mtodos. Aps este captulo, estaremos preparados para aprofundar
os pilares da programao Orientada a Objetos.
Caso voc j possua alguma informao a respeito da linguagem orientada a objetos (como Java, por exemplo), este livro
pode ajud-lo a aprofundar os seus conhecimentos, porm no fique preocupado caso voc no possua nenhuma experincia com a
programao OO. Como a linguagem Java ser usada para ensinar
conceitos de OO, neste primeiro momento ser feita uma breve
reviso da linguagem Java (sinta-se vontade para rever o que achar
necessrio sobre a linguagem no livro anterior Programao de
Computadores I).

14

Programao de Computadores II

1.1 Revisando a Linguagem Java


Histria
A tecnologia Java foi criada em 1991, a partir de um projeto
desenvolvido pela empresa Sun Microsystems (este projeto foi liderado por James Gosling), e, poucos anos depois, em 1995, ganhou
notoriedade mundial. Isto aconteceu a partir do momento em que a
linguagem de programao passou a ser o foco principal da empresa.
A plataforma Java, desde o momento inicial, quando foi anunciada pela
Sun, composta pela Mquina Virtual Java (JVM) e pela API JAVA; logo
em seguida, esta plataforma passou a ser incorporada ao navegador
Netscape Navigator (principal navegador da poca). Esse fato impulsionou a grande aceitao no uso da plataforma Java, fato verificado nos
anos seguintes.
Caractersticas
Vejamos a seguir algumas caractersticas que propiciaram o
crescimento e a grande aceitao da linguagem Java no cenrio de
desenvolvimento web.
a) Simplicidade: a linguagem Java fcil de aprender e de programar (ainda mais fcil para desenvolvedores da linguagem
C++, j que tem muita semelhana com ela); para no se tornar complexa, Java no incorporou mecanismos mais sofisticados como ponteiros e herana mltipla; o gerenciamento
de memria ainda est presente na linguagem Java, mas
no responsabilidade do desenvolvedor, pois o controle
totalmente automtico.
b) Orientada a objetos: Java uma linguagem totalmente OO,
(quase) tudo considerado um objeto (a exceo fica por
conta dos tipos primitivos, os quais no so objetos por uma
questo de desempenho); so oferecidos todos os mecanismos presentes nas linguagens orientadas a objetos, como
por exemplo polimorfismo, encapsulamento e herana.

Tema 1

| Introduo orientao a objetos

15

c) Portabilidade: a Mquina Virtual Java (JVM Java Virtual Machine) garante a portabilidade de todos os programas escritos em Java; estes programas escritos no formato texto (com
a extenso .java) quando so compilados geram automaticamente um outro arquivo bytecode com a extenso .class. Este
bytecode pode ser executado em qualquer ambiente desde
que l contenha a JVM, garantindo a veracidade da frase write once, run anywhere (traduzindo: escreva uma vez, rode em
qualquer lugar).

Figura 01 - A portabilidade permite que o seu cdigo seja executado em qualquer sistema operacional.

d) Alto desempenho: por executar um cdigo que j foi analisado e convertido para um bytecode, obtm-se um bom
desempenho. O coletor de lixo outro fator que melhora a
performance por liberar memria que no est mais sendo
usada. Alm disso, o fato de compilar no prprio ambiente
que ser posteriormente interpretado, faz com que a performance seja melhor.
e) Interpretada: em um primeiro momento ela compilada,
gerando um arquivo bytecode intermedirio que pode ser
executado em qualquer sistema operacional (desde que contenha a mquina virtual Java).

16

Programao de Computadores II

Figura 02 - Aps ser compilado, o arquivo fonte (*.java) se transforma em um arquivo binrio (*.class) e em
seguida pode ser interpretado (podendo antes disso ainda ser verificado).

f) Robustez: entre algumas caractersticas que tornam linguagem Java robusta, podemos citar: possuir no momento da
compilao uma varredura por cdigo no alcanvel; procurar e identificar variveis no inicializadas; ser uma linguagem fortemente tipada; inicializar de maneira implcita todos
os tipos primitivos e possuir uma eficiente manipulao de
excees.
g) Segurana: ser uma linguagem segura muito importante, j
que foi projetada para ambientes distribudos; a JVM garante
em um ambiente web que todos as aplicaes Java fiquem
protegidas de programas maliciosos escritos em qualquer outra linguagem. Alm disso, a coleta automtica de lixo tambm evita erros de gerenciamento de memria frequentes em
outras linguagens. H tambm mecanismos de tratamento de
erros e o fato de todas as variveis terem obrigatoriamente
os tipos informados no momento da declarao fortalecem
ainda mais o fator segurana.

Tema 1

| Introduo orientao a objetos

17

h) Multithread: tcnica que projeta e implementa aplicaes


paralelas de forma eficiente e que permite a utilizao de
mecanismos de sincronizao entre processos.
Por que usar Java ?
H muito tempo Java a linguagem mais utilizada em todo o
mundo e a plataforma Java o mecanismo que permite aproximar o
usurio das informaes, atravs dos inmeros sistemas utilizados
na Internet.

Figura 03 - Ranking tiobe

A API Java fornece aos desenvolvedores uma vasta biblioteca


tanto para ambiente desktop (SWT, Swing) como para aplicaes web
(JSP, JSF, servlet).
A curva de aprendizado desta linguagem muito suave, mais
ainda para conhecedores das linguagens C ou C++, das quais Java
apresenta muita semelhana; ou mesmo para programadores que conhecem o conceito de orientao a objetos.
Elementos Bsicos da Linguagem Java
Como falamos nas caractersticas da Linguagem Java, ela fortemente tipada (suas variveis tm obrigatoriamente que informar
o tipo de dado no momento da declarao). Para esta declarao
ser feita, podem ser utilizados os tipos primitivos, os quais esto

18

Programao de Computadores II

presentes na primeira coluna da tabela abaixo; nas demais colunas,


podemos verificar os tamanhos, intervalos e valores iniciais:

Figura 04 - Os tipos primitivos da linguagem Java.

Para usar uma varivel, devemos informar o seu nome, tipo e


valor inicial, pois o tipo determina o conjunto de valores que esta
varivel pode assumir. Devemos lembrar o conceito de escopo de
varivel, ou seja, partindo do princpio que uma varivel deve ser
definida dentro de um mtodo, fora deste mtodo esta varivel no
ser mais visvel.
Agora devemos comentar sobre os operadores, os quais podem
ser categorizados em:
a) aritmticos: + (soma), - (subtrao), * (multiplicao), / (diviso)
e % (mdulo);
b) unrios: ++ (pr-incremento ou ps-incremento), -- (pr-decremento ou ps-decremento);
c) relacionais: == (igualdade), != (desigualdade), < (menor), <=
(menor ou igual), > (maior), >= (maior ou igual);
d) lgicos: && (E lgico), || (OU lgico), ! (negao lgica);

Tema 1

| Introduo orientao a objetos

19

e) de atribuio: = (atribuio simples),


+= (x += y; equivale a x = x + y;)
-= (x -= y; equivale a x = x - y;)
*= (x *= y; equivale a x = x * y;)
/= (x /= y; equivale a x = x / y;)
%= (x %= y; equivale a x = x % y;)
Para comentar um trecho de cdigo, existem trs possibilidades:
a) comentrio de linha
// isto est comentado
b) comentrio de bloco
/* estas linhas
esto comentadas */
c) iniciando com barra e dois asteriscos, semelhante ao comentrio de bloco mas podendo gerar um arquivo html de
documentao automaticamente.
/** estas linhas esto comentadas
e podem gerar um html de documentao */
As instrues de um cdigo so geralmente executadas de
maneira sequencial, de cima para baixo, na ordem em que aparecem. Sentenas de controle de fluxo, no entanto, podem alterar este
fluxo de execuo.
As estruturas de controle disponibilizadas pela linguagem Java
so agrupadas da seguinte forma: declaraes de tomada de deciso (if, if-else, switch), declaraes de lao (for, while, do-while) e
as declaraes de interrupo (break, continue, return).
A declarao if a mais simples das declaraes de controle
de fluxo. Um bloco de instrues ser executado somente se um

20

Programao de Computadores II

determinado teste (expresso booleana) for verdadeiro. possvel


executar outro bloco de instrues quando o teste for falso, para isso
basta usar a opo else.
if (teste) {
// instrues quando o teste for verdadeiro
} else {
// instrues quando o teste for falso
}
J a instruo switch permite vrios caminhos de execuo
possveis. Simula um cdigo com mltiplos ifs. A nica restrio
que o tipo de dado da varivel a ser analisada seja byte, short, int
ou char; na verso Java7 j possvel usar String tambm.
switch (varivel) {
case x: instrues A; break;
case y: instrues B; break;
case z: instrues C; break;
}
As declaraes while e do-while executam repetidamente um
bloco de instrues enquanto uma expresso booleana (teste) for
verdadeira.
while (expresso booleana) {
// instrues
}
A diferena entre estas declaraes que do-while avalia sua

expresso na parte inferior do loop ao invs do topo (como no while). Consequentemente, as instrues dentro do bloco do-while so
sempre executados pelo menos uma vez.
do {
// instrues
} while (expresso booleana);

Tema 1

| Introduo orientao a objetos

21

A declarao for fornece uma maneira compacta para iterar


sobre uma faixa de valores. A forma mais comum segue a orientao
do cdigo abaixo:
for(initializao;teste de trmino; ao) {
bloco de instrues
}
A API Java disponibiliza vrias estruturas de armazenamento de
dados, uma das mais utilizadas o array. Esta estrutura relativamente simples por apresentar um nmero fixo de valores e todos eles
devem ser de um nico tipo. O comprimento de um array estabelecido no momento da criao. Depois da criao, seu tamanho no
pode ser mais alterado.

Figura 05 - Estrutura de um array.

Outra caracterstica da linguagem Java que merece ser citada


o gerenciamento de memria. Em vrias outras linguagens, o desenvolvedor responsvel por desalocar um recurso no mais utilizado;
porm o gerenciamento da memria no uma tarefa simples, sendo
comum ocorrer estouro da pilha (stack overflow) ou outros problemas
semelhantes. Em Java, o desenvolvedor no precisa se preocupar
com um controle deste tipo, uma vez que o gerenciamento da memria feito automaticamente pela mquina virtual.

22

Programao de Computadores II

INDICAO DE LEITURA COMPLEMENTAR


HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7.
ed., So Paulo: Alta Books, 2005.
No primeiro captulo (pg. 1 a 8) feita uma breve introduo ao Java,
fazendo um breve histrico e comentando a plataforma Java; o segundo captulo (pg. 9 a 18) fala sobre o ambiente de programao Java;
o captulo 3 faz uma explanao sobre as estruturas fundamentais de
programao em Java.
MENDES, D. R.. Programao Java com nfase em Orientao a Objetos. So Paulo: Novatec Editora Ltda, 2009.
O captulo 1 faz uma introduo linguagem Java (pg. 16 a 54) com
destaque s suas caractersticas, enquanto que o captulo 2 apresenta
os elementos bsicos da linguagem Java (pg. 77 a 90).

PARA REFLETIR
Como possvel escrever e compilar um programa na linguagem de
programao Java em um computador com o Sistema Operacional
Windows instalado e em seguida pegar o arquivo compilado (*.class)
e este arquivo funcionar em uma outra mquina que tenha uma verso qualquer do Linux instalada ? Reflita sobre o que faz com que
isto acontea e como isto acontece.

Tema 1

| Introduo orientao a objetos

23

1.2 Conceitos Bsicos da OO


Histria
As linguagens orientadas a objetos que conhecemos atualmente surgiram por volta do ano de 1960, porm demorou mais de dez
anos para que as empresas de desenvolvimento de software comeassem a adotar este novo estilo de linguagem de programao.
Naquela poca, as linguagens utilizavam o paradigma da programao estruturada, com pouca reutilizao de cdigo e muita redundncia. Neste paradigma, tambm chamado de procedural, havia
um alto acoplamento, ou seja, uma simples alterao em uma das
partes do sistema poderia forar uma modificao em vrios locais
da aplicao e, consequentemente, exigir que todo o sistema fosse
testado de novo, o que aumentava o custo do software e acabava
diminuindo o lucro da empresa.
Mas, com o passar do tempo, as linguagens orientadas a objetos (como Java e C++) passaram a ser aceitas no mercado, passando
a integrar o processo de desenvolvimento de sistemas da maioria das
empresas.
Paradigma
O paradigma da orientao a objetos possui uma tica diferente da programao estruturada, uma vez que passa a adotar maneiras
de enxergar um sistema muito mais prximo da viso humana. Como,
por exemplo, em um sistema de escola, teramos uma classe Aluno,
outra classe Professor, outra classe Disciplina, todas elas interagindo
entre si.
No paradigma procedural, eram as funes; no paradigma OO,
existe o objeto como centro das atenes. O mundo real, ento, interpretado como se fossem objetos interagindo entre si e possuindo
os seus respectivos estados e comportamentos. Sendo que os estados so as caractersticas (como por exemplo o nome de um Aluno)
e os comportamentos correspondem s aes vinculadas ao objeto
(por exemplo, um Aluno pode trancar uma Disciplina).
de fundamental importncia esta mudana de paradigma
(passando de programao estruturada para programao orientada
a objetos), pois seria uma pssima prtica utilizar a linguagem Java,

24

Programao de Computadores II

por exemplo, pensando de maneira estruturada; desprezando totalmente os recursos e potenciais da linguagem, que foi concebida de
fato como uma linguagem OO.
Hoje em dia, a grande maioria das empresas adota fortemente
a Programao OO (OOP). O que se nota que a OOP apenas mais
uma etapa natural da evoluo do desenvolvimento de software.
Surgimento
Vamos analisar uma histria que a princpio pode parecer desconexa, mas que tem sim um relacionamento com o conceito OO.
Analisando os grandes fabricantes de computadores da atualidade,
percebemos que eles tiveram uma curva de crescimento acelerada,
isto , o sucesso foi atingido de forma relativamente rpida. Claro que
os seus produtos apresentavam uma tima qualidade e que tambm
conseguiam vend-los a preos satisfatrios, alm de que a procura
por PC crescia muito rapidamente. Mas a questo : como estes fabricantes conseguiam produzir tantos modelos de computadores de
forma rpida e ainda ser geis o bastante em uma poca de constantes evolues?
Podemos citar alguns fatores que explicam o que aconteceu: estes fabricantes conseguiram aperfeioar as suas linhas de produo,
passaram a comprar peas de outros fabricantes confiveis e concentraram os esforos apenas na linha de montagem dos computadores.
Isto economizava tempo e recursos na criao e desenvolvimento dos
diversos componentes adquiridos. Quando estes fabricantes compravam um componente, estavam garantindo que estas partes (com suas
propriedades e suas funcionalidades) j estavam pr-testadas, o que
tornava o processo inteiro mais eficiente. Por exemplo, ao invs de
fabricar um disco rgido com uma determinada capacidade de armazenamento e com o papel definido para armazenamento de dados, a
empresa de PC comprava este HD de outro fabricante, especializado
exclusivamente na construo deste componente. No momento em
que estas fbricas deixaram de produzir todas as partes e passaram
a comprar componentes, os seus faturamentos cresceram de maneira
acentuada.

Tema 1

| Introduo orientao a objetos

25

Tomando este caso como referncia, podemos fazer um paralelo e perceber que a OOP segue o mesmo princpio. Um sistema
desenvolvido seguindo o conceito OO composto por vrios objetos
(cada um deles com as suas respectivas propriedades e funcionalidades bem definidas). Desta forma o sistema espera apenas que cada
objeto faa a sua parte, sem se preocupar em como isto ser feito,
ou seja, no importa a implementao interna de cada um deles, isto
responsabilidade do desenvolvedor de cada objeto.
Objetivo
O principal objetivo da programao orientada a objeto facilitar o desenvolvimento de software atravs da reutilizao de objetivos anteriormente desenvolvidos. Esta prtica faz com que os sistemas sejam desenvolvidos mais rpido, de maneira mais confivel
e ainda com custos mais baixos. Este objetivo conseguido atravs
diversas caractersticas de programao, sendo possvel utilizar recursos como instanciao, polimorfismo, herana, interface, entre outros.
Conceitos bsicos
Assim como no paradigma procedural as funes fazem o papel
principal, no paradigma OO, o conceito de objeto o ncleo principal.
Um objeto pode ser entendido como uma representao codificada
de qualquer entidade do mundo real, onde este objeto transferido
para linhas de cdigo inclusive com suas caractersticas e seus comportamentos.
A programao orientada a objetos parte do princpio que os sistemas so construdos se espelhando ao mximo nos prprios objetos
da vida real. Antes de fazermos um aprofundamento em cada um dos
pilares da orientao a objetos, devemos ver de maneira simplificada
alguns dos conceitos principais.
Como acabamos de citar, fica evidente que o elemento considerado ponto de partida para o entendimento do conceito OO o prprio
objeto. Entendemos um objeto do mundo real como algo concreto (ex:
um livro) ou como algo conceitual (ex: uma viagem). Definimos que um
objeto possui duas caractersticas: o seu estado e o seu comportamento. Portanto, podemos entender o objeto como qualquer entidade real
existente no nosso mundo.

26

Programao de Computadores II

Outro conceito importante classe, que consiste em um modelo para a fabricao dos objetos. Entenderemos a classe como
sendo uma abstrao do objeto, algo que define todas as caractersticas comuns a todos os objetos. Estas caractersticas podem ser
divididas em estado (que chamamos no momento da codificao de
atributos) e em comportamentos (chamados nos nossos cdigos de
mtodos). Quando um objeto criado, diz-se haver construdo
uma instncia de uma classe. Para que este processo acontea,
necessrio fazer uso do conceito de construtor (maneira de criar a
instncia), conceito que veremos mais adiante (no contedo 2.1).
Classes e objetos sero explorados de maneira mais aprofundada
no contedo seguinte.
Uma instanciao consiste em utilizar classes servindo como
modelos para que os objetos possam ser criados. Um objeto prdefinido passa a exisitr quando um programa executado, passando
a se chamar ento de instncia de classe.
Objetos trocam informaes entre eles atravs de mensagens,
esta a maneira como um objeto invoca um outro objeto ou ento
um mtodo de um outro objeto. Falaremos um pouco mais sobre o
conceito de mensagens no contedo 1.4 deste mesmo tema.
H trs tipos de comunicao entre os objetos, os quais so
brevemente comentados a seguir:
a) associao: so relacionamentos entre classes (ou entre objetos). H dois tipos: agregao e composio;
b) generalizao: tambm conhecida como herana (um dos
pilares da POO), ser brevemente comentada ainda neste
mesmo contedo, porm o conceito de herana ser bastante comentado no tema seguinte (contedo 2.3);
c) dependncia: uma alterao em um elemento altera
diretamente o seu dependente.
A utilizao de uma estrutura bem definida, arrumada em pastas ou pacotes (no ingls package), facilita bastante a organizao de
um sistema composto por um grande nmero de classes. Alm de

Tema 1

| Introduo orientao a objetos

27

uma organizao lgica, o uso de pacotes faz com que um conjunto


de classes relacionadas entre si fiquem agrupadas no mesmo diretrio, ou seja, tambm acaba propiciando uma organizao fsica. Falaremos mais sobre pacotes (packages) tambm no contedo seguinte.
Conceitos fundamentais
Iremos explorar mais profundamente nos contedos posteriores
os pilares da programao OO encapsulamento, herana e polimorfismo faremos, neste momento, uma breve apresentao sobre cada
um deles:
a) encapsulamento: a arte de ocultar uma informao (information hiding), escondendo o que no precisa ou no deve
ser visto; em outras palavras, consiste em controlar o acesso
aos detalhes de implementao de uma classe atravs do
uso de palavras reservadas (modificadores); como o usurio
no tem acesso implementao, esta pode ser alterada,
corrigida ou melhorada sem que ele tome conhecimento ou
mesmo tenha que fazer qualquer adaptao.
b) herana: comum termos mais de uma classe compartilhando estado e comportamentos de uma classe de referncia
(estas classes sero chamadas de super-classes enquanto
que as que herdam sero chamadas de sub-classes). O conceito de herana aproveita estas semelhanas para melhorar
o projeto (reduzindo a repetio de cdigo), criando superclasses que sero compostas justamente por estas similaridades, enquanto que as sub-classes tero como objetivo
refinar e ampliar as caractersticas e comportamentos da
classe superior. No h limites para nveis de herana, porm, especificamente na linguagem Java, h apenas a herana simples (uma sub-classe s pode herdar de uma nica super-classe), no havendo portanto a herana mltipla
(lembrando que este conceito existe em outras linguagens
orientadas a objetos). De maneira geral, pode ser dito que
a herana o conceito no qual uma sub-classe herda automaticamente todos os estados e comportamentos de uma
super-classe.

28

Programao de Computadores II

c) polimorfismo: como o nome sugere, significa vrias formas


diferentes para a mesma funcionalidade. Uma classe pode
possuir um mtodo com o mesmo nome (ex: ligar), mas
com diferentes assinaturas (quantidade e tipos de parmetros distintos) para diversos fins (ex: ligar o rdio; ligar o
carro). No ser preciso tomar conhecimento de todas as
implementaes deste mesmo mtodo, apenas deve ser suficiente escolher qual delas a mais apropriada para a sua
necessidade; este processo contribui para a simplificao
do desenvolvimento do software e facilita a reutilizao de
mtodos com os mesmos nomes.
Outro conceito que merece destaque o de interface. Um
grande motivo para a importncia do uso de interface o fato de
ela preencher a lacuna deixada pela ausncia da herana mltipla,
que, como foi falado anteriormente, no existe na linguagem Java.
Uma interface define um conjunto de funcionalidades que precisam
ser fornecidas por qualquer classe que venha a implementar esta
interface. H uma grande proximidade da interface com a classe
abstrata, sendo que uma interface abriga exclusivamente mtodos
abstratos. Voltaremos a falar sobre este assunto no tema 3 (contedos 3.2 e 3.3).
No podemos deixar de falar sobre o conceito de abstrao,
que consiste em impedir que o desenvolvedor conhea detalhes
da implementao de uma determinada funcionalidade. Com a utilizao da abstrao, permanece explcita apenas a assinatura do
mtodo, ficando oculto todo o cdigo. Ou seja, no precisa tornar
pblico como fazer, apenas o que se faz. O importante o que
um objeto e o que ele faz sem se preocupar em como a sua
implementao.

Tema 1

| Introduo orientao a objetos

29

INDICAO DE LEITURA COMPLEMENTAR


SINTES, A. Aprenda Programao Orientada a Objetos. So Paulo:
Pearson Education do Brasil, 2010.
A leitura da pgina 1 at a 16 muito interessante, pois faz uma importante introduo programao orientada a objetos.
CADENHEAD, R.; LEMAY, L. Aprenda em 21 dias Java 2. 4. ed. So
Paulo: Elsevier Editora Ltda, 2005.
Para revisar e aprimorar seus estudos neste assunto, sugerida uma
leitura nos captulos 5 e 6 (da pg. 73 a 106).

PARA REFLETIR
Reflita junto com seus colegas sobre a importncia dos conceitos
fundamentais da Orientao a Objetos, que so encapsulamento,
herana e polimorfismo.

1.3 Classes e Objetos


Classe
Uma classe pode ser entendida como um modelo, uma espcie
de forma (ou ainda de gabarito) para a definio de objetos. Quando
nos voltamos para o mundo dos softwares, usamos o conceito de
classes para agrupar estes objetos que possuem uma relao entre si
(caractersticas que os objetos tm em comum). A premissa da OO
trazer para o mundo dos softwares todos os objetos do mundo real.

30

Programao de Computadores II

Desta maneira, entendo que, de acordo com o nosso mundo real,


avies, navios, carros e motocicletas so classificados como meios de
transporte. Apesar de serem objetos de tamanhos, formas e valores
diferentes, eles possuem caractersticas comuns inerentes a todos os
meios de locomoo (quantidade de passageiros, tipo de combustvel
etc). Assim sendo, a meta passa a ser codificar os objetos do mundo
real acima citados em uma linguagem de programao.
Uma classe constri a especificao de todas as informaes
comuns a objetos da mesma espcie. Estas informaes so divididas em duas categorias: atributos e comportamentos.
Os atributos da classe so as caractersticas, tais como marca,
cor, velocidade. Podemos chamar de propriedades da classe o conjunto de todos os atributos. Vale ressaltar que cada atributo precisa
ser implementado com um nome e um tipo de dado correspondente.
Por sua vez, os comportamentos so aes que de maneira geral alteram os atributos. Por exemplo, os comportamentos acelerar e frear
que alteram o atributo velocidade; estes comportamentos so implementados atravs de mtodos (que podem ser funes ou procedimentos); cada mtodo implementado com uma assinatura (nome
do mtodo, tipo de retorno e lista de parmetros) e um conjunto de
instrues.
Objetos
Como no poderia deixar de ser, o conceito de objeto de
grande importncia para a Programao Orientada a Objetos. utilizado em praticamente todo processamento de uma aplicao. o
elemento utilizado para representar qualquer coisa, seja ela real (ex:
carro) ou mesmo abstrata (ex: viagem). Objetos so simplesmente
instncias de uma classe previamente definida.
A partir do momento que temos uma classe chamada Pessoa
com os atributos nome, idade e telefone, podemos criar uma instncia desta classe que representa um objeto real, ou seja, teremos
um objeto pessoa com o nome Joo, idade igual a 25 anos e com o
telefone 9876-1234.

Tema 1

| Introduo orientao a objetos

31

Uma aplicao orientada a objetos construda por vrios objetos que interagem entre si. Cada interao desta vista como uma
troca de mensagens, que ocorre atravs da chamada de mtodos
uns dos outros.
Para assimilar o conceito de classe e objetos, faa a seguinte
atividade, agrupar em classes os seguintes objetos: cachorro, notebook, navio, cavalo, bicicleta, impressora, pato, avio e celular.
Codificando
Toda classe deve comear com letra maiscula e deve ter o
nome igual ao do arquivo; se a classe for Pessoa, o arquivo tem que
ser obrigatoriamente Pessoa.java. Todo cdigo escrito na linguagem
Java fica dentro desta classe. A sintaxe da assinatura de uma classe
consiste em um modificador de acesso + palavra reservada class +
nome da classe, de acordo com o exemplo abaixo:
public class Pessoa {
. . .
}
Aps termos criado a classe Pessoa, podemos em qualquer
outra classe criar uma instncia de Pessoa, chamada pessoa X com
os valores citados anteriormente. Para tanto, utilizaremos a palavra
reservada new, de acordo com o cdigo abaixo:
Pessoa pessoaX = new Pessoa();
Da maneira acima, precisaremos atribuir as informaes reais
(Joo, 25 anos e o telefone 9876-1234) posteriormente. Ou podemos fazer da maneira a seguir:
Pessoa pessoaX = new Pessoa(Joao, 25, 98761234);
A diferena entre as duas construes acima apenas no construtor, ou seja, na forma que a instncia criada. Falaremos mais
sobre construtores no contedo 2.1.

32

Programao de Computadores II

Pacotes
O Kit do Desenvolvedor Java (JDK) contm um conjunto pr-definido de classes, todas estas classes juntas compem a API Java. Elas
so organizadas por afinidade em vrias pastas chamadas de pacotes.
Cada pacote agrupa classes que apresentam propsitos semelhantes,
como operaes matemticas, manipulaes de datas e textos, tratamento de arquivos etc. Outro motivo para a utilizao de pacotes
que assim fica possvel a existncia de classes com o mesmo nome,
desde que localizadas em pacotes diferentes. Isto possvel, uma vez
que quando se deseja referenciar uma classe, faz-se necessrio informar o nome completo da mesma, o que inclui o caminho inteiro do
pacote seguido pelo nome da prpria classe.
Mas claro que, alm de ter disposio uma enorme biblioteca de classes prontas para os mais variados fins, o prprio desenvolvedor est livre para crias as classes necessrias para a construo
do seu software, preocupando-se exclusivamente com as regras de
negcio prprias da sua aplicao. Neste momento, quando ns
desenvolvedores criamos nossos prprios sistemas computacionais,
precisamos criar vrias classes e ento podemos organiz-las tambm
em pastas, tambm chamadas de pacotes (ou packages).
Os pacotes servem para organizar tanto logicamente (por afinidade), como fisicamente (ficando nas mesmas pastas no sistema de
arquivos). Esta organizao melhora a estruturao da aplicao e
tambm otimiza o processo de publicao.
A maneira utilizada para informarmos o pacote ao qual uma
classe pertence identificando na primeira linha da classe a sua declarao de pacote, de acordo com a sintaxe a seguir:
Sintaxe:
package <nome da package>[.<nome da subpackage>];
Por exemplo, para a classe Funcionrio, podemos informar
que o pacote seria como indicado abaixo:
package br.com.empresa;

Tema 1

| Introduo orientao a objetos

33

Como falado anteriormente, esta classe deve estar localizada


fisicamente na pasta br/com/empresa, que fica na raiz do projeto.
Caso o pacote no seja citado no incio da classe, a mesma
deve estar localizada no raiz do projeto e diz-se que est no pacote
default; mas esta prtica no recomendada.
Sempre que precisarmos fazer uso de qualquer classe que faa
parte da API, devemos fazer uma referncia para a mesma com o nome
completo (pacote + nome). Isto pode ser feito de duas maneiras:
a) em toda ocorrncia da classe, a classe deve esta acionada
atravs do nome completo;
b) fazer uma nica referncia de importao no incio do arquivo (aps a declarao package, caso exista) utilizando a
sintaxe abaixo:
import <nome da package>[.<nome da subpackage>].<nome
da classe>;
Exemplo:
import java.util.Random;
Utilizando a segunda maneira (com a palavra reservada import), sempre que for preciso, a classe (ex: Random) pode ser referenciada sem o nome completo do pacote em toda parte do cdigo.
Estas mesmas regras se aplicam quando precisamos usar classes que ns criamos, caso no estejam evidentemente no mesmo
pacote (j que neste caso no se faz necessrio a referncia).
Exemplo:
import br.com.empresa.Funcionario;
Caso seja necessrio fazer referncia a vrias classes dentro de
um mesmo pacote, podemos utilizar uma espcie de coringa (*), o
qual referencia todas as classes naquele pacote especfico; isso evita
que seja feita a referncia individual para cada uma das classes que
se deseja utilizar.
Exemplo:
import br.com.empresa.*;

34

Programao de Computadores II

Em apenas um caso no necessrio fazer a importao, esta


exceo acontece quando a classe que se deseja utilizar est dentro do
pacote java.lang. As classes localizadas neste pacote so essenciais
linguagem de programao e, por este motivo, precisam estar sempre disponveis para uso; podemos entender a instruo import java.
lang.*; como sendo implcita para todas as classes.
Classes Wrappers
So classes Java que possuem os mesmos servios dos tipos
primitivos, porm com vrias outras funcionalidades acrescentadas.
Em ingls, wrap significa envolver, ento temos classes que envolvem as classes originais (que no caso so os tipos primitivos) e
oferecem novas funes.
Lembrando que os tipos primitivos em Java no so objetos
(todo o resto objeto), ento temos para cada um dos tipos primitivos, uma respectiva classe Wrapper, sendo esta um objeto. Existem
ento oito classes wrappers para os tipos primitivos e, entre as novas
funcionalidades, podemos destacar os mtodos de converso entre
tipos, mudana de bases decimais e outras operaes que so permitidas apenas a objetos (como por exemplo manipulaes com conjuntos). Isto se deve ao fato de tornar possvel o uso da super classe
Object implicitamente atravs das classes wrappers. Falaremos mais
sobre a classe Object no contedo 2.4.

Figura 06 - Os tipos primitivos e suas respectivas classes wrappers.

Tema 1

| Introduo orientao a objetos

35

Cada uma das classes wrappers acima fornece dois construtores


(formas para se criar uma instncia); na primeira forma, um String esperado um parmetro e na segunda forma esperado um tipo primitivo correspondente ao que est sendo envolvido. A exceo a classe
Character com apenas um construtor com um parmetro do tipo char.
Exemplos:
Integer valorA = new Interger(10);
Integer valorB = new Interger(10);
Entre os mtodos adicionais das classes wrappers falados anteriormente, podemos destacar os mais relevantes, que so:
a) valueOf ( ) : fornece mais outra maneira para a instanciao,
conforme exemplos abaixo;
Integer valorA = Interger.valueOf(11);
Integer valorB = Interger.valueOf(11);
Integer valorC

= Interger.valueOf(11, 2);

// o segundo parmetro indica que o valor est


// escrito na base 2; ou seja 11 na base 2 (igual a 3)
b) xxxValue ( ) : permite converter um objeto das classes wrappers numricas para qualquer tipo primitivo.
exemplos:
Integer valorA = new Interger(12);
int valorB
= valorA.intValue();
long valorC = valorA.longValue();
float valorD = valorA.floatValue();
c) parseXxx() : convertem String em um tipo primitivo numrico;
exemplos:
byte valorA
= Byte.parseByte(13);
double valorB = Double.parseDouble(13.4);

36

Programao de Computadores II

d) toString() : facilita a converso de um tipo primitivo qualquer


em String.
exemplos:
String strA = Interger.toString(14);
String strB = Float.toString(14.5);
A partir da verso Java 5, quando surgiu o conceito de autoboxing (ou boxing e unboxing), possvel manipular objetos das classes
wrappers como se fossem tipos primitivos.
Exemplos:
Integer valorA = 15;
valorA = 16;
int valorB = valorA;
valorA++;
Vamos observar agora as facilidades detectadas nas linhas acima em virtude do autoboxing. Na primeira linha, foi criado um objeto Integer sem utilizar o construtor com a palavra reservada new;
j nas linhas seguintes, o objeto valorA foi tratado como se fosse
realmente um tipo primitivo. importante destacar apenas que os
objetos das classes wrappers so imutveis, isto , ao alterar um valor, o autoboxing de maneira transparente cria um novo objeto com
o novo valor, descarta o anterior e a varivel de referncia (valorA
no nosso exemplo) assume este novo objeto.

INDICAO DE LEITURA COMPLEMENTAR


HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7.
ed., So Paulo: Alta Books, 2005.
Uma boa recomendao de leitura sobre este contedo o quarto captulo deste livro, da pgina 51 a 63, que orienta a utilizao de classes
predefinidas e ensina a criao e definio das suas prprias classes.

Tema 1

| Introduo orientao a objetos

37

BARNES, D., KOLLING M. Programao Orientada a Objetos com Java.


So Paulo: Makron Books, 2006.
No captulo 1, h uma interessante apresentao ao estudo de objetos
(criao e interao) e de classes das pginas 3 a 15.

PARA REFLETIR
Se os tipos primitivos foram construdos para oferecerem uma melhor
performance, qual a vantagem no uso das classes Wrappers (que
emulam os tipos primitivos)?
Neste momento, preciso que voc faa uma reflexo sobre a preocupao com o desempenho na tecnologia Java. Faa uma ponderao
sobre o fato dos tipos primitivos permanecerem presentes na especificao da linguagem Java e tambm sobre a existncia das classes
Wrappers (que emulam os tipos primitivos).

1.4 Atributos e Mtodos


Introduo
Antes de comearmos a falar sobre atributos e mtodos, devemos lembrar inicialmente do conceito de Classe. Conforme podemos
retirar da definio feita no contedo anterior, temos que uma classe
composta por duas partes: atributos e comportamentos. Comentaremos cada uma destas partes separadamente nos prximos pargrafos.
Atributos
Tambm chamados de membros de uma classe, os atributos
representam as caractersticas (propriedades) das classes. So eles

38

Programao de Computadores II

os responsveis pelo armazenamento da informao, mantendo as


particularidades de cada um dos objetos. Cada classe pode possuir
vrios atributos, cada um deles deve ser representado por um nome
(identificador). Alm disso, para cada um dos atributos, faz-se necessrio informar qual o tipo de dado desejado; podendo ser um tipo de dado
primitivo ou at mesmo algum outro objeto (a linguagem Java no permite a criao de um atributo sem que seja informado o tipo de dado).
Tomando como exemplo uma classe chamada Pessoa, podemos
assumir a existncia de vrios atributos, cada um deles representado
pelo seu tipo e seu identificador.
public class Pessoa {
// atributos
String nome;
int idade;
}
Mtodos
Lembrando que uma classe composta por atributos e por
comportamentos. A partir de agora passaremos a chamar estes comportamentos de mtodos. Um mtodo simplesmente um processo
que realiza uma ao, podendo em muitas vezes manipular o valor
de um ou mais atributos.
Alm de iniciar sempre com letra minscula, a recomendao
para a criao de um mtodo conter um verbo no infinitivo (terminao ar, er, ir, or), imediatamente seguido de um substantivo. Por
exemplo: calcularIdade(), imprimirDados().
Sintaxe da assinatura de um mtodo:
<modificador> <tipo de retorno> <nome> (<parmetros>)
Sendo que:
<modificador>: palavra reservada que determina o nvel de acesso
ao mtodo;
<tipo de retorno>: indica se haver ou no um tipo de retorno;
caso haja um retorno, ser informado o tipo de dado deste retorno;
<nome>: identificador do mtodo (seguir a recomendao acima);
<parmetros>: valores esperados pelo mtodo.

Tema 1

| Introduo orientao a objetos

39

Figura 07 - Objeto Pessoa.

Mensagens
Os objetos precisam se relacionar, precisam trocar informaes
para realizar tarefas, no fazem nada sozinhos. Para que esta comunicao ocorra, deve existir uma troca de mensagens. Estas mensagens
identificam as operaes que precisam ser executadas atravs de trs
componentes:
a) objeto para o qual a mensagem acionada;
b) mtodo dentro do objeto que ser executado;
c) parmetros necessrios para a execuo do mtodo.
Considerando um objeto Veculo, preciso que outro objeto
Motorista lhe envie uma mensagem, por exemplo, acionando o mtodo abrirPorta(), passando ainda um parmetro: qual porta deseja
abrir. H ainda uma grande vantagem na utilizao da troca de mensagens: uma vez que as interaes so feitas atravs destas mensagens, no necessrio que todos os objetos estejam dentro da
mesma aplicao, ou seja, possvel acionar mtodos de objetos que
esto at mesmo em outro servidor de aplicaes web.
Temos ento o entendimento que um programa OO consiste
simplesmente em um conjunto de objetos, sendo especificado em

40

Programao de Computadores II

cada um deles o que o mesmo capaz de fazer. No momento que


se desejar utilizar algum mtodo de qualquer objeto, basta que seja
enviada uma mensagem solicitando a sua execuo.

Figura 08 - Utilizando uma mensagem, o objeto Motorista acessa um mtodo do objeto Veculo.

Acessabilidade
Cada uma das linguagens de programao possui a sua prpria
lista de palavras reservadas para a definio do controle de acesso a variveis e mtodos, mas basicamente existem os seguintes nveis:
a) pblico: permite o acesso por todos os mtodos de todas
as classes, no havendo restries. Este o nvel mais liberado possvel, j seu uso em um atributo significa que no
est sendo utilizado o conceito de encapsulamento.
b) protegido: acesso permitido aos mtodos da prpria classe,
de outras classes do mesmo pacote e tambm por todas as
classes que herdam dela (o conceito de herana ser estudado no tema seguinte, mais precisamente no contedo 2.3).
c) privado: o acesso liberado apenas aos mtodos da prpria
classe. Este o nvel mais protegido possvel e os atributos
devem estar neste nvel de acesso de acordo com a teoria
do encapsulamento.

Tema 1

| Introduo orientao a objetos

41

Na linguagem Java, so utilizadas as seguintes palavras-chaves:


public, protected e private para definir os respectivos itens acima.
Porm, h ainda outro nvel de acesso: o default (ou packageprivate), que caracterizado justamente pela ausncia das palavras
reservadas acima citadas. O seu acesso permitido apenas para a
prpria classe e para as outras classes do mesmo pacote.

Figura 09 - Tabela de nveis de acesso.

Encapsulamento
De acordo com a teoria de orientao a objeto, encapsular significa ocultar, esconder informaes de um objeto. Consiste em construir
classes que no permitem o acesso direto aos seus atributos, estes no
podero ser lidos ou alterados por outras classes.
Como ento manipular tais informaes? A nica maneira para fazer isso utilizar mtodos da prpria classe construdos especificamente
para esta finalidade. Esses mtodos so divididos em dois tipos:
a) configurador: responsvel pela alterao dos dados, chamado
tambm de setter ou mutator, permite a atualizao do valor
de um atributo. A recomendao que o seu nome inicie com
o prefixo set e seja acompanhado do nome do atributo a ser
atualizado, ex: setNome( ).
b) capturador: mtodo que recupera a informao, tambm chamado de getter ou accessor, retorna o valor de um atributo. A recomendao que o seu nome comece pelo prefixo get e seja
acompanhado do nome do atributo solicitado, ex: getNome( );
Alm de esconder a complexidade do cdigo, o encapsulamento
tambm tem a funo de proteger os dados de classes externas,

42

Programao de Computadores II

evitando que os atributos recebam valores indevidos (tornando-os


inconsistentes), uma vez que tais atributos s podem ser acessados
pela sua prpria classe.
O uso de palavras-reservadas modificadoras de acesso permite
limitar o acesso s informaes de uma classe. Isso evita que os
seus dados se tornem inconsistentes ou at mesmo indevidos, garantindo consequentemente a confiabilidade destas informaes. Isso
acontece de fato, pois o acesso a um atributo atravs de um mtodo
permite que a informao que se pretende atribuir seja avaliada, verificando se realmente possvel executar tal atribuio. Para que
uma classe siga corretamente todas as orientaes da teoria do encapsulamento, todos os seus atributos devem ser privados (palavra
reservada private), tornando-os de acesso exclusivo da prpria classe
(nem uma eventual sub-classe pode ter acesso), e tambm fornecer
mtodos configuradores e capturadores para cada um destes atributos, sendo assim possvel a manipulao (leitura e gravao) de
todas as suas caractersticas.
public class Pessoa {
// atributos
private String nome;
private int idade;
// mtodos configuradores
public void setNome(String nome) {
this.nome = nome;
}
public void setIdade(int idade) {
this.idade = idade;
}
// mtodos capturadores
public String getNome() {
return this.nome;
}
public int getIdade() {
return this.idade;
}
}

Tema 1

| Introduo orientao a objetos

43

A palavra-chave this utilizada no exemplo acima serve para fazer referncia ao objeto atual, pode ser utilizada em qualquer ponto
do cdigo e pode acionar tanto os atributos como os mtodos. Em
alguns casos, o seu uso dispensvel, podendo ser usado apenas
como o reforo, como nos casos dos mtodos capturadores (exemplo: getNome), mas, mesmo assim, o seu uso recomendado por
simplesmente aumentar a legibilidade do cdigo. Entretanto, em outras situaes, a presena da palavra this imprescindvel, como nos
mtodos configuradores (exemplo: setNome), com o propsito de
se diferenciar o atributo do parmetro. Claro que este caso poderia
ser resolvido de outra forma, por exemplo, alterando-se o nome do
parmetro, porm o mais comum realmente a construo acima.
Existe ainda outra finalidade para a palavra this, ela pode ser usada
quando se deseja passar como parmetro o prprio objeto atual para
um mtodo qualquer.
Sobrecarga de Mtodos
A programao orientada a objetos permite a existncia de mtodos com o mesmo nome, mas com a lista de parmetros diferentes,
onde esta diferena pode acontecer tanto na quantidade dos argumentos como nos tipos dos mesmos. Esta situao conhecida
como sobrecarga (ou overload) de mtodos.
O uso deste mecanismo no cria um conflito, pois o compilador
ser capaz de entender qual mtodo est sendo acionado justamente
a partir da verificao da lista de parmetros.
Para que seja caracterizada uma sobrecarga de mtodos, os
seguintes fatos devem acontecer:
a) os mtodos em questo devem estar na mesma classe ou
em classes com relacionamento de herana;
b) os nomes dos mtodos devem ser o mesmo;
c) a quantidade de parmetros deve ser diferentes ou os tipos
destes mesmos parmetros.

44

Programao de Computadores II

No contedo 2.1 (j no prximo tema), veremos que os construtores de um objeto podem ser considerados com uma sobrecarga de
mtodos, apesar de alguns autores no considerarem os construtores
como sendo mtodos normais, mas esta uma discusso para o
prximo contedo.
Vejamos ento um exemplo de sobrecarga. A seguir, temos um
mtodo somarNumeros( ) com dois parmetros do tipo inteiro e um
retorno do tipo inteiro.
public int somarNumeros(int nA, int nB) {
return nA + nB;
}
Agora veremos o mesmo mtodo somarNumeros( ), s que com
dois parmetros do tipo real e um retorno tambm do tipo real.
public float somarNumeros(float nA, float nB) {
return nA + nB;
}
Quando formos invocar o mtodo somarNumeros( ), a implementao a ser acionada depender dos tipos de parmetros informados. Se forem passados dois inteiros, o primeiro cdigo ser executado, caso sejam passados dois valores reais, o segundo trecho vai
ser acionado.

INDICAO DE LEITURA COMPLEMENTAR


HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7.
ed., So Paulo: Alta Books, 2005.
Uma leitura recomendada sobre atributos e mtodos encontra-se nas
pginas 65 a 71 desta obra, que fala ainda faz uma importante abordagem sobre o conceito de mensagens.

Tema 1

| Introduo orientao a objetos

45

BARNES, D., KOLLING M. Programao Orientada a Objetos com Java.


So Paulo: Makron Books, 2006.
O captulo 2 imprescindvel para um maior aprofundamento tanto
no conceito de atributos como no de mtodos (inclusive abordando
sobrecarga de mtodos), esta recomendao de leitura acontece nas
pginas 27 a 40.

PARA REFLETIR
Convide os seus colegas para debaterem sobre o encapsulamento.
Analise alguns pontos como o acesso restrito empregado a toda informao, fazendo inclusive uma espcie de camada de proteo,
onde apenas os mtodos getters / setters so pblicos. Aproveite e
apresente tambm as suas reflexes para o tutor.

RESUMO
Voc est de parabns por ter concludo o nosso primeiro tema, no
qual fizemos uma introduo a orientao a objetos. No contedo
1.1, fizemos uma breve reviso da linguagem Java, com suas caractersticas (como portabilidade, robustez e segurana) e seus elementos
principais (entre eles as estruturas condicionais e as de controle).
O contedo 1.2 foi inteiramente dedicado aos conceitos bsicos da
orientao a objetos. Foi feita inicialmente uma breve histria do
surgimento do paradigma OO e depois foram introduzidos temas bsicos como objeto (que representa atravs de cdigo qualquer coisa
do mundo real) e classes (que so os moldes para a construo dos

46

Programao de Computadores II

objetos). Alm de uma apresentao de importantes conceitos: encapsulamento, herana e polimorfismo.


O contedo seguinte foi o responsvel por explorar profundamente
os temas objetos e classes, sendo mencionado a sua organizao em
pacotes (responsveis pela organizao fsica e lgica das classes),
explicando o funcionamento atravs de trechos de cdigos, alm de
abordarmos das classes Wrappers (que simulam os tipos primitivos).
E no ltimo contedo, 1.4, acabamos de explorar os atributos e mtodos de uma classe, sem deixar de citar os nveis de acesso (pblico,
protegido e privado), encapsulamento (proteo da informao) e
sobrecarga de mtodos.
Agora que fizemos este passeio introdutrio no mundo orientado
a objetos, chegou o momento do aperfeioamento, prepare-se para
uma tima leitura sobre herana na linguagem Java.

Herana

Nesta segunda parte do curso veremos o conceito de herana


do paradigma de orientao a objetos. A utilizao de herana possui
algumas particularidades que at ento no vimos em outras partes
do curso. Uma dessas particularidades a reutilizao de classes.
Aqui veremos o conceito do que uma herana, qual a diferena entre
membros de instncia e membros de classe, entre outros.

48

Programao de Computadores II

2.1 Construtores e o Gerenciamento da Memria


Os construtores so utilizados para realizar a inicializao do
objeto.
Todas as vezes que utilizamos a palavra reservada new, estamos criando na memria uma nova instncia do objeto. neste momento que os construtores das classes so executados.
Como j estamos acostumados a escrever mtodos, devemos
ter cuidado para no visualizar um construtor como um mtodo. Um
construtor no deve ser considerado um mtodo, isto porque o construtor s pode ser invocado quando o objeto est sendo criado,
diferentemente dos mtodos, que podem ser invocados a qualquer
momento.
Os construtores podem ser criados em qualquer regio da classe. Porm, obrigatoriamente o construtor deve possuir o mesmo nome
que o nome da classe. Por exemplo, se a classe possui o nome Carro,
o construtor deve-se chamar Carro. A sintaxe de um construtor deve
seguir a seguinte regra:
<modificador> <nome do construtor>( [<lista de parmetros>] ) {
[<implementao>];
}
Voc deve estar atento sintaxe apresentada. O modificador
indica o nvel de visibilidade que este construtor ir possuir, podendo
ser private, public ou protected. J o nome do construtor, como dito
anteriormente, deve ter o mesmo nome da classe que est sendo
criada. E por ltimo temos a lista de parmetros que pode ser opcional.
Existem algumas diferentes formas de utilizar os construtores.
A primeira forma a padro, onde nenhum argumento passado
como parmetro. Na linguagem Java, caso nenhum construtor seja
criado, automaticamente criado o construtor padro, sem nenhum
parmetro. O construtor padro indica que o objeto ser inicializado sem nenhum valor, ou seja, todos os atributos que o objeto
possui so inicializados com seus valores padres. Vamos analisar
a seguinte classe:

Tema 2 | Herana

49

public class Computador{


private String marca;
private int qtdMemoria;
private int qtdDisco;
}

Para esta situao, ao iniciarmos o objeto computador, atravs


do seu construtor padro, todas as variveis da classe sero iniciadas
com o valor padro. No caso da String o valor padro ser zero. J
para as variveis do tipo int, o valor padro ser zero. Vamos a um
exemplo de chamada a um construtor.
Computator computador = new Computador();

Neste momento estamos realizando a chamada ao construtor


padro criado pelo Java. Porm, podemos criar construtores padronizados de acordo com a nossa necessidade. Por exemplo, digamos
que todos os computadores quando criados, deve ser informada qual
sua marca. Nesta situao devemos criar um construtor que receba
como parmetro uma varivel do tipo String para que possamos iniciar o atributo marca que possumos. A partir deste momento nossa
classe vai possuir a seguinte configurao:
public class Computador{
private String marca;
private int qtdMemoria;
private int qtdDisco;
public Computador (String pMarca)
{
this.marca = pMarca;
}
}
Nesta situao, estamos passando um parmetro denominado
de pMarca. Este parmetro vai ser responsvel por iniciar um objeto
Computador com o atributo Marca j pr-definido. Automaticamente

50

Programao de Computadores II

quando criamos um construtor, o construtor padro que antes era


criado pelo Java, deixa de existir. Ento, a partir deste momento, toda
vez que formos iniciar um objeto atravs do seu construtor devemos
passar como parmetro deste novo construtor criado. A chamada ao
construtor agora ser feita da seguinte maneira:
Computador computador = new Computador(CCE);
Perceba que agora estamos passando a String CCE como parmetro do construtor. Isto indica que o atributo Marca, ao ser iniciado
automaticamente j vai ter o valor CCE. Este valor pode ou no ser
alterado. Isto vai depender se foi criado o mtodo set deste atributo.
Porm, isto no quer dizer que todas as vezes que formos criar
construtores devemos passar no mnimo um parmetro. Podemos
criar um construtor igual ao construtor padro que criado pelo Java.
Mas, para que vamos precisar criar um construtor sem parmetros?
Em algumas situaes precisamos criar o objeto com valores
predefinidos. Vamos imaginar a seguinte situao. No objeto computador, caso no seja informado, todos os computadores devem ter
como valores bsicos 512 de memria e 500 de disco. Ento poderamos criar um construtor com as seguintes caractersticas:
public class Computador{
private String marca;
private int qtdMemoria;
private int qtdDisco;
public Computador ()
{
this.qtdMemoria = 512;
this.qtdDisco = 500;
}
}
Nesta situao deveremos chamar o construtor da forma padro, deixando a responsabilidade de iniciar os valores do atributo
de acordo com o que foi definido.

Tema 2 | Herana

51

Computador computador = new Computador();


Quando formos usar este objeto computador que acabamos de
criar, os atributos qtdMemoria e qtdDisco j tero seus valores que foram
predefinidos, porm, nada impede que estes valores sejam modificados.
Podemos, tambm, dentro de uma nica classe, possuirmos mais
de um construtor. Isto indica que, dependendo da situao, podemos
inicializar o objeto de maneira diferente. Quando em uma classe tivermos mais de um construtor, o compilador vai conseguir identificar diferentes construtores de acordo com os parmetros que esto sendo
utilizados, seja pela quantidade de parmetros ou pelos tipos dos parmetros. Vamos analisar a nossa classe Computador. Vamos colocar
um construtor que no recebe nenhum parmetro e outro construtor
que recebe a marca do objeto computador que est sendo criado.
public class Computador{
private String marca;
private int qtdMemoria;
private int qtdDisco;
public Computador ()
{
this.qtdMemoria = 512;
this.qtdDisco = 500;
}
public Computador (String pMarca)
{
this.marca = pMarca;
}
}
Quando formos criar o objeto Computador poderemos chamar
qualquer um dos dois construtores. Por exemplo:
Computador computadorEscritorio = new Computador();
Computador compudatorSala = new Computador(HP);

52

Programao de Computadores II

Nesta situao temos dois objetos com valores de atributos


diferentes. O objeto computadorEscritorio no possui um valor especfico
para a marca, isto porque o construtor que foi utilizado foi o construtor
sem parmetros. Este construtor ir apenas alterar o valor dos atributos
qtdMemoria e qtdDisco. J o objeto computadorSala ter apenas o valor
da marca atribudo e seus outros dois parmetros com o valor padro, que
neste caso ser zero.
Apesar de os construtores no serem considerados mtodos,
podemos realizar a chamada de um construtor para outro, ou seja,
um construtor pode realizar apenas uma tarefa e realizar a chamada
a outro construtor j existente.
public class Computador{
private String marca;
private int qtdMemoria;
private int qtdDisco;
public Computador ()
{
this.qtdMemoria = 512;
this.qtdDisco = 500;
}
public Computador (String pMarca)
{
this.marca = pMarca;
this();
}
}
Nesta situao, podemos continuar utilizando os dois construtores. Porm, quando utilizarmos o construtor que possui um parmetro, automaticamente o construtor que no possui parmetros ser
invocado. Isto porque, a referncia this indica que estamos invocando
um construtor, neste caso sem parmetros.
Para esta construo de nossa classe, quando criarmos o objeto computador utilizando apenas o construtor que possui um parmetro, estaremos atribuindo todos os valores ao objeto, isto porque
um construtor realizou a chamada ao outro.

Tema 2 | Herana

53

Toda vez que estamos criando um objeto especfico, estamos


alocando espao em memria para armazenar as informaes dos
objetos criados. Com isso, em determinados momentos podemos
alocar espao de memria desnecessariamente. Para solucionar este
problema o Java possui ferramentas para realizar o gerenciamento de
memria.
A JVM (Java Virtual Machine) possui um mecanismo de coleta de
lixo (garbage collector). Esta coleta consiste em realizar a reciclagem
de memria no mais utilizada. Esta reciclagem realizada atravs de
um algoritmo especfico.
Este algoritmo realiza a busca de objetos que no podem ser
mais alcanados. O algoritmo executado sem que os programadores
percebam que ele est sendo executado. O tempo de execuo de
uma aplicao interferido diretamente pelo coletor de lixo. Isto porque o coletor precisa a todo o momento estar realizando a verificao
de objetos no mais utilizados.

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M.. Java Como Programar. 8. ed. So Paulo:
Pearson Education do Brasil, 2010.
Leia o captulo 3, pginas 68 e 69. No trecho deste livro podero ser
encontrados exemplos de diversas maneiras de se utilizar os construtores. O livro tambm demonstra, com figuras, como funciona o
gerenciamento de memria para as instncias das classes.
CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus, 2005.
No captulo 3 do livro podemos encontrar na pgina 39 a importncia do gerenciamento de memria quando estamos trabalhando com
Objetos. Na mesma pgina temos ainda uma explicao de como
funcionam os construtores dos objetos.

54

Programao de Computadores II

PARA REFLETIR
O gerenciamento de memria algo muito importante dentro do conceito de herana, j que podemos estar criando objetos sem a real
necessidade de utilizao. Discuta com seus colegas de turma como
devem ser criados objetos que realmente sejam necessrios, podendo
tambm discutir como o funcionamento do coletor automtico de
lixo (garbage collector).

2.2 Membros de Instncia X Membros de Classe


Os membros de instncia de uma classe so totalmente diferentes dos membros de uma classe.
Quando falamos de membros, estamos falando dos atributos e
mtodos que esta classe possui.
Vamos comear falando sobre os membros de uma instncia.
Os membros deste tipo s podem ser acessados atravs de uma instncia de uma determinada classe, ou seja, precisamos primeiro criar
um novo objeto da classe que queremos acessar os membros.
Todos os atributos e mtodos s podero ser acessados quando
estivermos trabalhando com um objeto em memria. importante verificar que quando a instncia de um objeto deixa de existir, automaticamente todos os seus mtodos e atributos tambm deixam de existir.
Vamos a um exemplo:

Tema 2 | Herana

55

public class Computador{


private int qtdMemoria;
private int qtdDisco;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
public void AdicionarMemoria(int pQntMemoria)
{
this.qtdMemoria = this.qtdMemoria + pQntMemoria;
}
}
Agora vamos criar um objeto do tipo Computador e vamos manipular os seus mtodos e seus atributos.
Computador computador = new Computador(512,500);
computador. AdicionarMemoria(512);
No exemplo acima, criamos um objeto computador. No momento de sua criao o computador foi criado com 512 de memria e 500
de disco rgido. Esses valores s sero vlidos para o objeto computador que foi criado. Quando adicionamos um valor memria do
computador, teremos o mesmo comportamento descrito. A adio de
memria ao computador s ser vlida para este objeto.
Quando criarmos um novo objeto, automaticamente os valores
que esto armazenados no objeto anterior deixam de existir e novos
valores so assumidos. Vamos a um exemplo:
Computador computadorSala = new Computador(1024,160);
Neste segundo caso, os valores que so atribudos ao computador so de 1024 de memria e de 160 de disco. Ou seja, dois valores
diferentes para duas instncias tambm diferentes.

56

Programao de Computadores II

Sendo assim, os membros de instncia, sejam os atributos ou


os mtodos, s vo existir quando houver um objeto instanciando
determinada classe, e automaticamente deixam de existir quando
estes objetos no estiverem mais em memria.
J os membros de classe possuem uma caracterstica bem diferente dos de instncia. Todos os membros de classe so tambm
conhecidos como membros estticos.
No Java os membros estticos so representados pela palavra
reservada static. atravs desta palavra reservada que indicamos
para o compilador que estamos criando um membro esttico.
Este tipo de membro nunca ir pertencer a uma instncia de
uma classe. Ele sempre estar ligado diretamente a uma classe.
Toda vez que criarmos uma classe, mesmo que ela no seja
instanciada, todos os membros estticos so os primeiros a serem
carregados. Vamos incluir, na classe de computador, um atributo esttico que vai representar um membro de classe para o computador.
public class Computador{
private int qtdMemoria;
private int qtdDisco;
private static int qtdComputadores;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
}
Podemos ver que agora existe um atributo esttico dentro da
classe, o atributo qtdComputadores. Este atributo vai pertencer a
toda a classe, no mais a alguma instncia especfica. Quando precisamos utilizar a varivel esttica, no precisamos mais declarar uma
varivel do tipo da classe nem criar um novo objeto. Basta apenas
chamar o atributo diretamente da classe. Por exemplo:
Computador.qtdComputadores++;

Tema 2 | Herana

57

No exemplo anterior, estamos apenas aumentando a quantidade de computadores. Se analisarmos a situao acima, podemos
perceber que, apesar de no termos nenhum objeto criado, podemos manipular a quantidade de computadores. Precisamos, ento, de
muita ateno quando formos utilizar este tipo de atributo.
Como o atributo estar presente durante todo o ciclo de vida
da classe, as variveis estticas tambm estaro presentes e mantendo o seu valor.
Assim como os atributos de uma classe, ns podemos ter os
mtodos estticos. Estes mtodos iro funcionar da mesma maneira
que os atributos, ou seja, vo existir sem a dependncia de uma
instncia de uma classe. Porm, importante lembrar que quando
temos um mtodo esttico no iremos sobrescrever este mtodo na
subclasse, iremos ver o conceito de subclasse no tpico de hierarquia. Caso, na subclasse, formos usar o mesmo mtodo esttico,
teremos que redefinir este mtodo.
Para utilizar um mtodo como esttico, precisamos colocar a
palavra reservada static logo aps o modificador de visibilidade. Por
exemplo, iremos colocar o mtodo esttico na classe computador.
public class Computador{
private int qtdMemoria;
private int qtdDisco;
private static int qtdComputadores;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
public static void Imprimir()
{
System.out.Println(Quantidade de computadores cadastrados: + qtdComputadores);
}
}

58

Programao de Computadores II

Da mesma maneira que os atributos de classe so utilizados


sem ser necessrio instanciar uma classe. Porm, importante observar que em mtodos estticos s podemos utilizar atributos tambm
estticos.
Isto faz sentido, j que os membros de instncia s existem
quando possumos uma instncia da classe em memria. Neste caso,
se usamos o mtodo imprimir diretamente da classe como no exemplo abaixo, poderamos tentar imprimir alguma varivel de uma instncia, sendo que esta instncia ainda no existe.
Computador computador = new Computador(512,160);
Computador.qtdComputadores++;
Computador.Imprimir( );
Da mesma maneira que no podemos utilizar os atributos no
estticos, ou seja, de instncia de uma classe, tambm no podemos
utilizar a palavra reserva this. Vale lembrar que esta palavra reservada
utilizada para fazer algum tipo de referncia a uma classe instanciada.
importante tambm perceber que, quando possuirmos uma
instncia de uma classe iremos conseguir utilizar os mtodos estticos.
Computador computador = new Computador(512,160);
computador.Imprimir();
Apesar deste tipo de chamada ser possvel, ou seja, no possuir
um erro de sintaxe, no devemos utiliz-lo. Isto porque se criamos um
mtodo ou atributo esttico ns devemos acess-lo de forma esttica.
Quando falamos de acessar de forma esttica estamos querendo dizer
em acess-lo diretamente atravs da classe e no de uma instncia.
Na linguagem Java ainda podemos criar um tipo de atributo
que depois de iniciado no pode ter seu valor alterado. Este tipo
de atributo pode ser tanto um membro de classe como um membro de instncia. Estes atributos so tambm conhecidos como
constantes. Este tipo de atributo vai ser representado atravs da
palavra reservada final.

Tema 2 | Herana

59

Vamos ao primeiro exemplo utilizando um membro de instncia.


Neste exemplo, a varivel ser inicializada no construtor do objeto.
public class Computador{
private static int qtdComputadores;
private final int qtdMaxComputadores;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMaxComputadores = 10
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
}
Neste exemplo, aps iniciado o objeto, a varivel qtdMaxComputadores ir ser inicializada com o valor 10 (dez) e no poder
ter seu valor alterado durante o ciclo de vida deste objeto. A inicializao do atributo deve, obrigatoriamente, ser realizada dentro do
construtor da classe. Para utilizarmos este atributo iremos primeiro
instanciar um objeto para depois utiliz-lo.
Computador computador = new Computador(512,160);
System.out.println(Quantidade mxima de computadores:, computador.qtdMaxComputadores);
Porm, ainda podemos criar os atributos estticos. Neste caso
o valor do atributo informado na sua declarao e no pode ter seu
valor alterado em nenhum mtodo da classe. Vamos a um exemplo.
public class Computador{
private static int qtdComputadores;
private static final int qtdMaxComputadores = 10;
public Computador (int pQtdMemoria, int pDisco)
{
this.qtdMemoria = pQtdMemoria;
this.qtdDisco = pDisco;
}
}

60

Programao de Computadores II

Neste exemplo, o valor do atributo qtdMaxComputadores j est


sendo inicializado com o valor 10 (dez) e em nenhum momento pode
ter seu valor alterado. Como todos os outros atributos de classe o atributo final esttico pode ser acessado diretamente da classe sem a necessidade de uma nova instncia. Vamos demonstrar com um exemplo:
System.out.println(Quantidade mxima de computadores:,
Computador.qtdMaxComputadores);
Neste exemplo estamos acessando diretamente o atributo qtdMaxComputadores da classe computador. Lembrando que esse valor
vai estar presente at o momento em que o coletor de lixo do Java
retire a classe da memria.
importante entender que no Java apenas os mtodos e os
atributos podem ser estticos. No possvel declarar uma classe
como esttica.

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M. Java Como Programar. 8. ed. So Paulo:
Pearson Education do Brasil, 2010.
Para aumentar seu conhecimento sobre os membros de classe e de
instncia, estude as pginas 262 e 263 do captulo 8.
Neste trecho do livro, Deitel apresenta as diferenas na utilizao dos
membros de instncia para os membros de classes. O trecho tambm
exemplifica as diferenas entre os dois tipos de membros.
CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus,
2005.
Os autores demonstram, no captulo 6, nas pginas 99 e 100, os conceitos de membros de classe. Na pgina 99 demonstrado um exemplo para que seja visto como devemos utilizar variveis de classe.

Tema 2 | Herana

61

PARA REFLETIR
A partir deste momento, comeamos a perceber que existem diferentes tipos de criao de variveis, sendo que estas vo depender de
como estamos as declarando. Devemos ento construir atributos de
classes e de instncia de acordo com a nossa necessidade, sempre
tomando cuidado na sua utilizao.

2.3 Herana no Java


Um dos principais objetivos do paradigma da Orientao a Objetos se refere reutilizao dos objetos. A herana um dos principais
conceitos de reutilizao. Com herana podemos criar subclasses que
herdem caractersticas e comportamento de superclasses.
Em determinadas situaes, precisamos criar objetos com algumas caractersticas especficas e com outras caractersticas comuns a
outros objetos. Vamos a um exemplo para demonstrar o que est sendo comentado. Por exemplo, digamos que ns possumos uma classe
Funcionrio, sendo que este funcionrio tem as seguinte caractersticas.
public class Funcionario{
private int idade;
private String nome;
public Funcionario(int pIdade, String pNome)
{
this.idade = pIdade;
this.nome = pNome;
}
public void imprimir() {
System.out.println(Funcionrio: + nome
+ + idade);
}
}

62

Programao de Computadores II

Vamos agora seguinte situao. A minha empresa tem em seu


quadro funcional vrios funcionrios, entre eles mdicos, enfermeiros
e engenheiros. Se analisarmos as informaes que precisamos armazenar dos funcionrios podemos perceber que alguns atributos sero
iguais para todos eles, independentemente da atividade que eles
realizam, sendo essas caractersticas (idade, nome). Porm, no caso
do mdico precisamos informar qual o numero do CRM (Conselho
Regional de Medicina), o do enfermeiro necessrio o nmero do COREN (Conselho Regional de Enfermagem) e o nmero do CREA (Conselho Regional de Engenharia, Arquitetura e Agronomia) do engenheiro.
Para informar todas estas caractersticas, seria necessrio que
crissemos um atributo para cada uma dessas novas informaes.
Porm, sempre teramos atributos desnecessrios, ou seja, quando
criamos um objeto mdico no vamos ter informaes de enfermeiros
e engenheiros.
Com o intuito de no acontecer este problema, o paradigma
orientado a objetos possui uma capacidade denominada de herana.
O conceito de herana est diretamente ligada ao conceito de
reutilizao. Ou seja, um objeto genrico pode ser utilizado por um
objeto mais especializado. Este, por vez, herda todas as caractersticas do objeto genrico e acrescenta mais atributos ou mtodos.
Na orientao a objetos a classe genrica conhecida como
superclasse e a classe especializada conhecida como subclasse. No
nosso exemplo, a classe Funcionrio considerada a superclasse, enquanto uma outra classe a ser criada, por exemplo, a classe Mdico,
ser considerada a subclasse.
Na herana, uma superclasse pode possuir vrias subclasses.
Porm, uma subclasse pode somente possuir uma superclasse. Na linguagem Java no permitido heranas mltiplas, ou seja, uma classe
herdar comportamentos de mais de uma classe. Para simular herana
mltipla podemos utilizar as interfaces. O conceito de interfaces ser
visto no prximo tema.
O conceito de herana ainda permite que uma subclasse seja
uma superclasse de uma terceira classe. Ou seja, podemos ter uma
herana de uma classe filha. Todos os mtodos e atributos que a
subclasse herda da superclasse tambm so herdados da superclasse
referente.

Tema 2 | Herana

63

No Java, para indicarmos que uma classe herda da outra usamos


a palavra reservada extends. Ou seja, uma classe estende o comportamento da outra. A sintaxe para que seja utilizada a herana a
seguinte:
<visibilidade> class <nome> extends <superclasse> {
// definio da classe
}
Vamos agora criar uma classe Mdico, que herda da classe
funcionrio.
public class Medico extends Funcionario{
private String CRM;
}
Na classe Medico ns teremos todos os atributos relativos ao
mdico juntamente com os atributos que j existem na classe Funcionario. Podemos ento dizer que a classe Medico uma especializao
da classe Funcionario, ou seja, Medico um Funcionario. Toda vez
que estivermos utilizando a herana vamos ter esta relao X um
Y. Para nosso exemplo, Mdico um Funcionrio.
Com isso todas as informaes (atributos e mtodos) que j
existiam no funcionrio podero ser utilizadas pela classe mdico.
Sendo assim, quando instanciarmos uma classe do tipo Medico, teremos uma classe com os atributos bsicos de um funcionrio com
adio do atributo CRM.
Para que a subclasse consiga utilizar todos os mtodos e atributos da superclasse, necessrio que os membros da superclasse
possuam modificadores de visibilidade que permitam a utilizao,
embora eles sejam herdados.
Por exemplo, a superclasse Funcionrio tem seus atributos como
private. Automaticamente a subclasse no ter acesso aos mtodos e
atributos. Isto faz sentido. Se as subclasses pudessem modificar os
atributos estaramos ferindo o princpio do encapsulamento.
Como as subclasses herdam o comportamento das superclasses,
todos os mtodos e atributos definidos na superclasse podero ser

64

Programao de Computadores II

utilizados na subclasse. A herana ainda permite que as subclasses


modifiquem o comportamento do que foi determinado na superclasse.
Atravs da herana podemos criar um mtodo com uma funcionalidade diferente da superclasse. Mesmo que este mtodo possua o
mesmo nome, tipo de retorno e lista de parmetros.
Quando isto acontece dizemos que o novo mtodo sobrescreve
(override) o mtodo da superclasse. Vamos demonstrar um exemplo
atravs da classe Medico. Iremos sobrescrever o mtodo imprimir
para que possa ser impresso o CRM do mdico.
public class Medico extends Funcionario{
private String CRM;
public void imprimir() {
System.out.println(Mdico: + nome + CRM:+
this.CRM);
}
}
Desta forma, o mtodo imprimir() ser invocado dependendo
de sua instncia. Ou seja, vai depender do objeto que esteja invocando o mtodo imprimir. Vamos demonstrar isto atravs de um
exemplo.
Funcionario e = new Funcionario(35,Joo);
e.imprimir(); //mtodo imprimir de Funcionario
Medico m = new Medico();
m.imprimir(); //mtodo imprimir de Mdico
Quando instanciamos a classe funcionrio o objeto que chama
o mtodo imprimir vai imprimir as informaes genricas do funcionrio. Quando criamos o objeto Medico, como esta classe herda de
Funcionario, mas sobrescreve o mtodo imprimir(), o que ser impresso ser as informaes do Medico, ignorando todas as definies do
mtodo imprimir() do Funcionario.
Porm, para realizar a sobrecarga dos mtodos herdados, algumas regras devem ser seguidas. Sendo elas:

Tema 2 | Herana

65

O tipo de retorno deve ser exatamente o mesmo;

A lista de parmetros deve ser igual;

O mtodo da subclasse no pode ser menos acessvel


que o mtodo da superclasse.

Quando falamos menos acessveis, estamos falando dos modificadores de visibilidade. Ou seja, caso a subclasse esteja herdando
de um mtodo public, o mtodo que est sobrescrevendo no pode
ser nem private nem protected.
A herana ainda permite que, alm de sobrescrever os mtodos, ns possamos nos referir a atributos e mtodos da superclasse.
Para realizar esta referncia, utilizamos a palavra reservada super.
Para realizar uma chamada a um mtodo da superclasse devemos
fazer o seguinte:
Super.mtodo( )
Vamos modificar a classe Medico para a utilizao da referncia super.
public class Medico extends Funcionario{
private String CRM;
public Medico (String pCRM, String pNome, int
pIdade)
{
this.CRM = pCRM;
super(pIdade, pNome);
}
public void imprimir() {
System.out.println(Mdico: + nome +
CRM:+ this.CRM);
}
}

66

Programao de Computadores II

No exemplo acima estamos utilizando o mtodo super para reaproveitar o que foi definido no construtor da classe Funcionario. Com
isso, no precisamos reescrever todas as definies do Medico. Basta
apenas definir o que foi acrescentado na herana e realizar a chamada
ao construtor que possui a mesma caracterstica.
A chamada ao mtodo continua sendo realizada da mesma maneira. Por exemplo, como agora definimos um construtor para a classe mdico, quando formos instanciar um objeto deste tipo faremos
da seguinte maneira:
Medico m = new Medico(3245, Pedro, 35);
m.imprimir();
No exemplo apresentado, o construtor da classe Medico ir definir o atributo CRM e ir invocar o construtor da classe Funcionrio
para que os outro dois atributos (nome e idade) sejam iniciados.
Apesar de opcional, podemos indicar ao compilador que estamos realizando uma sobrescrita de um mtodo. Atravs da diretiva
@Override ns conseguimos garantir, em tempo de compilao, que
o mtodo que estamos criando uma sobrescrita de um mtodo da
superclasse.
public class Medico extends Funcionario{
private String CRM;
public Medico (String pCRM, String pNome, int
pIdade)
{
this.CRM = pCRM;
super(pIdade, pNome);
}
@Override
public void imprimir() {
System.out.println(Mdico: + nome + CRM:+
this.CRM);
}
}

Tema 2 | Herana

67

Com a herana podemos ainda utilizar membros de instncias.


Este tipo de membro deve ser declarado na superclasse. Com isso
podemos garantir que, se o valor for alterado na superclasse, todas
as classes que herdam desta superclasse tambm herdam as caractersticas da superclasse.

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M.. Java Como Programar. 8. ed. So Paulo:
Pearson Education do Brasil, 2010.
Faa uma leitura no captulo 9, especialmente nas pginas 279 a 297,
onde podero ser encontrados vrios exemplos do conceito de herana.
Neste captulo do livro, Deitel apresenta, por meio de exemplos, a
hierarquia dos objetos do Java API. Alm de descrever boas prticas
de utilizao da coleo.
CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus,
2005.
No captulo 1, especialmente nas pginas 13 a 16, os autores demonstram como podemos utilizar, na Orientao a Objetos as heranas e heranas mltiplas, ou seja, como so realizadas as hierarquia de heranas.

PARA REFLETIR
Com a utilizao da herana podemos perceber que, quando utilizada
de maneira correta e bem modularizada, a herana nos traz uma produtividade maior. Isto porque podemos reutilizar bastante as classes
que j foram criadas anteriormente. Reflita com o tutor e com os seus
colegas sobre o assunto.

68

Programao de Computadores II

2.4 A classe Object


Depois de demonstrar como funciona a herana, vamos falar
um pouco sobre a classe Object. Esta classe faz parte do pacote java.
lang. Este o pacote bsico da linguagem Java e neste pacote que
esto contidas as classes String e System.
Se observarmos, nunca
precisamos importar este pacote, isto porque ele automaticamente
importado e o nico pacote que possui esta caracterstica.
A classe Object uma classe base, em que todas as outras classes herdam. No Java, em todas as classes que criamos, necessrio
que esta classe herde algum comportamento de outra classe. Ou seja,
para toda classe criada iremos ter uma superclasse.
Se no utilizarmos a herana explicta, ou seja, colocarmos a
palavra reservada extends, automaticamente o compilador Java ir
herdar todas as caractersticas da classe Object. Por exemplo:
public class Conta {
....
}
Para o compilador do Java, esta declarao da classe
Conta visto como:
public class Conta extends Object{
....
}
Esta caracterstica no apenas para as classes que so criadas.
Todos os tipos, includos os tipos genricos como int e double tambm
herdam da classe Object. Tipos derivados de tipos inteiros, por exemplo, vetores tambm possuem a mesma caracterstica de herana.
A utilizao do tipo Object nos traz alguns benefcios. Isso porque estamos tratando de um tipo genrico. Por exemplo, se estamos
utilizando um mtodo em que no sabemos qual ser o tipo de objeto que ser passado como parmetro, podemos utilizar um parmetro
do tipo Object. Isso vai ser possvel pelo fato de que todos os objetos
so heranas da classe Object. Vamos a um exemplo:

Tema 2 | Herana

69

public class Conta {


private int qtdTitulares;
private Object[] titularesConta = new Object[3];
public void AdicionarTitular(Object pTitular)
{
this. titularesConta [qtdTitulares] = pTitular;
qtdTitulares++;
}
}
No exemplo acima estamos criando uma classe Conta que pode
possuir no mximo trs titulares. Vale observar que o parmetro que
est sendo passado do tipo Object, ou seja, no existe um tipo
especfico. Isso pode ser til, no caso em que o titular de uma conta
pode ser um funcionrio ou uma pessoa.
Quando formos utilizar a classe conta teremos a seguinte implementao:
Conta conta = new Conta();
Pessoa pessoa = new Pessoa();
pessoa.setNome(Joo);
pessoa.setCPF(123123123);
Funcionario funcionrio = new Funcionario();
funcionario.setNome(Maria);
funcionrio.setPIS(12346343);
conta.AdicionarTitular(pessoa);
conta.AdicionarTitular(funcionario);
No exemplo visvel que estamos utilizando o mesmo mtodo
de adio para dois objetos de tipos diferentes. Mas, como nosso mtodo possui um parmetro genrico, um parmetro do tipo Object, isso
torna possvel. Porm, no podemos utilizar diretamente um item do
vetor de Object. Isto porque, apesar de genrico, o objeto no vai ter
nenhum mtodo do objeto que estamos realmente querendo acessar.
Por exemplo, se o objeto conta possui o mtodo getSaldo e tentarmos
fazer o seguinte

70

Programao de Computadores II

Object objetoConta = conta.titularesConta[0];


objetoConta.getSalto();
A linha que chama o mtodo getSaldo no ir compilar. Isto
porque o mtodo no existe na classe Object. Este mtodo pertence
apenas classe Conta. No prximo tema, polimorfismo, este tipo de
diferena ser demonstrada com mais detalhes.
Porm, como ns temos a certeza que o objeto do vetor na
posio zero do tipo Conta, ns podemos fazer uma converso de
tipo para que o compilador identifique que o tipo Object da posio
zero seja convertido para a classe Conta. Essa converso necessita
ser feita de forma explcita. Vamos a um exemplo.
Pessoa objetoConta = (Pessoa) conta.titularesConta[0];
objetoConta.getSalto();
A partir do momento em que colocamos a converso atravs do
(Conta), estamos informando para o compilador que o meu objeto da
posio zero um objeto do tipo Conta. Com isso conseguimos utilizar
normalmente todos os mtodos e atributos que a classe Conta possui.
Agora precisamos ter cuidado com este tipo de converso, pois,
se convertemos para um tipo diferente do objeto que realmente
uma instncia, teremos um erro em tempo de execuo. O compilador
no consegue identificar este tipo de erro no processo de compilao.
Para o mesmo exemplo acima vamos mudar o tipo da classe em que
est sendo realizada a converso.
Funcionario objetoConta = (Funcionario)Conta.titularesConta[0];
objetoConta.getSalto();
Nesta situao, continuamos tendo um objeto Pessoa na posio zero do vetor. Porm, estamos informando ao compilador que
este objeto do tipo Funcionrio. Com isso quando formos tentar
utilizar o objetoConta em tempo de execuo iremos nos deparar com
erros. Isto porque o objeto que realmente est na posio zero um
objeto do tipo Pessoa.

Tema 2 | Herana

71

A classe Object possui dois mtodos que so bastante utilizados,


sendo eles: equals e toString. Vamos falar um pouco de cada um
deles.
O mtodo equals o responsvel por verificar algum tipo de
igualdade entre os objetos. Para os tipos primitivos, ns realizamos
a comparao atravs do operador ==. Com ele conseguimos
analisar se o valor de uma varivel possui o mesmo valor que est
armazenado em outra varivel. Porm, se formos comparar objetos?
Estaremos comparando as suas referncias? Vamos comear com um
exemplo.
Aluno aluno_a = new aluno(roberto, 7.0);
Aluno aluno_b = new aluno(maria, 5.0);
Aluno aluno_c = new aluno(roberto, 7.0);
aluno_a == aluno_b falso
aluno_b == aluno_c falso
aluno_a == aluno_c falso
Possumos trs instncias diferentes da classe Aluno. Porm, os
valores contidos nos objetos aluno_a e aluno_c e porque os objetos
so diferentes? So diferentes porque as suas instncias so diferentes. Como devemos ento comparar os objetos? Por meio do mtodo
equals( ) da classe Object. A princpio o mtodo object trabalha exatamente igual ao operador (==). Ou seja, ele retorna true se e somente
se x e y se referem ao mesmo objeto.
Porm, este mtodo pode ser reescrito e ensinado a comparar
dois objetos.

72

Programao de Computadores II

public class Conta {


private int qtdTitulares;
private int codTitular;
public boolean equals(Object object)
{
Conta conta = (Conta) object;
if (conta.codTitular == this.codTitular)
{
return true;
}
else
{
return false;
}
}
}
No exemplo, criamos uma lgica para o mtodo equals em que,
para verificar se dois objetos so iguais, verificamos se o cdigo do
titular o mesmo. Algumas regras para a sobrecarga do mtodo devem ser respeitadas. Para referncias no nulas:

reflexivo: a.equals(a) tem sempre que ser verdadeiro, ou


seja, um objeto sempre igual a si mesmo.

simtrico: a.equals(b) retorna verdade se e somente se


b.equals(a).

transitivo: a, b e c, se a.equals(b) e b.equals(c) so verdade ento a.equals(c) tem que ser verdade.

consistente: para mltiplas invocaes de a.equals(b)


ter sempre que retornar true ou sempre retornar false, enquanto informaes usadas na comparao do equals no
sejam alteradas.

Tema 2 | Herana

73

O resultado de equals() entre um objeto e nulo deve retornar sempre falso, ou seja, a.equals(null) sempre falso.

J o mtodo toString utilizado para retornar a representao


string do objeto.
O toString() da classe Object retorna um string com o nome da
classe + @ + representao hexadecimal sem sinal do cdigo hash
do objeto. Por exemplo:
Conta conta = new Conta();
System.out.println(conta.toString());
//Valor retornado
aluno@457321245
Com isso interessante que sempre que precisarmos utilizar o
mtodo toString() que seja feita a reescrita deste mtodo para que
ele retorne alguma informao que podemos mostrar como final.
public class Conta {
private int qtdTitulares;
private int codTitular;
public boolean toString(Object object)
{
System.out.println(O titular da conta
possui o cdigo: + this.codTitular;
}
}
Com isso, automaticamente quando utilizarmos o mtodo
toString( ), teremos como resultado final o que ficou definido dentro
da reescrita do mtodo.

74

Programao de Computadores II

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M.. Java Como Programar. 8. ed. So Paulo:
Pearson Education do Brasil, 2010.
Uma maneira de aprofundar sobre a classe Object pode ser encontrada nas pginas 298 e 299 do captulo 8.
Neste captulo a definio da classe Object demonstrada pelo autor
com alguns exemplos de como podemos utilizar esta classe. Tambm
so demonstrados os principais mtodos da classe.
HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7.
ed. So Paulo: Alta Books, 2005.
Uma produtiva leitura pode ser feita nas pginas 95 a 101, onde podem ser encontradas mais informaes sobre os principais mtodos
da Super Classe Object como equals (responsvel por testes de igualdade), hasCode e toString.

PARA REFLETIR
Na orientao a objetos sempre utilizamos tipos criados por ns.
Porm, nunca tnhamos parado para pensar que o Java j possua um
objeto genrico para todas as nossas classes. Com este tpico podemos perceber que podemos comparar objetos atravs de reescrita
de mtodos.

Tema 2 | Herana

75

RESUMO
No captulo 2.1, podemos aprender como so criados os construtores
de um objeto. Atravs da criao destes construtores podemos ver
que, ao criar um objeto, podemos j cri-los com seus atributos j
definidos. Neste captulo tambm aprendemos que o Java possui um
gerenciador de memria, sendo que este o responsvel por descartar objetos que no esto sendo mais utilizados.
Enquanto, no captulo 2.2, ns estudamos a diferena entre os membros de instncia e os membros de classe. Vimos que a principal
diferena que os mtodos de um membro de instncia s podem
ser utilizados quando tivermos uma instncia da classes enquanto os
membros de classe podem ser utilizados a qualquer momento.
J no captulo 2.3, ns aprendemos o conceito de herana. Atravs
deste conceito podemos perceber que com a reutilizao do cdigo
fica mais fcil, j que podemos criar objetos com caractersticas semelhantes a objetos j criados, sendo que sempre podemos reaproveitar
mtodos e atributos j criados.
Por fim, no captulo 2.4, aprendemos que todos os objetos criados e
os objetos existente no Java so uma herana da classe Object. Vimos
que esta classe responsvel por alguns mtodos que todos os outros objetos possuem, como o toString() e o equals( ).

ASPECTOS AVANADOS DA
PROGRAMAO ORIENTADA
A OBJETOS EM JAVA
Parte 2

Polimorfismo

J estamos no nosso terceiro tema e o momento de fazermos


um estudo sobre o conceito de polimorfismo. Inicialmente faremos
um aprofundamento terico sempre com exemplos comentados.
Veremos na sequncia a importncia das palavras abstract e final
na linguagem Java. Tambm, neste tema, falaremos sobre o importante conceito de interfaces, com suas definies e implementaes
e, no ltimo contedo deste tema, ainda iremos comentar sobre algumas
interfaces especiais.

80

Programao de Computadores II

3.1 Do Conceito Prtica


Introduo
Polimorfismo uma palavra de origem grega que quer dizer
vrias formas. Isto , mais de uma maneira de fazermos a mesma
coisa. Como estamos falando de uma linguagem de programao,
temos que, o que pode ser feito de diferentes maneiras, concentra-se
especificamente em um ponto, em como fazemos as chamadas aos
mtodos. Podemos definir ento o polimorfismo como um mecanismo que permite que duas ou mais classes derivadas de uma mesma
classe ancestral possuam mtodos com a mesma assinatura, porm
com comportamentos distintos, havendo uma especificidade para
cada classe derivada. Esta importante caracterstica presente nas
linguagens OO permite que uma mesma mensagem enviada a um
objeto tenha comportamento distinto, variando de acordo com o tipo
de objeto instanciado.
Aperfeioando nossos conhecimentos de herana (que foi assunto do contedo 2.3), percebemos que um objeto de qualquer
subclasse pode ser manipulado como sendo um objeto da sua superclasse. Este comportamento faz com que objetos sejam tratados de
forma genrica, mas para isto acontecer, deve haver uma hierarquia
de classes. Existe tambm uma operao conhecida como typecast,
que consiste em realizar uma converso explicita de um objeto de
uma classe para outra. Para isto, basta colocar entre parnteses e
antes do objeto o tipo da classe a ser convertido, como no exemplo:
(ClasseDestino) meuObjeto;
Faz-se necessrio que as classes origem e destino da converso
tenham uma relao de herana. Devemos lembrar que o typecast
de uma subclasse para uma superclasse implcito e automtico,
ficando transparente para o desenvolvedor, enquanto o inverso no
garantido, sendo para isso necessrio o typecast explcito.
Funcionamento
Como vimos, o polimorfismo consiste em vrias maneiras de
se fazer a mesma coisa, ento podemos entender que temos a possibilidade de escrever um mtodo de mesmo nome com diferentes
assinaturas. Isto faz com que, dependendo das circunstncias, este

Tema 3

| Polimorfismo

81

mesmo mtodo possa ter comportamentos diferentes. Quem decide


qual comportamento o mais adequado para a situao o objeto
que possui o mtodo acionado. O que acabamos de falar muito
importante para o entendimento do conceito de polimorfismo e, se
ainda no est seguro se entendeu bem a frase anterior, recomendvel uma releitura acompanhada de uma reflexo.
Temos ento que a deciso sobre a escolha de qual mtodo
ser selecionado ocorrer de acordo com o tipo do objeto. Como esta
deciso acontecer apenas em tempo de execuo, ocasionando um
vnculo posterior, este procedimento passa a ser chamado de ligao
tardia (late binding ou dynamic binding).
Vejamos a seguinte situao: um determinado objeto Pessoa
aciona um mtodo abastecer() de um outro objeto Veiculo; este
objeto o responsvel por decidir como ser a implementao do
mtodo abastecer(). Analisando mais profundamente, quem vai decidir qual implementao ser escolhida o tipo do objeto Veiculo.
Em outras palavras, se o Veculo um Carro, vai ser de uma maneira;
se for uma Lancha, vai ser de outra; se for uma Motocicleta, ser de
uma terceira maneira e assim por diante. Podemos constatar esta
forma de tratamento polimrfico de maneira exemplificada. Vejamos
o trecho de cdigo abaixo:
Veiculo meuVeiculo;
if (...) {
meuVeiculo = new Carro();
} else {
meuVeiculo = new Lancha();
}
meuVeiculo.abastecer(); //mtodo polimrfico

Neste momento, vlido lembrarmos a frase que mereceu ateno poucos pargrafos atrs: quem decide qual comportamento
o mais adequado para a situao o objeto que possui o mtodo
acionado. Para comprovar a veracidade desta afirmao, podemos
constatar que foi o objeto Veiculo quem decidiu qual mtodo foi acionado. Isto aconteceu de acordo com o seu tipo, que poderia ser Carro,
Lancha ou qualquer outra classe desde que herdasse de Veiculo.

82

Programao de Computadores II

Apesar de entendermos que, dependendo da circunstncia, o


objeto chamado vai agir de uma maneira ou de outra, vale ressaltar
que o objeto acionado no se modifica nem se transforma. O que
acontece que, em tempo de execuo, o compilador Java vai identificar qual classe de fato ser chamada, mas todas as classes com
seus mtodos j foram previamente criadas. Como no exemplo acima, apesar da varivel meuVeiculo ser do tipo Veiculo, a instanciao
de verdade ser de Carro ou de Lancha.
No momento que uma mensagem enviada para um objeto de
uma subclasse, os seguintes passos so executados:
- a subclasse acionada verifica se possui um mtodo com aquele
nome e com a mesma quantidade e tipos de parmetros;
- caso realmente possua, este mesmo mtodo executado;
- caso contrrio, a mensagem enviada para a classe imediatamente superior no nvel hierrquico;
- percorrendo toda a hierarquia, chegando at a classe Object,
e no sendo encontrado um mtodo que atenda as condies
necessrias, acontece neste momento um erro de execuo.
Vamos analisar detalhadamente um modelo simples contendo
as seguintes classes a seguir:
- uma classe Funcionario que contem um mtodo calcularSalario( ),
como esta classe no capaz de fato de calcular o salrio, ela
retorna o valor zero;
public class Funcionario {
public double calcularSalario() {
return 0;
}
}

Tema 3

| Polimorfismo

- uma classe FuncionarioHorista herda de


Funcionario, apresenta os atributos salarioHora e horasTrabalhadas e ainda um mtodo
calcularSalario( );
public class FuncionarioHorista
extends Funcionario {
private double salarioHora;
private int horasTrabalhadas;
public double calcularSalario() {
return (salarioHora *
horasTrabalhadas);
}
}

- uma classe FuncionarioMensalista que tambm herda de Funcionario e contm o atributo salarioMensal e o mtodo calcularSalario( ).
public class FuncionarioMensalista
extends Funcionario {
private double salarioMensal;
public double calcularSalario()
{
return salarioMensal;
}
}

O modelo descrito acima ilustra como a empresa categoriza os seus funcionrios. Independentemente do tipo, todo funcionrio deve ser capaz
de calcular o seu prprio salrio.
Caso seja um horista, o salrio ser a multiplicao do atributo salarioHora pelo atributo horasTrabalhadas, o que acontece no trecho de cdigo na
prxima pgina.

83

84

Programao de Computadores II

Funcionario funcH = new FuncionarioHorista();


System.out.println(funcH.calcularSalario());

J se o funcionrio for um mensalista, o salrio ser o prprio


atributo salarioMensal, que impresso no trecho abaixo.
Funcionario funcH = new FuncionarioMensalista();
funcH.calcularSalario();

Entendendo o polimorfismo como um conceito amplo, podemos


aceitar que uma sobrecarga (overload) de mtodos (assunto que j foi
brevemente comentado no contedo 1.4) possa tambm ser considerada como um tipo de polimorfismo.
Na sobrecarga de mtodos temos a possibilidade de escrever
vrias assinaturas diferentes, desde que o nome do mtodo permanea sempre o mesmo. A diferena nas assinaturas ser responsabilidade ento da lista de parmetros e do tipo de retorno. Esta aplicao
no cria uma situao de conflitos entre os mtodos uma vez que o
compilador ir analisar a lista de argumentos e descobrir qual mtodo
ser o escolhido.
Qualquer alterao na lista dos argumentos de entrada, seja
na quantidade ou nos tipos, implica automaticamente em uma nova
assinatura. Exemplificando: podemos ter uma assinatura com dois
parmetros do tipo inteiro, outra com trs parmetros inteiros, outra
ainda com dois parmetros reais e assim por diante.
possvel fazer, em assinaturas distintas, alguma alterao no tipo
de retorno, por exemplo, quando so dois parmetros de entrada do tipo
inteiro, o parmetro de sada pode ser do tipo inteiro, quando forem dois
parmetros de entrada do tipo real, o parmetro de sada pode ser do
tipo real. Porm, no possvel fazer uma alterao exclusivamente no
tipo de retorno, isto , no podem existir duas assinaturas que sejam
diferenciadas pelo tipo do parmetro de retorno, mantendo a quantidade
e tipo de parmetros de entrada exatamente iguais.
A seguir, alguns exemplos de sobrecarga de mtodos, onde
apesar do nome do mtodo ser o mesmo (maiorValor), a lista de
argumentos diferente (no primeiro exemplo so dois inteiros e no
segundo so dois reais):

Tema 3

| Polimorfismo

85

public int maiorValor(int nA, int nB) {


int maior = nA;
if (nB > maior) {
maior = nB;
}
return maior;
}
public float maiorValor(float nA, float nB) {
float maior = nA;
if (nB > maior) {
maior = nB;
}
return maior;
}

Outra aplicao possvel e bastante utilizada a sobrecarga de


construtores. Para uma determinada classe, podemos disponibilizar
vrios construtores, cada um deles com a sua lista de parmetros
correspondente. Claro que, neste caso, no se aplica falar em tipo
de retorno, pois como vimos no contedo 2.1, um construtor no tem
parmetro de retorno.
Quando se aplica sobrecarga em um construtor, o objetivo
oferecer uma variedade de opes no momento da criao da instncia de uma classe. possvel criar um construtor sem parmetro,
com alguns ou at mesmo todos os parmetros, onde cada parmetro
representa um atributo da classe.
Vejamos algumas possibilidades de construtores para uma determinada classe Aluno, onde a diferenciao acontece, como foi dito,
na lista de parmetros:
public Aluno()
{ ... }
public Aluno(int
{ ... }
public Aluno(int
{ ... }
public Aluno(int
int
{ ... }

matricula)
matricula, String nome)
matricula, String nome,
codigoCurso)

86

Programao de Computadores II

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M. Java Como Programar. 8. ed., So Paulo:
Pearson Education do Brasil 2010.
Uma tima leitura para aprimorar o seu conhecimento em polimorfismo pode ser encontrada nas pginas 304 a 308 (captulo 10), onde
mostrado o mecanismo e as principais vantagens no uso do polimorfismo.
SINTES, A.. Aprenda Programao Orientada a Objetos. So Paulo:
Pearson Education do Brasil, 2010.
Leitura recomendada da pgina 121 a 144 para sedimentar o que foi
lido sobre polimorfismo neste contedo, desde as principais tcnicas
de uso, benefcios e aplicaes nos construtores e nos mtodos gerais.

PARA REFLETIR
Neste momento de reflexo, realize um debate com seus colegas
sobre a importncia de dois conceitos: a sobrecarga de mtodos
(overload) e sobreposio de mtodos (overriding), analisando os
benefcios de cada um e as suas aplicaes prticas.

Tema 3

| Polimorfismo

87

3.2 Abstract X Final


Introduo
Neste contedo, sero abordadas duas palavras reservadas da
linguagem Java com importante papel para a boa utilizao da programao OO. No primeiro momento falaremos da palavra abstract e
em seguida ser a vez da palavra final.
Modificador Abstract
A palavra reservada abstract pode ser utilizada tanto para modificar a caracterstica de um mtodo como de uma classe. Tornar
uma classe abstrata (ou um mtodo abstrato) significa omitir uma
determinada implementao, deixando a preocupao do desenvolvedor concentrada, neste momento, apenas na estruturao da classe. Neste momento, o importante saber o que a classe (ou mtodo)
faz e no como isso ser feito, em outras palavras, servir como uma
criao de modelo a ser seguido. A implementao propriamente dita
ocorrer apenas em um momento posterior (nas subclasses).
Mtodo abstrato
A linguagem Java permite que haja um mtodo com sua assinatura bem definida, contudo sem uma implementao presente. Um
mtodo dito abstrato possui todas as caractersticas de um mtodo
normal: nome do mtodo, parmetros de entrada e tipo de retorno
normalmente como qualquer outro mtodo, mas no h nenhuma
linha de cdigo dentro deste mtodo. Sequer pode haver o par {
e }, logo aps a assinatura deste mtodo, deve haver um ; que
encerra o mtodo.
Vejamos um exemplo da construo de um mtodo abstrato:
public abstract void alterarSalario(float valor);

Percebemos que a assinatura do mtodo acima recebe um novo


modificador: a palavra reservada abstract; notamos tambm que ao
final da assinatura, observamos que no h implementao, imediatamente aps a assinatura necessrio concluir o sinal ;.

88

Programao de Computadores II

A implementao deste mtodo s ir acontecer nas subclasses


que herdaro da classe onde este mtodo se encontra. Qualquer
classe que contenha no mnimo um mtodo abstrato passa a ser
considerada uma classe abstrata.
No pode existir um mtodo abstrato privado (com o uso das
palavras reservadas private e abstract), pois, como vimos, o mtodo
abstrato precisa ser implementado pela subclasse. Como um mtodo
privado no acessado pela subclasse, esta situao, portanto, no
poderia ser resolvida.
O objetivo da existncia de um mtodo abstrato dentro de uma
classe justamente torn-la tambm abstrata. Veremos na sequncia
o papel de uma classe abstrata.
Classe abstrata
Uma classe abstrata pode ser entendida como se fosse uma
classe incompleta e por este motivo no pode ser plenamente utilizada. Quando falamos que ele incompleto, isso se deve ao fato desta
classe conter pelo menos um mtodo incompleto (veremos que este
mtodo incompleto ser um mtodo abstrato). J quando falamos
que esta classe ainda no est pronta para uso, queremos dizer que
ela nunca pode ser instanciada. Lembre-se que possvel compilar
normalmente uma classe abstrata, a nica ressalva realmente no
poder criar uma instncia a partir dela. Caso voc tente instanciar
uma classe abstrata qualquer (por exemplo Funcionario) , ir receber
uma mensagem de erro do compilador Java em ingls semelhante
frase abaixo:
Funcionario is abstract; cannot be instantiated

O objetivo de uma classe abstrata criar atributos e mtodos


comuns a todas as suas subclasses, mas com a garantia de que s
poder haver instncias a partir das prprias subclasses, nunca a
partir da superclasse abstrata; sua nica razo para existir ser
estendida (herdada) por outras classes.
Uma premissa essencial para uma classe abstrata a presena
de algum mtodo abstrato, ou seja, toda classe abstrata deve conter
pelo menos um mtodo abstrato, caso contrrio, ela no ser

Tema 3

| Polimorfismo

89

abstrata. No h problema em conter mtodos no-abstratos, o que


no pode acontecer que eles sejam a totalidade.
Vejamos a seguir um exemplo de uma classe abstrata:
public abstract class Funcionario {
// atributos
private int cdigo;
private String nome;
private String cargo;
private float salario;
// mtodos
public int getCodigo() {
...
}
public void setCodigo(int codigo) {
...
}
// demais mtodos no abstratos
public abstract void alterarSalario
(float valor);
}

No exemplo acima, destacamos a presena do mtodo abstrato


alterarSalario( ). Se ele no estivesse presente na classe Funcionario,
ou ainda se tal mtodo no fosse abstrato, a classe no poderia ser
abstrata, pois no haveria outro mtodo abstrato que garantisse a
classe como abstrata.
Quando uma subclasse herda de uma superclasse sendo esta
abstrata, todos os mtodos no abstratos j estaro automaticamente presentes na subclasse e disponveis para serem acionados. Entretanto, precisamos analisar o caso do mtodo abstrato no
momento da herana. O que acontece que o mtodo abstrato
tambm ser herdado (continua sendo abstrato). Neste momento,
precisamos tomar uma deciso: a primeira opo no fazer nada
referente ao mtodo, desta maneira a presena de um mtodo abstrato implica em indicarmos a classe tambm como abstrata, o que
impede de criarmos instncias tambm a partir desta subclasse (o

90

Programao de Computadores II

mesmo que aconteceu na superclasse abstrata); apenas as classes


que, por sua vez, herdassem desta poderiam ter instncias criadas
(desde que no tomassem a mesma atitude que a primeira subclasse
tomou). A segunda opo consiste basicamente em fazermos uma
redefinio (overriding) do mtodo abstrato herdado, o objetivo desta redefinio nada mais que apenas repetir a assinatura completa
do mtodo, mas desta vez retirando a palavra reservada abstract e
tambm o ; no final da instruo e, alm disso, agora sendo implementado de fato (com as suas devidas instrues) o mesmo mtodo.
Abaixo segue um exemplo de como seria a implementao do
mtodo abstrato alterarSalario() em uma subclasse.
public void alterarSalario (float valor) {
this.setSalario(valor);
}

Caso uma classe qualquer contenha exclusivamente mtodos


abstratos, ela passa a ser chamada de classe abstrata pura (veremos
no contedo seguinte o conceito de interface e faremos uma comparao com o conceito de classe abstrata pura).
Modificador Final
A palavra reservada final utilizada tanto para modificar o comportamento de uma varivel, de um mtodo, de uma classe ou de
uma interface.
Varivel final
Uma varivel final s pode ter o seu valor atribudo uma nica
vez. Uma vez recebido o seu valor inicial, tal valor no pode mais
ser alterado. Esta caracterstica acaba transformando funcionalmente
tal varivel em uma constante. Inclusive uma varivel com o modificador final, quando do tipo primitivo ou ainda do tipo String,
formalmente chamada de varivel constante. Acontece um erro de
compilao ao tentar alterar o valor de uma varivel final.
Conforme exemplo abaixo, a palavra reservada final deve preceder o tipo e nome da varivel.
final int limiteSuperior = 100;

Tema 3

| Polimorfismo

91

possvel no atribuir nenhum valor a uma varivel final no


momento da declarao, desta maneira, possvel a qualquer momento posterior do cdigo realizar uma atribuio a tal varivel. Neste
caso, no h problema, pois fica evidente que esta seria a primeira
operao de atribuio. Mas aps este ponto, nenhuma alterao
pode ser realizada. Resumindo: a primeira atribuio a uma varivel final pode acontecer a qualquer momento (no obrigatrio que seja no
instante da declarao), entretanto uma troca de valor no permitida.
Quando se trata de um atributo de uma classe utilizando o modificador final, temos duas possibilidades para realizar a atribuio
(que, claro, s pode ocorrer uma nica vez). Ou a atribuio de valor
ocorre no prprio instante da declarao do atributo (ex: private
final int valor = 100;); ou, caso no seja escolhida a opo
anterior, fica sendo estritamente obrigatrio proceder atribuio em
todos os construtores existentes na classe. Neste ltimo caso, o atributo conhecido como blank final. Caso no seja utilizada nenhuma
das duas opes (nem atribuir o valor do atributo na inicializao
nem nos construtores), acontece um erro em tempo de compilao.
Mtodo final
Um mtodo que utiliza a palavra reservada final faz com que
este no possa ser redefinido nas subclasses que herdam da superclasse a qual este mtodo pertence. O seu propsito prevenir comportamentos inesperados de uma subclasse alterando um mtodo
que pode ser de uma importncia fundamental para o funcionamento
e/ou consistncia da classe. gerado um erro de compilao quando
se tenta redefinir um mtodo final.
No caso dos construtores de uma classe, como eles nunca so
herdados, no faz sentido pensar um utilizar o modificador final neles.
Na sequncia, veremos um exemplo de um mtodo com o modificador final.
public final void aumentarLimite(int valor) {
this.limite = this.limite + valor;
}

92

Programao de Computadores II

Classe final
Uma classe final no pode ser herdada por nenhuma outra
classe. Um motivo para isso garantir uma maior segurana para a
classe e incrementar a sua eficincia. Quando se utiliza o modificador
final em uma classe, entende-se que ela est totalmente completa e
no necessrio (sequer possvel) haver subclasses herdando de uma
classe final. gerado um erro de compilao caso, em qualquer classe, seja usada a palavra reservada extends seguida do nome de uma
classe que seja final.
Outra situao em que tambm acontece erro de compilao
quando uma classe declarada ao mesmo tempo como sendo
abstrata e final. Neste caso, haveria uma contradio, o modificador
abstract estaria indicando que esta classe no est completa (que
existiria um mtodo abstrato e que este mtodo precisaria ser implementado pela sua subclasse); enquanto que a presena concomitante
do modificador final estaria informando exatamente o contrrio, que
a classe agora estaria completa e no poderia haver nenhuma subclasse herdando dela. Por isso, acontece o erro em tempo de compilao, para que seja evitada uma situao de conflito impossvel de
ser resolvida.
Quando uma classe definida como final, todos os mtodos
contidos so implicitamente final. Isso implica que nenhum mtodo
pertencente a esta classe final possa ser redefinido. O que parece
ser condizente, afinal de contas a prpria classe no pode mesmo ser
herdada por nenhuma outra classe, ento no haveria condies de
fato de nenhum mtodo ser mesmo redefinido em subclasses.
Muitas classes da prpria API Java so final, como java.lang.
String e java.lang.System. A seguir, veremos um simples exemplo de
uma classe final.
public final class Jogo(String[] args) {
// atributos
...
// mtodos
...
}

Tema 3

| Polimorfismo

93

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M. Java Como Programar. 8. ed., So Paulo:
Pearson Education do Brasil, 2010.
Para aprender um pouco mais sobre este conceito (abstract e final),
voc pode ler as pginas 309 a 329 do captulo 10. Neste captulo,
feita uma interessante abordagem sobre as aplicaes das palavras
reservadas abstract e final nas variveis, mtodos e classes.
MENDES, D. R. Programao Java com nfase em Orientao a Objetos.
So Paulo: Novatec Editora Ltda, 2009.
O captulo 5 deste livro faz uma interessante citao sobre os modificadores abstract e final. A leitura deve se concentrar no captulo 5
nas pginas 196 a 213, onde o autor detalha classes e mtodos abstratos, alm das classes, mtodos e atributos com o uso da palavra
reservada final.

PARA REFLETIR
A partir do momento em que informarmos que uma determinada
classe abstrata (precedendo com a palavra reservada abstract), faa
uma reflexo sobre o motivo de no podermos mais obter instncias
a partir dela, at que faamos as devidas implementaes dos mtodos abstratos.

94

Programao de Computadores II

3.3 Interfaces
Definio
Antes de comearmos a falar de Interfaces, devemos relembrar
algumas informaes a respeito de classes abstratas. J sabemos
que uma classe abstrata no pode ser instanciada, ou seja, no se
pode construir objetos a partir da sua definio. Devemos lembrar
tambm o conceito de mtodo abstrato (aquele que no possui implementao) e que uma classe abstrata deve possuir ao menos um
mtodo abstrato.
Desta forma, estamos prontos para entender o conceito de Interface. Inicialmente podemos fazer uma aproximao de interface com
uma classe abstrata pura. Lembrando que para ser pura, uma classe
abstrata precisa possuir exclusivamente mtodos abstratos, ou seja,
no possui nenhum mtodo implementado. Uma caracterstica importante de uma interface exatamente esta, nenhum mtodo implementado, todos os mtodos tm obrigatoriamente que ser abstratos.
O papel da interface simplesmente descrever o que outras
classes devem fazer, porm no especificam como elas devem fazer.
Temos ento somente as assinaturas dos mtodos (nome, parmetros e tipo de retorno), sem nenhuma implementao. Como todos
os mtodos so abstratos, podemos tornar implcitas as palavras
modificadoras public e abstract, simplesmente para evitar a repetio (a presena destas palavras no implica em erro, apenas geram
redundncia).
Interfaces servem como especificaes de padres de comportamentos para as classes. A sua utilizao permite um projeto de
software mais bem elaborado, contendo funcionalidades mais organizadas.
Pode haver atributos na interface, porm estes seriam (tambm implicitamente) public, static e final (tornando-os constantes).
Repete-se a informao anterior, ou seja, a presena destas palavras
perfeitamente dispensvel, porm no ocasionam nenhum tipo de
erro. O que no pode acontecer o uso da palavra-chave final em
um mtodo, pois isto impediria que ele fosse implementado pela
classe que a implementa. Entenderemos melhor esta situao aps
a leitura da seo Implementao a seguir.

Tema 3

| Polimorfismo

95

Implementao
Quando tnhamos uma classe (seja ela abstrata ou no), falvamos em herana (utilizando a palavra-chave extends), agora com
interface passaremos a falar em implementao e usaremos para isso
outra palavra-chave implements. Quando dizemos que uma classe
implementa uma interface, garantimos que as funcionalidades determinadas pela interface estaro presentes na classe. Podemos entender que uma interface uma espcie de contrato a ser seguido pelas
classes que a implementam.
A sintaxe de uma interface a seguinte:
[visibilidade] interface nome_Da_Interface
[extends Outras_Interfaces] {
// declarao de constantes
// assinatura dos mtodos abstratos
}
Vamos analisar algumas caractersticas de um cdigo de uma
interface:
- ao invs da palavra class, notamos a presena da palavra
interface;
- no h construtor (afinal no se pode criar uma instncia a
partir dela mesmo);
- os mtodos possuem apenas a assinatura (no pode haver
{ e } ).
Antes vejamos como seria um cdigo de uma classe abstrata pura.
public abstract class Transporte {
public abstract void acelerar();
public abstract void frear();
public abstract double getVelocidade();
}

96

Programao de Computadores II

Agora temos finalmente um cdigo exemplificando uma interface.


public interface Transporte {
void acelerar();
void frear();
double getVelocidade();
}

Como foi visto no contedo 2.3, no existe herana mltipla


na linguagem Java, porm, vale ressaltar que este conceito existe
em outras linguagens orientadas a objeto, portanto, faz parte do
universo OO. Como Java faz para resolver situaes que necessitam
de herana mltipla? A resposta justamente Interface. Uma classe qualquer s pode herdar exclusivamente de apenas outra classe,
nunca herda de duas ou mais (o que representaria herana mltipla).
Porm, quando falamos de interface, uma classe pode implementar
quantas interfaces precisar, no h limite para isso. Alm disso, uma
mesma classe pode herdar de uma outra classe e, ao mesmo tempo,
implementar uma ou vrias interfaces.
Podemos destacar, ento, como sendo uma das principais caractersticas da interface o fornecimento de mecanismo a ser utilizado
quando seria preciso usar a herana mltipla. Entre as aplicaes,
recomenda-se o uso de interfaces quando for preciso determinar mtodos que uma ou mais classes devem assumir a obrigao de implement-los; constri-se apenas o comportamento (assinaturas dos
mtodos) para que cada uma das classes implemente de acordo com
as suas especificidades. Este tipo de implementao acaba aproximando classes que possuem algum tipo de similaridade, porm
interessante notar que no criado um vnculo forte como acontece
na herana.
No h nenhum problema em uma classe qualquer implementar
mais de uma interface, mesmo no caso de elas definirem mtodos com
a mesma assinatura. Neste caso, bastaria que o mtodo fosse implementado na classe apenas uma nica vez, de modo que as interfaces
teriam o mtodo repetido sendo implementado no mesmo momento.

Tema 3

| Polimorfismo

97

Quando uma classe implementa uma interface, esta classe precisa codificar os mtodos abstratos originados a partir da interface.
Mas possvel acontecer o seguinte fato: a classe no codificar um ou
mais mtodos abstratos. Deste modo, teramos uma classe contendo
um mtodo abstrato, consequentemente esta seria considerada uma
classe abstrata. Afinal de contas, para que isso no acontecesse,
todos os mtodos abstratos presentes na interface deveriam sofrer
sobreposio (overriding) na classe que faz a implementao.
Uma constatao a ser feita que uma interface pode herdar de
outras interfaces, o que faz com que ela receba todos os mtodos
abstratos de todas as outras interfaces que ela herda, porm uma
interface no pode implementar outra interface, afinal ela no teria
capacidade de implementar os mtodos abstratos.
Uma interessante comparao conceitual de uma interface
com um controle remoto. Ele contm botes que representam de uma
maneira simplificada as operaes que o usurio deseja fazer, no
interessando a maneira como feita um aumento de volume, ligar/
desligar, tocar, parar, o que importa o que a funo faz e no
como ela faz.
Faamos agora um rpido resumo destacando as principais diferenas entre uma classe abstrata (assunto do contedo anterior) e
uma interface.
Classe abstrata
- uma classe s pode herdar de outra classe;
- geralmente se encontra mtodos implementados (no abstrato);
- agrupa objetos com implementaes compartilhadas;
- define novas classes atravs de herana (simples) de cdigo.
Interface
- uma classe pode implementar vrias interfaces;
- no pode haver mtodo implementado (todos tm que ser
abstratos);
- agrupa objetos com implementaes diferentes;
- define novas interfaces atravs de herana (simulando herana
mltipla).

98

Programao de Computadores II

Vejamos a seguir uma imagem de uma classe Quadrado que


herda de FiguraGeometrica e, ao mesmo tempo, implementa a interface
Imprmivel.

Figura 10 - Uma subclasse herdando da superclasse e implementando uma interface.

A aplicao ilustrada na imagem acima ser codificada a seguir,


inicialmente veremos o cdigo da classe abstrata pura:
public abstract class FiguraGeometrica {
public abstract int calcularArea();
public abstract int calcularPerimetro();
}
E agora uma interface:
interface Imprimivel {
void imprimir();
}

Tema 3

| Polimorfismo

99

Por fim, veremos agora uma classe que herda da classe Figura
Geometrica e ao mesmo tempo implementa a interface Imprmivel
acima:
public class Quadrado extends FiguraGeometrica
implements Imprimivel {
// atributo lado
private int lado;
// construtor padro
public Quadrado() {
this.setLado(0);
}
// construtor especfico
public Quadrado(int lado) {
this.lado = lado;
}
// mtodos get e set
public int getLado() {
return this.lado;
}
public void setLado(int lado) {
this.lado = lado;
}
// mtodo que calcula a rea
public int calcularArea() {
return this.getLado() * this.getLado();
}
// mtodo que calcula o permetro
public int calcularPerimetro() {
return 4 * this.getLado();
}
// mtodo que imprime o atributo lado,
// a rea e o permetro
public void imprimir() {
System.out.println(Quadrado);
System.out.println(Lado:+
this.getLado());
System.out.println(rea: +
this.calcularArea());
System.out.println(Permetro: +
this.calcularPerimetro());
}
}

100

Programao de Computadores II

Neste modelo simples visto acima, percebemos a aplicao dos


conceitos aprendidos anteriormente:
- a classe abstrata pura FiguraGeometrica (justamente por ser
pura!) no possui nenhum mtodo implementado, ou seja,
possui apenas mtodos abstratos;
- na interface Imprimivel consta exclusivamente mtodos abstratos;
- a classe Quadrado herda de outra classe (FiguraGeometrica) e
simultaneamente implementa uma interface (Imprimivel), para
que ela possa ser instanciada, todos os mtodos abstratos
herdados (tanto da classe abstrata como da interface) tiveram
que ser obrigatoriamente implementados, caso contrrio, ela
teria que permanecer como sendo uma classe abstrata.
Esta situao (uso da interface) permitiu que fosse possvel
contornar a ausncia da herana mltipla na linguagem Java, uma vez
que se obtm funcionalidades previamente determinadas em mais
de um local.
Aps todas as explicaes acima, podemos chegar a algumas
concluses a respeito do uso de interfaces:
- evita um acoplamento quase sempre desnecessrio, permitindo que classes distintas que implementem uma mesma interface, no precisem compartilhar uma hierarquia;
- torna os testes unitrios mais fceis;
- facilita a reutilizao de cdigo;
- propiciar uma alta escalabilidade no projeto;
- melhora a qualidade do cdigo e torna a aplicao mais verstil;
- faz com que a diviso das tarefas entre os desenvolvedores
de um projeto seja simplificada, havendo uma forte integrao, desde que cada um respeite os contratos especificados
pelas interfaces.

Tema 3

| Polimorfismo

101

INDICAO DE LEITURA COMPLEMENTAR


HORSTMANN, C.S.; CORNELL, G. Core Java 2. Vol 1 - Fundamentos. 7.
ed., So Paulo: Alta Books, 2005.
Uma rpida, porm importante, leitura pode ser feita nas pginas 121
a 125 do captulo 6 que de suma importncia para ampliar os seus
conhecimentos sobre interfaces e suas caractersticas, alm de uma
interessante e esclarecedora comparao com classes abstratas.
BARNES, D.; KOLLING M. Programao Orientada a Objetos com Java.
So Paulo: Makron Books, 2006.
No captulo 10, feita uma interessante abordagem sobre o conceito
de Interfaces com seus tipos, especificaes e exemplos nas pginas
271 a 276, propiciando ao leitor outro ponto de vista sobre o tema,
o que ir contribuir para a sedimentao dos seus conhecimentos.

PARA REFLETIR
Uma importante reflexo deve ser feita neste momento. Faa uma
ponderao sobre a ausncia do conceito de Herana Mltipla (que
no existe na linguagem Java, mas existe em outras linguagens de
programao orientada a objetos); perceba que a ausncia pode ser
totalmente suprida com o conceito de Interface.

102

Programao de Computadores II

3.4 Interfaces Especiais


Introduo
Aps aprendermos o importante conceito de Interface no contedo anterior, veremos neste ltimo contedo do tema 3 de forma
detalhada algumas das interfaces especiais mais importantes, so
elas: Cloneable, Comparable, Iterator e Iterable.
Cloneable
Existe um mtodo definido na classe Object chamado clone().
Este mtodo cria uma cpia do objeto a partir do qual ele chamado. Mas no toda classe que pode acionar tal mtodo, apenas as
classes que implementarem a interface Cloneable.
A interface Cloneable no define nenhum mtodo. Ela usada
apenas para indicar que a classe permite ser clonada. Caso seja
chamado o mtodo clone() em uma classe que no implementa a
interface Cloneable, ser lanada uma exceo do tipo CloneNotSupportedException.
A implementao do mtodo clone() consiste basicamente em
acionar o mtodo clone() da superclasse, conforme exemplo abaixo:
public Object clone() {
try {
// chamado o mtodo clone() de Object
return super.clone();
} catch(CloneNotSupportedException e) {
System.out.println(Problema +
na clonagem);
return null;
}
}

Para acionar o clone() da superclasse preciso uma tratamento


de exceo (comandos try e catch). Veremos este assunto no contedo
seguinte.
Quando uma classe contm apenas tipos primitivos na sua lista
de atributos, uma clonagem gera de fato outra classe totalmente

Tema 3

| Polimorfismo

103

independente da original. Porm, quando a classe possui ao menos


um atributo do tipo objeto (vamos chamar este atributo de atribObj),
a operao de clonagem pode trazer efeitos indesejados. O motivo
desta advertncia que a classe clonada ir possuir o atributo citado
(atribObj) como uma referncia ao mesmo objeto da classe original.
Caso a classe clonada altere o contedo deste atributo atribObj, a
classe original tambm ter esta mesma informao alterada. Este
comportamento no o esperado quando se faz uma clonagem. Justamente para evitar estes problemas, o mtodo clone() protegido
(protected) na classe Object. Isso faz com que seja necessrio chamar o mtodo de dentro da prpria classe que implementa Cloneable
ou, o mais comum, nesta mesma classe, fazer uma sobreposio do
mtodo clone() tornando-o pblico.
Vimos ento que o mtodo clone() cria uma cpia superficial
de um outro objeto, visto que os atributos do tipo objeto no so
clonados de fato (continuam apontando para o mesmo objeto
da classe original). Caso seja necessria uma cpia completa,
o desenvolvedor passa a ser encarregado de implementar o seu
prprio mtodo clone().
Vejamos um exemplo de uma classe que implementa a interface
Cloneable.
public class Aluno implements Cloneable {
// atributos
private String nome;
private float media;
// construtores ...
// mtodos getters e setters ...
public Object clone() {
try {
// chamado o mtodo clone() de Object
return super.clone();
} catch(CloneNotSupportedException e) {
System.out.println(Problema +
na clonagem);
return null;
}
}
}

104

Programao de Computadores II

Notamos que o mtodo clone() foi sobreposto, passando a ser


pblico. Neste mtodo, houve uma chamada ao mtodo clone() da
superclasse Object.
Agora vamos fazer uma clonagem de uma instncia de Aluno.
Precisamos atentar ao fato que no mtodo clone() sobreposto acima
o retorno do tipo Object, portanto ao ser acionado na instruo
abaixo, foi preciso fazer uma converso explcita.
// criando uma instncia aluno1
Aluno aluno1 = new Aluno(Joao, 7);
// clonando a aluno1 em aluno2
Aluno aluno2 = (Aluno) aluno1.clone();

Se formos imprimir os valores do aluno1, teremos os seguintes


dados: Joao 7.0
Imprimindo os valores da instncia aluno2, veremos exatamente
as mesmas informaes: Joao 7.0
Mesmo fazendo qualquer alterao (seja no atributo nome ou
na mdia) na instncia aluno1, os valores de aluno2 permanecem
intactos.
Comparable
Para compararmos tipos primitivos podemos usar o operador
==, mas no podemos fazer o mesmo procedimento para compararmos objetos. Como fazer para comparar duas instncias do objeto
Aluno? Como definir o critrio de ordenao escolhido para decidir
que um aluno vem antes do outro? Algumas tarefas precisam ser feitas, principalmente decidir qual atributo ser a referncia para comparao, se ser o nome, a idade, a mdia ou qualquer outro atributo.
Quando uma determinada instncia de um objeto qualquer precisar ser comparada com outra instncia deste mesmo objeto, faz-se
necessrio que este objeto implemente a interface Comparable.
Desta maneira, a primeira coisa que precisamos fazer informar que a classe (que desejamos fazer comparao) implementa a
interface Comparable. Segue o cdigo da interface Comparable que
precisar ser implementada pelas classes.

Tema 3

| Polimorfismo

105

public interface Comparable {


int compareTo(Object obj);
}
Percebemos que esta interface tem apenas um mtodo que precisa ser implementado pelas classes. Este mtodo recebe outro objeto do mesmo tipo do objeto a ser comparado. Em outras palavras,
quando a chamada x.compareTo(y) feita, o retorno deste mtodo
um inteiro assim determinado:

igual a zero, se x for igual a y;


valor negativo, se x for menor que y;
valor positivo, se x for maior que y.

Vale ressaltar que o valor positivo no precisa ser necessariamente +1, pode ser realmente qualquer valor maior que zero e o
mesmo se aplica para o valor negativo.
Na classe Aluno descrita abaixo (com enfoque dado apenas
ao mtodo compareTo()), veremos que as instncias de Aluno sero
ordenadas da menor para a maior idade, pois o mtodo compareTo()
foi construdo para este propsito.
public class Aluno
implements Comparable<Object> {
// atributos
private String nome;
private int idade;
// construtores ...
// mtodos getters e setters ...
public int compareTo (Object o) {

Aluno e = (Aluno) o;
return this.getIdade() - e.getIdade();
}
}

106

Programao de Computadores II

J na classe Aluno2, acontece uma pequena troca dos operadores no mtodo compareTo(), que passa a retornar a diferena da
idade do parmetro menos a idade do prprio objeto. Esta alterao
implica em instncias ordenadas da maior para a menor idade.
public class Aluno2
implements Comparable<Object> {
// atributos
private String nome;
private int idade;
// construtores ...
// mtodos getters e setters ...
public int compareTo (Object o) {
Aluno e = (Aluno) o;
return e.getIdade() - this.getIdade();
}
}

A classe Aluno3 abaixo faz um compareTo() que por sua vez


aciona o mesmo compareTo() da classe String, j que o objetivo agora
colocar as instncias em ordem alfabtica.
public class Aluno3
implements Comparable<Object> {
// atributos
private String nome;
private int idade;
// construtores ...
// mtodos getters e setters ...
public int compareTo (Object o) {
Aluno e = (Aluno) o;
return this.getNome().compareTo(e.getNome());
}
}

Notamos que o mtodo compareTo() da classe Aluno3 acima


aciona por sua vez o mtodo compareTo() da classe String, j que o

Tema 3

| Polimorfismo

propsito ordenar alfabeticamente pelo atributo


nome. No precisamos nos preocupar em como fazer esta ordenao, podemos deixar a responsabilidade para a classe String, que por sua vez tambm
implementa a interface Comparable.
Precisamos ter cuidado com o mtodo compareTo() quando o atributo a ser analisado for do
tipo real. Quando assim for, no podemos fazer o
retorno ser a simples diferena entre os atributos,
uma vez que a diferena pode ser to pequena que
ocorra um arredondamento para zero, que seria entendido como se as instncias fossem iguais.
Iterator
A interface Iterator (java.util.Iterator) pode ser
entendida como um facilitador para que se possa
percorrer os elementos de uma coleo (conjunto
de elementos), como um cursor que pode ser utilizado para navegao entre estes elementos, sem
que seja necessrio conhecer a estrutura interna
desta coleo.
Esta interface possui os seguintes mtodos:
next( ), hasNext( ) e remove( ), conforme o seguinte
cdigo:
public interface Iterator {
Object next();
boolean hasNext();
void remove();
}
Um breve comentrio sobre cada um dos mtodos vistos acima:
- next( ): retorna o prximo elemento na iterao. Caso no haja, lana uma exceo;
- hasNext( ): retorna um boolean indicando se
existe ou no mais elementos na iterao,

107

108

Programao de Computadores II

com base na posio corrente do cursor; serve para evitar


que seja chamado o mtodo next() sem que se tenha certeza
da existncia de um prximo elemento;
- remove( ): exclui da coleo o ltimo elemento retornado pelo
iterator.
Iterable
A interface Iterable (java.lang.Iterable) foi adicionada na verso
Java 5.0 e possui apenas um mtodo chamado iterator(), sem parmetro e que retorna um Iterator do tipo T (quer dizer: de qualquer
tipo), de acordo com o cdigo a seguir:
public interface Iterable {
Iterator<T> iterator();
}
Implementando esta interface, a classe ganha o direito de usar a
estrutura de dados atravs do comando for each na sua coleo
(conjunto de objetos) conforme modelo abaixo:
for (MeusDados item: minhaColeo) {
instruo(item);
}
O for each (ou foreach) uma instruo presente em vrias
linguagens de programao (incluindo Java) que permite percorrer os
itens presentes em uma coleo de dados. Em casos de navegao
em coleo, o for each bastante utilizado por ser mais simples e
no manter explcito o contador (que realmente no se faz necessrio
neste caso). como se a instruo dissesse: faa algo em todo este
conjunto de dados.
A interface Collection, que a base para todas as outras interfaces de colees (List, Set, etc), estende Iterable. Mas coleo um
assunto que ser abordado no contedo 4.3 (prximo tema).

Tema 3

| Polimorfismo

109

INDICAO DE LEITURA COMPLEMENTAR


DEITEL, P.J.; DEITEL, H. M. Java Como Programar. 8. ed., So Paulo:
Pearson Education do Brasil 2010.
Leitura recomendada para ampliar o conhecimento adquirido sobre
interfaces especiais pode ser feita nas pginas 298 (Cloneable), 329
(Comparable) e 640 a 641 (Iterator). Esta obra ainda pode ser muito
til por fazer comentrios sobre outras interfaces especiais.
HORSTMANN, C.S.; CORNELL, G. Core Java 2. Vol 1 - Fundamentos. 7.
ed,. So Paulo: Alta Books, 2005.
As interfaces especiais so comentadas nas pginas 125 a 140, com
destaque para a clonagem de objetos. Alm disso, pode ser encontrados exemplos que facilitam bastante o entendimento de interfaces
especiais.

PARA REFLETIR
Converse e reflita junto com seus colegas sobre as vantagens (e os
riscos) do uso da interface Cloneable. Lembre de discutir tambm a
importncia de o mtodo clone() ser protegido.

110

Programao de Computadores II

RESUMO
Voc merece os parabns! Concluiu mais um importante tema do
nosso livro.
Aps a leitura do contedo 3.1, voc adquiriu conhecimentos sobre
conceitos fundamentais de polimorfismo, entendeu o funcionamento,
alm de ter visto um exemplo prtico. O passo seguinte foi, no contedo 3.2, aprender duas palavras reservadas bastante utilizadas na
linguagem Java: abstract e final. Vimos que abstract pode ser aplicada em mtodos e em classes, enquanto que final foi vista sendo
aplicada em varivel, em mtodo e tambm em classe.
Outro assunto fundamental para a programao orientada a objetos
que aprendemos no contedo 3.3 foi interface. Inicialmente vimos
uma definio do conceito de interface, destacando o seu uso como
um poderoso recurso com o objetivo de diminuir o acoplamento entre as classes. Alm disso, as interfaces ainda podem ser utilizadas
como uma soluo para suprir a ausncia do conceito de herana
mltipla (que no existe na linguagem Java). Foi ressaltado tambm
a diferena conceitual entre uma herana e uma implementao. Por
fim, no contedo 3.4, estudamos algumas interfaces especiais (Cloneable, Comparable, Interator e Interable) e suas aplicaes prticas.
Agora chegou o momento de nos dedicarmos ao ltimo tema do nosso
livro. Nele iremos aprender excees, colees e fluxos de dados.
Tenha uma boa leitura!

Excees, Colees e Fluxos

Neste captulo ns iremos estudar como tratar as excees


que podem ocorrer durante a execuo do programa. Estudaremos
a biblioteca do Java para manipular estrutura de dados, por meio
de colees. E, em seguida, aprenderemos como persistir dados em
dispositivos secundrios, atravs de fluxos de dados. Ao final deste
tema, voc estar apto a capturar e tratar adequadamente excees
verificadas e no verificadas, a utilizar as estruturas de dados implementadas e disponibilizadas na biblioteca Java e a realizar a leitura e
escrita de arquivos por meio de fluxos de entrada e sada de dados.

112

Programao de Computadores II

4.1 Tratamento de Excees


At o momento, no nosso curso, ns lidamos com duas formas
de erros comuns: os erros sintticos e os erros lgicos.
Os erros sintticos so erros que vo de encontro gramtica
da linguagem e s regras para um programa bem formado, ou seja,
eles impedem que seu programa seja executado. Erros desta categoria so normalmente cometidos por iniciantes, programadores pouco
familiarizados com a linguagem.
Exemplos de erros sintticos comuns, em Java, so: falta de
um ;(ponto-e-vrgula) para finalizar uma instruo; estrutura de um
if com abre chaves { e sem o fecha chaves } e vice-e-versa; um
mtodo declarado sem retorno definido; a utilizao de uma varivel
no declarada, dentre outros.
Embora sejam comuns, tais erros so facilmente identificados
e corrigidos, uma vez que os compiladores e os interpretadores das
linguagens conseguem apontar o erro ocorrido.
Os erros lgicos so erros em que o cdigo compila normalmente, mas, quando executado, o resultado do programa difere do
esperado. Em outras palavras, a lgica da soluo para o problema
est incorreta e, portanto, no produz o resultado desejado.
Corrigir um erro lgico mais difcil do que um erro sinttico,
pois, o compilador incapaz de apontar o local da causa da falha, de
modo que, para localizar o erro lgico necessrio depurar (monitorar a execuo do programa) e testar.
Assim, considere que voc codificou a soluo para um problema. O cdigo compilou, executou normalmente e todos os testes
realizados foram aprovados. Ento, seu programa est livre de erros?
Infelizmente, no.
Isso porque, nem sempre possvel testar todas as possibilidades, principalmente para problemas com solues complexas, logo,
erros existiro. Alm disso, existem situaes excepcionais que ocorrem, eventualmente, durante a execuo do programa e esto fora do
controle do programador como, por exemplo: a retirada do cabo de
rede durante a transferncia de um arquivo; a entrada de um tipo de
informao invlida para uma determinada varivel; a manipulao
de um objeto no instanciado; o acesso a uma posio alm dos
limites do vetor ou matriz, dentre outros. Estas situaes originam
condies de erros denominadas excees.

Tema 4 | Excees, colees e fluxos

113

O tratamento de excees permite ao programador a possibilidade


de resolver o problema, a fim de que o mesmo continue sua execuo.
Para entendermos melhor as diferenas entre erro sinttico,
erro lgico e excees, vamos analisar o cdigo abaixo. O cdigo a
seguir calcula a mdia ponderada de um aluno, cuja disciplina possui
apenas 2 (duas) avaliaes: a primeira com peso 4 e a segunda com
peso 6.
/* A avaliao da disciplina constituda por
duas provas. A primeira prova possui peso 4, enquanto a segunda possui peso 6. Faa um programa
que calcula a mdia ponderada de um
aluno na
disciplina. */
public class MediaPonderada {
public static void main(String[] args) {
// Objeto scanner para entrada de dados
Scanner ler = new Scanner(System.in);
// ler a nota da primeira prova
System.out.print(Digite a nota1: )
// ERRO SINTTICO!
double nota1 = ler.nextDouble()
// ler a nota da segunda prova
System.out.print(Digite a nota2: )
double nota2 = ler.nextDouble();
// Calcular a mdia ponderada
// ERRO LGICO!
double media = (nota1 * 4 + nota2 * 6) / 2;
// Imprimir o resultado
System.out.println(Mdia Ponderada: + media);
}
}

114

Programao de Computadores II

Vamos analisar juntos este trecho de cdigo:


Na linha 16 est ocorrendo um erro sinttico, uma vez que
falta um ; (ponto-e-vrgula) para finalizar a instruo. Consequentemente, a compilao do cdigo no ser finalizada com sucesso e o
compilador indicar a linha 16 como causa do erro.
Uma vez corrigido o erro sinttico, compilado e executado, ns
podemos detectar uma nova falha, agora proveniente de um erro
lgico, cometido na linha 24. Pela definio de uma mdia ponderada, ns sabemos que o clculo da mdia dado pelo somatrio
dos valores multiplicado pelos seus respectivos pesos, dividido pelo
somatrio dos pesos. Logo, o cdigo nesta linha deveria ser:
double media = (nota1 * 4 + nota2 * 6) / 10;

importante ressaltar que ns somente observamos este erro


quando testamos o cdigo, ou seja, quando atribumos valores para
as variveis nota1 e nota2.
Uma vez corrigido o erro lgico, aparentemente o programa no
possui mais nenhuma falha. Mas, se um aluno descuidado atribusse
sua nota por extenso, por exemplo, cinco?
No existe erro sinttico e nem erro lgico no cdigo, mesmo
assim o programa mostrou a mensagem ilustrada na Figura 11 e
encerrou inesperadamente. O que houve?

Figura 11 - Exceo do programa mdia ponderada no tratada.

Ocorreu uma exceo. Neste caso, a mquina virtual Java parou


a execuo do programa porque uma exceo da classe InputMismatchException foi lanada e no tratada. Tal exceo foi lanada pela
classe Scanner para indicar que a informao lida no compatvel
com o tipo esperado.

Tema 4 | Excees, colees e fluxos

115

Esta mensagem exibida ao aluno incompreensvel e pouco amigvel para este tipo de usurio. Contudo, ela descreve o caminho de
execuo que resultou na exceo, ou seja, o rastreamento de pilha de
execuo, e muito til para os desenvolvedores do programa, uma
vez que eles so capazes de entender a estrutura da mensagem e extrair dela as informaes necessrias para localizar e tratar as excees.
Tratamento de Exceo
Para evitar que o programa interrompa sua execuo inesperadamente e mostre ao usurio mensagens pouco amigveis necessrio realizar o tratamento de excees.
Em Java, as excees so tratadas por meio de trs clusulas:
try, catch e finally.
A clusula try (tentar) utilizada para definir um bloco de instrues que pode gerar alguma exceo. Assim, o try monitora a
execuo das instrues que esto no escopo do bloco e caso ocorra
uma exceo, ela poder ser capturada pelo bloco catch. A seguir, a
sintaxe de um bloco try:
try {
// Instrues
}
// Blocos catch e finally
A clusula catch (capturar) define um bloco que responsvel
por capturar e tratar a exceo. possvel definir nenhum ou vrios
blocos catch, sendo que cada bloco ser capaz de identificar e tratar
um determinado tipo de exceo.
A seguir, a sintaxe de um bloco try-catch:
try {
// Instrues
} catch (<Tipo da exceo> <nome do objeto>) {
// Instrues de tratamento da exceo ExceptionType
}
// Blocos catch e finally

116

Programao de Computadores II

A clusula finally opcional. Ela utilizada para definir um


bloco de instrues que sempre ser executado, independente de
ocorrer ou no alguma exceo durante a execuo das instrues no
bloco try, e se esta foi ou no tratada.
O bloco finally deve ser posicionado logo aps o ltimo bloco
catch ou, caso este no exista, aps o bloco try. possvel ter vrios
blocos try-catch-finally em um mesmo programa. A seguir, a sintaxe
de um bloco try-catch-finally:
try {
// Instrues
} catch (<Tipo da exceo> <nome do objeto>) {
// Instrues de tratamento da exceo ExceptionType
} finally {
// Instrues
}

Para compreender os conceitos apresentados, vamos retornar


ao problema da mdia ponderada e analisar como a exceo InputMismatchException tratada. Vale ressaltar que no cdigo a seguir
os erros sintticos e lgicos j foram corrigidos.

Tema 4 | Excees, colees e fluxos

117

/* A avaliao da disciplina constituda por


duas provas. A primeira prova possui peso 4, enquanto a
segunda possui peso 6. Faa um programa que calcula a
mdia ponderada de um aluno na disciplina. */
public class MediaPonderada {
public static void main(String[] args) {
// Objeto scanner para entrada de dados
Scanner ler = new Scanner(System.in);
try {

// ler a nota da primeira prova


System.out.print(Digite a nota1: )
double nota1 = ler.nextDouble();
// ler a nota da segunda prova
System.out.print(Digite a nota2: )
double nota2 = ler.nextDouble();
// Calcular a mdia ponderada
double media = (nota1 * 4 + nota2 * 6) / 10;
// Imprimir o resultado
System.out.println(Mdia Ponderada: + media);
} catch (InputMismatchException ime) {
System.err.println(ERRO: A nota deve ser do tipo
real);
} finally {
System.out.println(O finally foi executado.);
}
}
}

118

Programao de Computadores II

Vamos executar o programa considerando que o usurio realizou


a entrada de dados corretamente e observar sua execuo, por meio
da sada no console.

Figura 12 - Programa mdia ponderada executado sem lanar exceo.

Podemos observar, na Figura 12, que o cdigo executou corretamente, ou seja, todas as instrues presentes no escopo do bloco
try foram executadas e, como no houve nenhuma exceo, o bloco
catch foi pulado no executado, ento, o programa executou o
bloco finally. Este o fluxo de execuo natural quando existe uma
sequncia de blocos try-catch-finally e nenhuma exceo lanada.
Agora vamos observar o que ocorre quando um aluno descuidado atribui sua nota por extenso e o cdigo est sendo tratado com
try-catch-finally.

Figura 13 - Exceo lanada e tratada no programa mdia ponderada.

Neste cenrio, uma exceo foi lanada quando o algoritmo


estava executando a linha 22. Isto porque, o aluno descuidado digitou
sua nota por extenso e o programa est aguardando a entrada de um
dado do tipo real.
No momento que a exceo lanada pela classe Scanner, o
programa desvia o fluxo para linha 30, onde encontra o bloco catch.
Este bloco capaz de tratar excees do tipo InputMismatchException que exatamente o tipo da exceo que ocorreu. Ento, as
instrues internas a este bloco so executadas para tratar a exceo.

Tema 4 | Excees, colees e fluxos

119

importante perceber que as instrues das linhas 23 at 29


no foram executadas, devido ocorrncia da exceo na linha 22.
Note ainda que, com o tratamento de excees, foi exibida uma
mensagem amigvel informando que a nota deve ser do tipo real e
no uma mensagem contendo o rastreamento da pilha de execuo.
De modo que, para o usurio comum, esta mensagem entendvel
e possibilita que o mesmo identifique qual ao, realizada por ele,
gerou a falha no programa.
Enfim, espero que vocs tenham compreendido a importncia
do tratamento de excees na robustez do programa. Por hora, vocs
devem ter compreendido o conceito de exceo e como trat-la utilizando os blocos try, catch e finally. No prximo contedo, ns aprofundaremos o estudo sobre as excees, conhecendo sua hierarquia
de classes e estudaremos como lanar uma exceo.

INDICAO DE LEITURA COMPLEMENTAR


Para saber mais sobre o tratamento de excees leia: Exemplo de
tratamento de ArithmeticExceptions e InputMismatchException. No
captulo 11 (p. 339-342) do livro de:
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson 2010.
Neste trecho do livro, Deitel apresenta os conceitos introdutrios
de tratamento de exceo por meio de um mtodo que calcula o
quociente entre dois nmeros inteiros.
Para aprender um pouco mais sobre como lidar adequadamente com
excees leia: Lidando com Exceptions.
KUNG, F. Lidando com Exceptions. Disponvel em <http://blog.caelum.
com.br/lidando-com-exceptions/>. Acesso em 16 de nov. de 2011.

120

Programao de Computadores II

Neste artigo, Fabio Kung esclarece dvidas comuns sobre diferentes


situaes reais no emprego de excees. Para isso, ele descreve cinco
boas prticas sobre tratamento de excees.

PARA REFLETIR
Vocs aprenderam que o a palavra-chave return utilizada em um
mtodo para retornar uma informao para o mtodo que o invocou.
Discuta com seus colegas e com o tutor o que acontece se uma exceo
ocorrer antes do return ser executado.

4.2 Avanando nas Excees


No contedo anterior, estudamos o conceito de exceo e
aprendemos como tratar excees, por meio de blocos try-catch-finally, analisando o cdigo da soluo de um problema de mdia
ponderada.
Neste contedo, ns avanaremos no estudo das excees, conhecendo as diferentes classes de exceo, sua hierarquia e, por fim,
aprenderemos a criar uma nova classe de exceo para lanar uma
exceo especfica ao nosso problema.
Hierarquia de classes de exceo
O Java define uma hierarquia especial para tratar de erros e
excees. No topo desta hierarquia encontra-se a classe Throwable,
filha da classe Object.

Tema 4 | Excees, colees e fluxos

121

Figura 14 - Hierarquia das classes de exceo

Observe na Figura 14 que a classe Throwable pai de todas as


classes de erros (class Error) e excees (class Exception). Assim, quando tratamos uma exceo com um bloco catch, o argumento requerido
como parmetro a classe Throwable ou alguma subclasse dela.
A classe Error descreve situaes anormais, inesperadas e intratveis. Esta classe descreve uma situao to grave que a aplicao
no pode fazer nada alm de informar a causa do erro. Um exemplo
de erro o OutOfMemoryError, que ocorre quando a aplicao necessita de mais memria do que existe disponvel.
A classe Exception a superclasse das excees em Java, ou
seja, toda exceo herda direta ou indiretamente desta classe. As
excees em Java so classificadas em: verificadas (checked) e no
verificadas (unchecked).
As classes de excees verificadas so assim denominadas porque o compilador Java exige que todas as excees deste tipo sejam
tratadas, por meio de blocos try-catch-finally, ou relanadas, usando
a clusula throws. Portanto, o compilador Java considera um erro de
compilao caso no o faa.
As classes de excees no verificadas possuem este rtulo
porque o compilador Java no exige que elas sejam tratadas ou relanadas. Porm, julga-se uma boa prtica de programao efetuar este
tratamento, a fim de maximizar a robustez do programa.

122

Programao de Computadores II

A classe RuntimeException, subclasse de Exception, representa


excees em tempo de execuo e a superclasse de todas as
excees no verificadas. As demais classes de exceo, que herdam
direta ou indiretamente de Exception, mas no herdam de RuntimeException,
so do tipo verificadas.
Alm da classe InputMismathException, que tratamos no contedo anterior, so exemplos de excees no verificadas: a ArithmeticException, que representa uma condio aritmtica excepcional
como, por exemplo, uma diviso por zero; a IllegalArgumentException, que representa um parmetro ilegal ou inapropriado; a IndexOutOfBoundsException, que indica o acesso a uma posio fora dos
limites da estrutura; e a NullPointerException, quando manipulamos
um objeto ou uma posio de um vetor cuja referncia null.
As excees do tipo verificadas mais comuns so: a IOException, que indica a ocorrncia de falha durante a entrada e sada de
dados; a ClassNotFoundException, quando a classe carregada durante
a execuo do programa no encontrada; e a SQLException, que
representa uma falha relacionada ao banco de dados.
A hierarquia de classes de exceo bastante extensa e o Java
permite que os programadores criem novas excees.
Criando excees
Para criar uma nova exceo necessrio definir uma classe que
herde, direta ou indiretamente, da classe Exception. Este processo de
criao segue os conceitos de herana que estudamos anteriormente.
A seguir, veja a sintaxe da criao de uma nova exceo.
public class <Exceo> extends <SuperClasseDaExceo> {
// Corpo da exceo
}

Normalmente, as classes criadas so excees verificadas (ou


seja, herdam da classe Exception, mas no da classe RuntimeException), embora seja possvel criar classes de excees no verificadas.
Recomenda-se, como boa prtica de programao, que toda classe de
exceo termine com a palavra Exception.

Tema 4 | Excees, colees e fluxos

123

Lanando excees
Uma exceo lanada por meio da clusula throw e uma instncia da classe de exceo que se deseja lanar. Quando o Java
executa a clusula throw, o fluxo de execuo natural do mtodo
modificado, retornando ao mtodo que o invocou. Logo, importante
ter em mente que a clusula throw retorna exceo que ocorreu e
no ao resultado do processamento do mtodo.
Ao lanar uma exceo, ns devemos informar ao mtodo que
ele pode lanar esta exceo. Para isso, utilizamos a palavra reservada throws na assinatura do mtodo, juntamente com a classe de
exceo. A clusula throws obrigatria para excees verificadas,
mas facultativa para excees no verificadas.
importante ficar atento diferena entre as palavras reservadas throw e throws. A clusula throw retorna uma exceo do tipo
informado, ou seja, lana a exceo. J a palavra reservada throws,
informa que o mtodo pode lanar uma exceo do tipo definido na
sua assinatura. O cdigo a seguir descreve um exemplo de sintaxe do
lanamento de excees.
public class <Nome da Classe> {
public void <Mtodo>() throws <Exceo> {
throw new <Exceo>();
}
}

Para entendermos melhor os conceitos vistos, suponha que


uma empresa bancria lhe contratou para codificar o mtodo de saque de uma conta.
Considerando que o usurio j tenha sido devidamente autenticado no sistema bancrio. Quais situaes podem impedir o saque
do dinheiro?
1) O usurio digita um valor negativo;
2) O usurio digita um valor superior ao saldo da conta;
Na situao 1, o sistema deve lanar uma exceo para informar ao usurio que o valor digitado invlido, uma vez que o

124

Programao de Computadores II

valor do saque deve sempre ser maior do que zero. O Java possui,
na hierarquia de classes, uma classe com objetivo de lanar excees
para informar que o valor do parmetro informado ilegal, a classe
IllegalArgumentException. Portanto, ns devemos lanar uma exceo
deste tipo e informar no seu construtor uma mensagem amigvel
para o usurio: O valor do saque deve ser maior que 0.. O trecho
de cdigo a seguir descreve o mtodo sacar da classe Conta para
solucionar a situao 1.
public class Conta {
. . . // Cdigo omitido
public void sacar(double valor) {
if (valor < 0)
throw new IllegalArgumentException(O valor
do saque deve ser maior que zero.);
saldo = saldo - valor;
}
. . . // Cdigo omitido
}

importante observar que se o valor a ser sacado for menor


do que 0 (zero), ou seja, quando o usurio tentar sacar um valor negativo, a condio do if satisfeita e a clusula throw executada.
Neste momento, uma exceo da classe IllegalArgumentException
lanada e o fluxo de execuo retorna ao mtodo que invocou o mtodo sacar, antes mesmo de atualizar o saldo da conta.
Observe no cdigo acima que no fomos obrigados a usar a
clusula throws para declarar explicitamente que o mtodo poder
lanar uma exceo do tipo IllegalArgumentException, uma vez que
esta classe do tipo no verificada.
J na situao 2 o sistema deve lanar uma exceo informando
que no existe saldo suficiente para realizar o saque. Esta exceo
extremamente especfica e, portanto, a biblioteca do Java no possui
uma classe de exceo com tal objetivo. Logo, ns criaremos a classe
SaldoInsuficienteException e, em seguida, lanaremos esta exceo
no mtodo sacar da classe Conta.

Tema 4 | Excees, colees e fluxos

125

A classe SaldoInsuficienteException representa uma exceo


que ocorre quando o valor a ser sacado superior ao saldo da conta.
O cdigo a seguir descreve a classe de exceo SaldoInsuficienteException que ser criada para lanar uma exceo especfica para
solucionar a situao 2.
public class SaldoInsuficienteException extends
Exception {
public SaldoInsuficienteException() {
super(Saldo insuficiente para realizar a
transao.);
}
}

Observe no cdigo acima que a classe SaldoInsuficienteException


herda da classe Exception. Portanto, esta classe de exceo do tipo
verificada. Alm disso, o construtor implementado na classe SaldoInsuficienteException invoca o construtor do pai, por meio da palavra
reservada super, e passa no parmetro a mensagem Saldo insuficiente para realizar a transao. Esta mensagem poder ser exibida ao
usurio quando a exceo for capturada no programa principal, usando
o bloco try-catch.
Agora que criamos nossa classe de exceo, ns precisamos
lanar uma exceo deste tipo quando o valor informado pelo usurio
for maior do que o saldo atual da conta. O trecho de cdigo a seguir
descreve o mtodo sacar da classe Conta para solucionar a situao 2.
public class Conta {
// Cdigo omitido
public void sacar(double valor) throws SaldoInsuficienteException {
if (valor < 0)
throw new IllegalArgumentException (O valor
do saque deve ser maior que zero.);
if (valor > this.saldo)
throw new SaldoInsuficienteException();
saldo = saldo - valor;
}
// Cdigo omitido
}

126

Programao de Computadores II

No cdigo acima, ns podemos observar que foi criada uma


condio (segundo if) para verificar se o valor solicitado no saque
maior do que o saldo do cliente. Sempre que esta condio satisfeita, a clusula throw executada e o mtodo sacar, da classe
Conta, lana uma exceo do tipo SaldoInsuficienteException. Como a
exceo lanada do tipo verificada, ns somos obrigados a declarar
no mtodo a possibilidade de lanar uma exceo do tipo SaldoInsuficienteException, usando clusula throws.
importante ressaltar que ns no fornecemos uma mensagem no construtor da classe SaldoInsuficienteException. Isto porque
a mensagem j foi previamente configurada dentro da classe.
Para finalizar, vamos criar uma classe Banco com um mtodo
main. Neste mtodo, ns iremos instanciar uma conta e tenta sacar
diferentes quantias. O cdigo a seguir descreve a classe Banco
public class Banco {
public static void main(String[] args) {
Conta c = new Conta(2, 1000);
try {
// Saque com sucesso
c.sacar(100);
System.out.println(Saque realizado com
sucesso!\n Saldo Atual: + c.getSaldo());
// Saque em que ocorrer uma exceo
c.sacar(1000);
System.out.println(Saque realizado com
sucesso!\n Saldo Atual: + c.getSaldo());
} catch (SaldoInsuficienteException sie){
System.out.println(sie.getMessage());
} catch (IllegalArgumentException iae){
System.out.println(iae.getMessage());
} finally {
System.out.println(Saldo Final: +
c.getSaldo());
}
}
}

Tema 4 | Excees, colees e fluxos

127

No cdigo acima, ns podemos observar que depositamos R$


1.000,00 durante a abertura da conta 2. Em seguida, efetuamos duas
tentativas de saque. Na primeira tentativa foi retirado com sucesso
R$ 100,00 e o saldo da conta foi atualizado para R$ 900,00. Logo em
seguida, ns tentamos sacar R$ 1.000,00. Como o saldo da conta
R$ 900,00, a tentativa de saque falhou, o sistema emitiu a mensagem
Saldo insuficiente para realizar a transao e o saldo da conta no
foi atualizado. Na Figura 2 est ilustrado o resultado da execuo da
classe Banco.

Execuo da classe Banco

Observe na Figura 15 que o saldo final da conta R$ 900,00, ou


seja, quando ocorreu a exceo, o valor no foi sacado e, portanto, o
saldo da conta no foi atualizado.
Por fim, observe que no cdigo da classe Banco ns obtivemos
a mensagem de exceo invocando o mtodo getMessage() do objeto da exceo tratada.

INDICAO DE LEITURA COMPLEMENTAR


Para saber mais sobre como obter informaes sobre a exceo leia:
printStackTrace, getStackTrace e getMessage. No captulo 11
(p. 349-351) do livro de:
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson, 2010.
Neste trecho do livro, Deitel apresenta os mtodos herdados da classe
Throwable para recuperar informaes sobre as excees.

128

Programao de Computadores II

Para aprender um pouco mais sobre o lanamento de excees leia:


Princpios do lanamento de exceo, no captulo 12 (p. 348-353) do
livro de:
BARNES, J. D; Kolling, M. Programao Orientada a Objetos com Java.
4. ed. So Paulo: Editora Pearson, 2009.
Neste trecho do livro, os autores descrevem os efeitos de uma exceo
a partir de exemplos de lanamento de exceo.

PARA REFLETIR
Vocs aprenderam que o a palavra-chave throw utilizada para lanar
uma exceo. Discuta com seus colegas o que acontece quando uma
exceo do tipo no verificada lanada com throw, no tratada e
nem relanada.

4.3 Colees da Java API


No contedo anterior, estudamos a hierarquia de excees e
observamos como a estender e lanar excees previamente definidas.
Neste contedo, ns estudaremos uma nova hierarquia de classes e interfaces do Java API, as colees. O Java API uma biblioteca
de recursos, classes e interfaces, disponibilizadas pelo Java para facilitar o desenvolvimento de aplicaes.
Hierarquia de colees
Uma coleo uma estrutura de dados capaz de armazenar
referncias a objetos. E, as estruturas de dados esto presentes no

Tema 4 | Excees, colees e fluxos

129

nosso cotidiano. Por exemplo, um fila de clientes em uma casa lotrica, uma pilha de livros na biblioteca, um conjunto de itens na lista
de compras, dentre outras.
A API do Java define uma hierarquia de classes e interfaces para
lidar com colees.

Figura 16 - Hierarquia de colees

A Figura 16 ilustra a hierarquia de colees. A interface Collection define a raiz da hierarquia de colees. O Set, List e Queue so
interfaces definidas a partir de Collection.
A interface Map define a estrutura de um mapa que associa
uma chave a um valor. Esta interface no deriva de Collection, devido
a sua estrutura.
Colees
A interface Collection define desde operaes de adio, remoo e busca de um (add, remove, contains) ou de vrios elementos
(addAll, removeAll, containsAll) na coleo, at estruturas de navegao sobre a coleo (iterator), alm de mostrar informaes sobre
o estado da coleo como, por exemplo, tamanho da coleo (size)
e se est ou no vazia (isEmpty). A interface permite ainda remover
todos os elementos da coleo (clear) ou obter sua representao em
array (toArray).
comum utilizar a interface Collection como parmetro de mtodos que lidam com colees para aproveitar das vantagens do polimorfismo.

130

Programao de Computadores II

Lista
A interface List deriva da Collection para definir uma sequncia
ordenada que permita elementos duplicados. Assim como nos arrays,
os programadores possuem total controle da posio do elemento
na coleo para realizar operaes de insero, remoo e obteno
do elemento por meio de ndices. O primeiro elemento da lista est
localizado no ndice zero(0).
A interface List implementada por diferentes classes, sendo as
principais: a ArrayList e a LinkedList.
A classe ArrayList implementa uma lista por meio de um array
redimensionvel. Nela, as operaes (adio e remoo) entre elementos da sequncia so ineficientes, pois implicam na reorganizao
do array.
A classe LinkedList implementa uma sequncia em que cada
elemento possui a referncia do prximo na lista. Deste modo, as
operaes entre elementos tornam-se eficiente.
Conjunto
A interface Set deriva da Collection para definir um conjunto de
elementos. Em outras palavras, esta estrutura de dados define uma
sequncia de elementos no repetidos.

A interface Set implementada por diferentes classes, sendo as principais: a HashSet e a TreeSet.

A classe HashSet implementa um conjunto no qual os elementos esto dispersos em uma tabela hash por meio de
uma funo hash. A grande vantagem desta estrutura o
tempo constante para operaes bsicas de adio, remoo, localizao e tamanho do conjunto.

A classe TreeSet armazena elementos em uma rvore rubronegra. Esta classe garante a complexidade de tempo de
log(n) para as operaes bsicas.

Tema 4 | Excees, colees e fluxos

131

Mapas
A interface Map define um mapa que associa uma chave a um
determinado valor. Assim, as operaes desta estrutura de dados dependem da chave utilizada. A interface Map no deriva de Collection,
uma vez que sua estrutura bem diferente.

A interface Map implementada por diferentes classes, sendo as principais: a HashMap e a TreeMap.

A classe HashMap utiliza uma tabela hash para armazenar


os elementos da coleo. J a classe TreeMap armazena os
elementos em uma rvore rubro-negra.

Trabalhando com Listas e Conjuntos


Suponha que voc est ajudando sua me a montar a lista
de compras para preparar uma salada de frutas no fim de semana,
usando a receita da vov. A receita para quatro pessoas exige mas,
bananas, laranjas, uvas, mamo, abacaxi e goiabas. Voc deve anotar
todas as frutas existentes na cozinha, selecionar as frutas exigidas na
receita e comprar apenas as frutas que faltaram. A seguir, o cdigo
e a Figura x descrevem, respectivamente, o cenrio e sua execuo.
public class SaladaDeFrutas {
public static void main(String[] args) {
// Anotar todas as frutas que fazem parte da
receita
String[] receita = {mas, bananas, bananas,
laranjas, uvas, mamo, abacaxi, goiabas};
Set<String> ingredientes = new HashSet<String>();
for (String fruta : receita) {
ingredientes.add(fruta);
}
System.out.println(Ingredientes da receita: +
ingredientes);
// Anotar as frutas disponveis na cozinha
String[] cozinha = {mas, bananas, bananas,

132

Programao de Computadores II

morango ,laranjas, abacaxi};


List<String> frutasDisponiveis = new
ArrayList<String>();
for (String fruta : cozinha) {
frutasDisponiveis.add(fruta);
}
System.out.println(Frutas disponveis: + frutasDisponiveis);
/* Remover o morango da lista de frutas
disponveis na cozinha, pois ele no faz parte da
receita */
String frutaRemovida = frutasDisponiveis.
remove(3);
System.out.println(Fruta removida: +
frutaRemovida);
System.out.println(Frutas disponveis:
+ frutasDisponiveis);
/* A lista de compras formada pelas frutas que esto na receita e no esto disponveis
na cozinha */
Set<String> compras = new HashSet<String>();
compras.addAll(ingredientes);
compras.removeAll(frutasDisponiveis);
System.out.println(Lista de compras: +
compras);
// Ordenando a lista de compras
List<String> comprasOrdenada = new
LinkedList<String>(compras);
Collections.sort(comprasOrdenada);
System.out.println(Lista de compras ordenada:
+ comprasOrdenada);
}
}

Tema 4 | Excees, colees e fluxos

133

Figura 17 - Execuo do exemplo de lista e conjunto

Diante do cdigo e da Figura 17, ns podemos observar que


inicialmente foi criado um conjunto de frutas representando os ingredientes necessrios para receita da salada de frutas. O conjunto foi
criado declarando uma varivel da interface Set e instanciando um
objeto da classe HashSet. Em seguida, as frutas foram adicionadas
no conjunto, por meio do mtodo add.
importante destacar que na impresso dos ingredientes da
receita no existem frutas duplicadas, mesmo tentando adicionar a
banana duas vezes.
Posteriormente, foi criada uma lista com as frutas disponveis
na cozinha. A lista foi criada declarando uma varivel da interface List
e instanciando um objeto da classe ArrayList.
Para adicionar na lista foi utilizado mtodo add. Vale ressaltar
que este mtodo est definido na interface Collection, por isso que
utilizamos o mesmo mtodo para adicionar no conjunto e na lista.
Ao imprimir a lista de frutas disponveis podemos perceber que
a banana foi adicionada duas vezes na lista. Isto ocorre porque a
interface List permite elementos duplicados.
Em seguida foi removido da lista de frutas disponveis o morango, j que sabemos a priori que ele no faz parte da receita. Para
isso, utilizamos o mtodo remove indicando a posio (ndice) do
elemento na lista.
A lista de compras igual a todas as frutas que esto na receita
e no esto disponveis na cozinha. A estratgia que utilizamos para
obter a lista de compras foi adicionar todos os ingredientes da receita
na lista de compras, usando o mtodo addAll e, logo aps, remover
da lista de compras todas as frutas disponveis na cozinha, por meio
do mtodo removeAll.
Por fim, criamos uma lista ordenada de itens a serem comprados. Para ordenar os elementos da lista utilizamos um mtodo esttico da interface Collection, o sort.

134

Programao de Computadores II

Trabalhando com Mapas


Voc mostrou a lista de compras a sua me e ela informou que
a receita seguida por voc est incompleta, pois falta a quantidade
especfica de cada fruta. Assim, sua me atualizou a receita, e, pediu
que voc criasse um mapa para descrever as frutas e a quantidade.
A seguir, o cdigo e a Figura 18 que descrevem, respectivamente, o
cenrio e sua execuo.
public class SaladaDeFrutas {
public static void main(String[] args) {
/* Instanciando a receita. A chave do mapa o
nome da fruta, enquanto o valor a quantidade da fruta. */
Map<String, Integer> receita = new TreeMap<String,
Integer>();
// Adicionando frutas ao mapa
receita.put(ma, 5);
receita.put(banana, 3);
receita.put(laranja, 4);
receita.put(uva, 20);
receita.put(mamo, 1);
receita.put(abacaxi, 1);
receita.put(goiaba, 3);
// Imprimindo o mapa de frutas
System.out.println(receita);
// Obtendo a quantiade de uvas
int quant = receita.get(uva);
System.out.println(Quantidade de uva: + quant);
}
}

Tema 4 | Excees, colees e fluxos

135

Figura 18 - Execuo do exemplo de mapa

Diante do cdigo e da Figura 18, ns podemos observar que inicialmente foi criado um mapa com os ingredientes da receita e suas
respectivas quantidades. O mapa foi criado declarando uma varivel
da interface Map e instanciando um objeto da classe TreeMap, que
define um mapa com os elementos ordenados pela chave.
Em seguida, as frutas foram adicionadas no mapa, com suas
respectivas quantidades, por meio do mtodo put(fruta, quantidade).
Como j sabemos, as operaes realizadas no mapa so feitas
por meio de chave. Ento, para obter a quantidade de uva a ser comprada na feira utilizamos o mtodo get, passando como parmetro a
chave, ou seja, o nome da fruta.

INDICAO DE LEITURA COMPLEMENTAR


Para saber mais sobre a utilizao de colees do Java API leia:
Colees genricas. No captulo 20 (p. 636-669) do livro de:
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson,
2010.
Neste captulo do livro Deitel apresenta, por meio de exemplos, a
hierarquia de colees do Java API. Alm de descrever boas prticas
de utilizao da coleo.
Para aprender um pouco mais sobre as estruturas de dados que
o Java API implementa, leia: Princpios do lanamento de exceo.
No captulo 12 (p. 348-353) por listas encadeadas. No captulo 5
(p.89-115)

136

Programao de Computadores II

LAFORE, Robert. Estrutura de dados e algoritmos em java. So Paulo:


Cincia Moderna, 2004.
Neste trecho do livro, os autores descrevem as principais estruturas
de dados em Java.

PARA REFLETIR
Discuta com seus colegas de classe sobre as facilidades e as vantagens de utilizar a estrutura de dados lista ao invs de vetores em
Java.

4.4 Fluxo de Dados


No contedo anterior, estudamos a hierarquia de colees e
aprendemos a manipular diferentes tipos de estrutura de dados, definidos e implementados no Java API.
Neste contedo, ns aprendemos a lidar com fluxo de dados
por meio do Java API. Nosso objetivo compreender o que um fluxo
de dados e conhecer as principais interfaces e classes para lidar com
fluxos de entrada e sada de dados.
Fluxo de Dados
Um fluxo de dados ou stream representa uma sequncia ordenada de dados que podem ser transmitidos para ou de diferentes
dispositivos como, por exemplo, discos rgidos, discos pticos, fitas
magnticas, conexo remota via socket de rede, uma entrada ou sada padro (normalmente teclado e mouse) ou, at mesmo, outros
programas.

Tema 4 | Excees, colees e fluxos

137

Atravs de um fluxo de dados possvel transmitir informaes


representadas como uma sequncia de bytes, de caracteres, de tipos
primitivos ou de objetos. O Java API define um conjunto de classes
abstratas e concretas para lidar com fluxos de entrada e sada de
dados, o pacote java.oi.
Normalmente, os programas leem bytes atravs do fluxo de entrada, por meio da classe abstrata InputStream (Figura 19, a seguir),
e transmitem bytes por um fluxo de sada, atravs da classe abstrata
OutputStream (Figura 20, a seguir).

Figura 19 - Fluxo de entrada de dados

Figura 20 - Fluxo de sada de dados

A grande vantagem das classes InputStream e OutputStream que


elas empregam o conceito de polimorfismo e, portanto, so capazes de
manipular bytes de diferentes dispositivos.
As classes InputStream e OutputStream so abstratas. Logo, no
admitem instncias. Para isto, o pacote Java API disponibiliza vrias classes concretas que estendem estas classes bsicas de fluxo de dados.
As classes ObjectInputStream, AudioInputStream, ByteArrayInputStream e FileInputStream so algumas das subclasses concretas de InputStream. Assim como, as classes ObjectOutputStream,

138

Programao de Computadores II

ByteArrayOutputStream, FileOutputStream so algumas das subclasses


concretas de OutputStream.
importante ressaltar que, normalmente, os mtodos das classes do pacote java.oi lanam excees do tipo IOException ou alguma
subclasse desta. Logo, os conceitos aprendidos sobre tratamento de
exceo sero empregados.
Alm disso, de suma importncia ressaltar que toda operao
envolvendo fluxo de dados deve-se garantir que o fluxo seja finalizado, independente de ocorrer uma exceo, a fim de evitar perda
ou inconsistncia de informao. Portanto, ns devemos utilizar um
bloco try-finally para garantir o fechado do fluxo de dados.
comum encontrar programas que utilizam arquivos localizados em dispositivos de armazenamento secundrio como origem ou
destino do fluxo de dados. Ento, vamos focar nosso estudo em classes capazes de ler e escrever dados em arquivos.
Leitura e Escrita de dados de um arquivo
Para obter um fluxo de dados de bytes de um arquivo necessrio instanciar um objeto do tipo FileInputStream. Por outro lado, se
o objetivo obter um fluxo de sada de bytes, para gravao de um
arquivo, ns devemos instanciar um objeto do tipo FileOutputStream.
Os construtores destas classes necessitam de uma representao de
um arquivo, ou seja, uma instncia da classe File.
Os objetos da classe FileInputStream utilizam o mtodo read
para ler um byte do arquivo. O retorno deste mtodo um valor inteiro, representando o byte lido ou o valor -1, que indica fim do fluxo
de entrada.
A classe File uma classe concreta que representa um arquivo
ou um diretrio. Esta classe do pacote java.io permite localizao do
arquivo, juntamente com seu nome.
A File define mtodos para obter o tamanho do arquivo em
bytes(length), para verificar se a referncia um arquivo (isFile) ou
um diretrio (isDirectory), para verificar se o programa possui permisso para leitura (canRead) ou escrita (canWrite). Uma instncia da
classe File pode ainda retornar uma lista contendo o nome de todos
os arquivos presentes no diretrio no qual est associado.
O objeto da classe File imutvel, portanto, uma vez instanciado, com um determinado caminho, sua localizao nunca poder ser
modificada.

Tema 4 | Excees, colees e fluxos

139

Para entendermos o funcionamento das classes File, FileInputStream e FileOutputStream vamos codificar um programa cujo objetivo
ler os dados de um arquivo de origem, denominado entrada.txt,
imprimir suas informaes na sada padro (console) e, em seguida,
salvar as informaes no arquivo sada.txt.
public class Arquivos {
public static void main(String[] args) throws IOException {
// Arquivo de entrada
File arqEntrada = new File(src/entrada.txt);
// Arquivo de sada
File arqSaida = new File(src/saida.txt);
// Fluxo de entrada
InputStream entrada = new FileInputStream(arqEntrada);
// Fluxo de sada
OutputStream saida = new FileOutputStream(arqSaida);
try {
// Ler um byte do arquivo
int byteLido = entrada.read();
// Ler um bytes do arquivo at o fim do fluxo
while (byteLido != -1) {
// Imprimir o byte lido, convertido em caracter
System.out.print((char) byteLido);
// Salvar o byte lido no fluxo de sada
saida.write(byteLido);
// Ler um novo byte
byteLido = entrada.read();
}
} finally {
// Garantir que os fluxos sejam finalizados
entrada.close();
saida.close();
}
}
}

140

Programao de Computadores II

No cdigo, ns podemos perceber que foram criados, inicialmente, dois objetos para representar o arquivo de entrada e de sada,
respectivamente. Em seguida, foram instanciados os fluxos de entrada e sada para tais arquivos.
Protegido por uma clusula try-finally tentou-se ler bytes do arquivo de entrada, por meio do mtodo read, at obter o fim do fluxo
de entrada. A cada byte lido, o valor era impresso para sada padro,
por meio do mtodo System.out.print, e escrito no arquivo de sada,
usando o mtodo write do fluxo de sada. Por fim, os fluxos de entrada e sada eram finalizados, garantindo a consistncia da informao.
A soluo utiliza fluxos de bytes, mas possvel criar fluxos de
caracteres. Para criar um fluxo de entrada de caracteres utilizamos a
classe FileReader. Enquanto, para criar um fluxo de sada de caracteres, utilizamos a classe FileWriter.
A grande vantagem em criar fluxos de caracteres poder tratar
os dados seguindo a codificao Unicode. O padro de codificao
Unicode permite representar e manipular texto em qualquer sistema
de escrita existente.
Por outro lado, estas classes realizam a leitura e escrita caractere a caractere e, normalmente, quando estamos tratando de texto
queremos ler e escrever linhas inteiras de caracteres. Para isso, o
pacote java.io disponibiliza classes que trabalham com buffers de
dados, a BufferedReader e a PrintWriter.
Um buffer uma regio de memria temporria para leitura e
escrita de dados, comumente utilizada quando existem diferenas
entre a taxa de recebimento e processamento dos dados. Esta estratgia fornece operaes de leitura e escritas mais eficientes.
A classe concreta BufferedReader para leitura eficiente de fluxos
de caracteres, arrays e linhas. Esta classe disponibiliza os mtodos
read e readline. O primeiro permite ler um ou vrios caracteres. O segundo l uma linha de caractere, ou seja, l caracteres at encontrar
um finalizador de linha.
A classe concreta PrintWriter permite escrever diferentes tipos
de dados em um fluxo de caracteres de sada. Uma das principais
vantagens adicionar caracteres ao fim do arquivo, alm de escrever
cadeias de caracteres formatadas.

Tema 4 | Excees, colees e fluxos

141

public class Arquivos2 {


public static void main(String[] args) {
// Instanciando alunos
Aluno aluno1 = new Aluno(2021, Roberto
Almeida);
Aluno aluno2 = new Aluno(3454, Marieta
Santos);
Aluno aluno3 = new Aluno(1276, Vanessa
Matos);
// Arquivo de entrada
File arqAluno = new File(src/aluno.txt);
// Escrevendo o arquivo
PrintWriter print = null;
try {
// Criar um fluxo de sada
print = new PrintWriter(arqAluno);
// Escrevendo o cabealho
print.println(Mat\tNome do Aluno);
// Escrevendo as informaes dos alunos
print.format(%d\t%s\n, aluno1.getMatricula(), aluno1.getNome());
print.format(%d\t%s\n, aluno2.getMatricula(), aluno2.getNome());
print.format(%d\t%s, aluno3.getMatricula(), aluno3.getNome());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// Finalizando o fluxo de sada
if (print != null)
print.close();
}
// Lendo o arquivo
BufferedReader br;
try {
// Buffer de leitura do arquivo
br = new BufferedReader(new FileReader(arqAluno));

142

Programao de Computadores II

// Ler todas as linhas do arquivo


String linha = br.readLine();
while (linha != null) {
// Imprimir na sada padro
System.out.println(linha);
linha = br.readLine();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// Finalizando o fluxo de entrada
if (print != null)
br.close();
}
}
}

O cdigo acima demonstra um exemplo de uma aplicao que


escreve, em um arquivo, as informaes formatadas de um conjunto
de alunos. Para isso, foi criado um objeto da classe PrintWriter e
utilizado os mtodos println, para escrever o cabealho do arquivo, e
format, para escrever a matrcula e o nome do aluno formatado.
Aps a escrita, foi criado um objeto da classe BufferedReader
para ler linhas inteiras do arquivo com os alunos. A cada linha lida as
informaes eram escritas na sada padro (console).
Vale a pena ressaltar o tratamento de excees verificadas realizado, por meio dos blocos try-catch-finally, lembrando sempre de
fechar os fluxos de dados.
Existem outras classes que manipulam dados em fluxos de entrada e sada no Java API. Neste contedo foram apresentadas as
principais classes para manipular dados em arquivos.

Tema 4 | Excees, colees e fluxos

143

INDICAO DE LEITURA COMPLEMENTAR


Para saber mais sobre a utilizao de arquivos e fluxo de dados Java
API leia: Arquivos, fluxos e serializao de objetos. No captulo 17
(p. 551-581) do livro de:
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson, 2010.
Neste captulo do livro, Deitel apresenta, por meio de exemplos, o
conceito de fluxo de dados de entrada e sada, alm da manipulao
de arquivos, por meio de diferentes classes do Java API.
Para aprender um pouco mais sobre como lidar arquivos no Java API
leia: Trabalhando com arquivos do Java IO ao NIO 2.
AMARAL, M. Trabalhando com arquivos do Java IO ao NIO 2. Disponvel em: <http://blog.caelum.com.br/evolucao-do-java-io-ao-ni/>. Acesso
em: 16 de nov. de 2011.
Neste artigo, Mrio Amaral demonstra a evoluo do Java API para
trabalhar com arquivos em Java, por meio de um exemplo para copiar
uma rvore de diretrio.

PARA REFLETIR
Voc j conhece a classe Scanner, do pacote java.util, e est acostumado a utilizar esta classe para ler dados da entrada padro (console).
Para isso, vocs instancia um objeto de Scanner informando ao construtor que o fluxo de entrada de dados o System.in. Discuta com seu
colega o que acontece se voc informar ao construtor um objeto File,
que representa um arquivo armazenado no seu computador.

144

Programao de Computadores II

RESUMO
No captulo 4.1 ns aprendemos que uma exceo uma indicao de
um problema ocorrido durante a execuo do programa que permite
ao programador a possibilidade de tratar o problema por meio de
blocos try-cath-finally, ou relanar o objeto da exceo ocorrida para
o mtodo chamador, usando a palavra reservada throw. Em ambos
os casos, o principal objetivo maximizar a robustez do programa.
No captulo 4.2 ns estudamos a hierarquia de excees e vimos
que ela pode ser facilmente estendida pelos programadores a fim
de tratar problemas especficos. Nesta hierarquia, ns podemos encontrar classes de excees verificadas e no verificadas. As classes
verificadas so subclasses de Exception e no herdam da classe RuntimeException. Estas classes so assim denominadas, uma vez que o
tratamento ou relanamento da exceo obrigatrio.
J no captulo 4.3 ns aprendemos a lidar com colees de dados em
Java. Uma coleo uma estrutura de dados capaz de armazenar referncias a objetos. O Java fornece uma biblioteca predefinida para lidar
com colees. Assim, podemos facilmente criar listas, instanciando
objetos da classe ArrayList ou LinkedList; definir conjuntos, por meio
das classes HashSet e TreeSet ou criar mapas do tipo chave-valor,
usando as classes HashMap ou TreeMap.
Por fim, no captulo 4.4, aprendemos que possvel persistir informaes em dispositivos de memria secundria, por meio de fluxos de
dados. Um fluxo de dados uma sequncia ordenada de dados transmitidos de ou para diferentes dispositivos. comum criar fluxos de
entrada para ler dados de um arquivo, por meio de objetos da classe
FileInputStream, ou definir fluxos de sada para armazenar dados, por
meio da classe FileOutputStream. Em ambos os casos necessrio
instanciar um objeto da classe File para representar o arquivo a ser
manipulado.

Tema 4 | Excees, colees e fluxos

145

Referncias
AMARAL, M. Trabalhando com arquivos do Java IO ao NIO 2. Disponvel em: <http://blog.caelum.com.br/evolucao-do-java-io-ao-ni/>. Acesso
em: 16 de nov. de 2011.
BARNES, J. D; KOLLING, M. Programao Orientada a Objetos com
Java. 4. ed. So Paulo: Editora Pearson, 2009.
CADENHEAD, R.; LEMAY, L. Aprenda em 21 dias Java 2. 4. ed. So
Paulo: Elsevier Editora Ltda, 2005.
DEITEL, P.J. Java Como Programar. 8. ed. So Paulo: Editora Pearson,
2010.
HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7. ed. So Paulo: Alta Books, 2005.
KUNG, F. Lidando com Exceptions. Disponvel em <http://blog.caelum.
com.br/lidando-com-exceptions/>. Acesso em 16 de novembro de 2011.
LAFORE, ROBERT. Estrutura de dados e algoritmos em java. So Paulo:
Cincia Moderna, 2004.
MENDES, D. R. Programao Java com nfase em Orientao a Objetos.
So Paulo: Novatec Editora Ltda, 2009.
SINTES, A. Aprenda Programao Orientada a Objetos. So Paulo:
Pearson Education do Brasil, 2010.

146

Programao de Computadores II

Anotaes

Programao de Computadores II

Anotaes

147

148

Programao de Computadores II

Anotaes

Programao de Computadores II

Anotaes

149

150

Programao de Computadores II

Anotaes

Programao de Computadores II

Anotaes

151

152

Programao de Computadores II

Anotaes

Anda mungkin juga menyukai