Sei sulla pagina 1di 224

Caelum

Mata o tempo e matas a tua carreira


BryanForbes

Sobre a empresa
ACaelumatuanomercadodesde2002,desenvolvendosistemaseprestandoconsultoria
em diversas reas, luz sempre da plataforma Java. Foi fundada por profissionais que se
encontraramnoBrasildepoisdeumaexperincianaAlemanhaeItlia,desenvolvendosistemasde
grandeportecomintegraoaosmaisvariadosERPs.Seusprofissionaispublicaramjdiversos
artigos nas revistas brasileiras de Java, assim como artigos em eventos acadmicos, e so
presenaconstantenoseventosdatecnologia.
Em 2004 a Caelum criou uma gama de cursos que rapidamente ganharam grande
reconhecimentonomercado.OscursosforamelaboradosporexinstrutoresdaSunquequeriam
trazer mais dinamismoeaplicaras ferramentas e bibliotecasutilizadasno mercado, taiscomo
Eclipse,Hibernate,Struts,eoutrastecnlogiasopensourcequenosoabordadaspelaSun.O
materialutilizadofoiinicialmentedesenvolvidoenquantoeramministradososcursosdeverode
javadaUniversidadedeSoPauloemjaneirode2004pelosinstrutoresdaCaelum.
Em2006aempresafocaseusprojetosemtrsgrandesreas:sistemasdegerenciamento
decontedoparaportais,desenvolvimentodesoluesdeintegraofinanceiraetreinamentocom
intuitodeformao.

Sobre a apostila
EstaaapostiladaCaelumquetemcomointuitoensinarJavadeumamaneiraelegante,
mostrandoapenasoquenecessrionomomentocorretoepoupandooleitordeassuntosque
nocostumamserdeseuinteresseemdeterminadasfasesdoaprendizado.
ACaelumesperaquevocaproveiteessematerial,equeelepossaserdegrandevaliapara
autodidataseestudantes.Todososcomentrios,crticasesugestesseromuitobemvindos.
Omaterialaquicontidopodeserpublicamentedistribudodesdequenosejaalteradoe
seuscrditossejammantidos.Elenopodeserusadoparaministrarqualquercurso,pormpode
serrefernciaematerialdeapoio.Casovocestejainteressadoemuslofinscomerciais,entre
emcontatocomaempresa.
Ateno: Voc pode verificar a data de ltima atualizao da apostila no fim do ndice.
Nuncaimprimaaapostilaquevocreceberdeumamigooupegarporemail,poisatualizamos
constantementeessematerial,quasequemensalmente.Vatonossositeefaaodownloadda
ltimaverso!

www.caelum.com.br

CaelumJava e Orientao a Objetos

ndice
Captulo 1: Como aprender Java.........................................................................1
1.1 - O que realmente importante?..............................................................1
1.2 - Sobre os exerccios.................................................................................1
1.3 - Tirando dvidas.......................................................................................2
1.4 - Sobre os autores.....................................................................................2
Captulo 2: O que Java.....................................................................................3
2.1 - Java..........................................................................................................3
2.2 - Mquina Virtual......................................................................................4
2.3 - Java lento? Hotspot e JIT.........................................................................6
2.4 - Verses do Java... e a confuso do Java2................................................6
2.5 - JVM? JRE? JDK? ....................................................................................7
2.6 - Onde usar e os objetivos do Java............................................................7
2.7 - Especificao versus implementao......................................................8
2.8 - Como o FJ11 est organizado.................................................................8
2.9 - Instalando o Java.....................................................................................9
2.10 - Compilando o primeiro programa.......................................................10
2.11 - Executando seu primeiro programa...................................................11
2.12 - O que aconteceu?................................................................................11
2.13 - E o bytecode?......................................................................................12
2.14 - Exerccios............................................................................................12
2.15 - O que pode dar errado?......................................................................13
2.16 - Um pouco mais....................................................................................14
2.17 - Exerccios............................................................................................14
Captulo 3: Variveis primitivas e Controle de fluxo........................................15
3.1 - Declarando e usando variveis.............................................................15
3.2 - Tipos primitivos e valores.....................................................................17
3.3 - Exerccios..............................................................................................17
3.4 - Casting e promoo..............................................................................18
3.5 - O If-Else.................................................................................................21
3.6 - O While..................................................................................................22
3.7 - O For.....................................................................................................22
3.8 - Controlando loops.................................................................................23
3.9 - Escopo das variveis.............................................................................24
3.10 - Um bloco dentro do outro...................................................................25
3.11 - Um pouco mais....................................................................................25
3.12 - Exerccios............................................................................................26
3.13 - Desafios...............................................................................................27
Captulo 4: Orientao a objetos bsica...........................................................28
4.1 - Motivao: problemas do paradigma procedural.................................28
4.2 - Criando um tipo....................................................................................29
4.3 - Uma classe em Java..............................................................................30
4.4 - Criando e usando um objeto.................................................................31
4.5 - Mtodos ................................................................................................32
4.6 - Mtodos com retorno............................................................................33
4.7 - Objetos so acessados por referncias.................................................34
4.8 - O mtodo transfere().............................................................................37
4.9 - Continuando com atributos...................................................................38
4.10 - Para saber mais: Uma Fbrica de Carros...........................................41
ii

CaelumJava e Orientao a Objetos

4.11 - Um pouco mais....................................................................................42


4.12 - Exerccios............................................................................................42
4.13 - Desafios...............................................................................................46
4.14 - Fixando o conhecimento.....................................................................46
Captulo 5: Um pouco de arrays.......................................................................48
5.1 - O problema............................................................................................48
5.2 - Arrays de referncias............................................................................49
5.3 - Percorrendo uma array.........................................................................50
5.4 - Percorrendo uma array no Java 5.0......................................................50
5.5 - Um pouco mais......................................................................................51
5.6 - Exerccios..............................................................................................52
5.7 - Desafios.................................................................................................53
5.8 - Testando o conhecimento......................................................................54
Captulo 6: Modificadores de acesso e atributos de classe..............................55
6.1 - Controlando o acesso............................................................................55
6.2 - Encapsulamento....................................................................................58
6.3 - Getters e Setters...................................................................................59
6.4 - Construtores..........................................................................................61
6.5 - A necessidade de um construtor...........................................................62
6.6 - Atributos de classe................................................................................63
6.7 - Um pouco mais......................................................................................65
6.8 - Exerccios..............................................................................................65
6.9 - Desafios.................................................................................................66
Captulo 7: Orientao a Objetos herana, reescrita e polimorfismo............67
7.1 - Repetindo cdigo?.................................................................................67
7.2 - Reescrita de mtodo.............................................................................70
7.3 - Chamando o mtodo reescrito..............................................................71
7.4 - Polimorfismo.........................................................................................71
7.5 - Um outro exemplo.................................................................................73
7.6 - Um pouco mais......................................................................................74
7.7 - Exerccios..............................................................................................74
Captulo 8: Eclipse IDE.....................................................................................79
8.1 - O Eclipse...............................................................................................79
8.2 - Views e Perspective...............................................................................80
8.3 - Criando um projeto novo.......................................................................82
8.4 - Nossa classe Conta...............................................................................84
8.5 - Criando o main......................................................................................86
8.6 - Rodando o main....................................................................................88
8.7 - Pequenos truques..................................................................................88
8.8 - Exerccios..............................................................................................89
Captulo 9: Orientao a Objetos Classes Abstratas......................................92
9.1 - Repetindo mais cdigo?........................................................................92
9.2 - Classe abstrata......................................................................................93
9.3 - Mtodos abstratos.................................................................................94
9.4 - Um outro exemplo.................................................................................96
9.5 - Para saber mais.....................................................................................99
9.6 - Exerccios..............................................................................................99
Captulo 10: Orientao Objetos Interfaces..............................................101
10.1 - Aumentando nosso exemplo..............................................................101
iii

CaelumJava e Orientao a Objetos

10.2 - Interfaces..........................................................................................104
10.3 - Dificuldade no aprendizado de interfaces........................................107
10.4 - Exemplo interessante: conexes com o banco de dados..................108
10.5 - Um pouco mais..................................................................................108
10.6 - Exerccios..........................................................................................108
Captulo 11: Excees Controlando os erros...............................................113
11.1 - Motivao..........................................................................................113
11.2 - Exerccio para comear com os conceitos........................................114
11.3 - Excees de Runtime mais comuns..................................................119
11.4 - Outro tipo de exceo: Checked Exceptions.....................................120
11.5 - Um pouco da grande famla Throwable............................................122
11.6 - Mais de um erro................................................................................122
11.7 - Lanando excees...........................................................................123
11.8 - Criando seu prprio tipo de exceo................................................124
11.9 - Para saber mais: finally.....................................................................125
11.10 - Um pouco mais................................................................................126
11.11 - Exerccios........................................................................................126
11.12 - Desafios...........................................................................................128
Captulo 12: Pacotes Organizando suas classes e bibliotecas.....................129
12.1 - Organizao......................................................................................129
12.2 - Import...............................................................................................130
12.3 - Acesso aos atributos, construtores e mtodos..................................132
12.4 - Usando o Eclipse com pacotes..........................................................132
12.5 - Exerccios..........................................................................................134
Captulo 13: Ferramentas: jar e javadoc.........................................................135
13.1 - Arquivos, bibliotecas e verses.........................................................135
13.2 - Gerando o jar pelo Eclipse................................................................136
13.3 - Javadoc..............................................................................................138
13.4 - Gerando o Javadoc............................................................................139
13.5 - Classpath...........................................................................................141
13.6 - Exerccios..........................................................................................143
Captulo 14: O pacote java.lang......................................................................144
14.1 - Pacote java.lang................................................................................144
14.2 - Um pouco sobre a classe System e Runtime....................................144
14.3 - java.lang.Object................................................................................145
14.4 - Casting de referncias......................................................................145
14.5 - Integer e classes wrappers (box)......................................................147
14.6 - Autoboxing no Java 5.0.....................................................................148
14.7 - Mtodos do java.lang.Object equals e toString................................148
14.8 - java.lang.String.................................................................................150
14.9 - java.lang.Math..................................................................................151
14.10 - Exerccios........................................................................................152
14.11 - Desafio............................................................................................153
Captulo 15: Pacote java.io.............................................................................154
15.1 - Orientao a objeto...........................................................................154
15.2 - InputStream: lendo bytes .................................................................154
15.3 - InputStreamReader: lendo chars......................................................155
15.4 - BufferedReader: lendo Strings.........................................................155
15.5 - Lendo Strings do teclado..................................................................156
iv

CaelumJava e Orientao a Objetos

15.6 - A analogia na sada...........................................................................157


15.7 - Uma maneira mais fcil: Scanner e PrintStream.............................158
15.8 - Um pouco mais..................................................................................158
15.9 - Exerccios..........................................................................................158
Captulo 16: Collections framework...............................................................161
16.1 - Motivao: Manipular arrays trabalhoso, precisamos de estruturas
de dados......................................................................................................161
16.2 - Listas: java.util.List...........................................................................162
16.3 - Listas no Java 5.0 com Generics.......................................................164
16.4 - Ordenao: Collections.sort..............................................................165
16.5 - Exerccios..........................................................................................167
16.6 - Conjunto: java.util.Set.......................................................................168
16.7 - Principais interfaces: java.util.Collection.........................................169
16.8 - Iterando sobre colees: java.util.Iterator.......................................170
16.9 - Iterando colees no java 5.0: enhanced for....................................172
16.10 - Mapas - java.util.Map......................................................................172
16.11 - Mapas no Java 5.0...........................................................................174
16.12 - Exerccios........................................................................................176
16.13 - Desafios...........................................................................................177
Captulo 17: Threads.......................................................................................178
17.1 - Linhas de execuo...........................................................................178
17.2 - Criando uma subclasse da classe Thread.........................................179
17.3 - Garbage Collector.............................................................................179
17.4 - Exerccios..........................................................................................180
17.5 - Para saber mais: Compartilhando objetos entre Threads.................181
17.6 - Vector e Hashtable............................................................................183
17.7 - Um pouco mais..................................................................................183
Captulo 18: E agora?.....................................................................................185
18.1 - Exerccio prtico...............................................................................185
18.2 - Certificao.......................................................................................185
18.3 - Web....................................................................................................185
18.4 - J2EE...................................................................................................185
18.5 - Frameworks......................................................................................185
18.6 - Revistas.............................................................................................186
18.7 - Grupo de Usurios............................................................................186
18.8 - Falando em Java................................................................................186
Captulo 19: Apndice A - Sockets..................................................................187
19.1 - Protocolo...........................................................................................187
19.2 - Porta..................................................................................................188
19.3 - Socket................................................................................................188
19.4 - Servidor.............................................................................................188
19.5 - Cliente...............................................................................................190
19.6 - Imagem geral....................................................................................192
19.7 - Exerccios..........................................................................................192
19.8 - Desafios.............................................................................................192
19.9 - Soluo do sistema de chat...............................................................192
Captulo 20: Apndice B Swing bsico.........................................................195
20.1 - Interfaces grficas em Java...............................................................195
20.2 - Portabilidade.....................................................................................195
v

CaelumJava e Orientao a Objetos

20.3 - Comeando com Swing.....................................................................195


20.4 - Nosso primeiro formulrio................................................................196
20.5 - Adicionando eventos.........................................................................198
20.6 - Gerenciadores de Layout..................................................................200
20.7 - Look And Feel....................................................................................200
20.8 - Para saber mais.................................................................................201
Captulo 21: Apndice C - Mais java...............................................................202
21.1 - Import Esttico.................................................................................202
21.2 - final...................................................................................................203
21.3 - Calendar............................................................................................203
21.4 - Date...................................................................................................205
21.5 - Outras classes muito teis................................................................205
21.6 - Anotaes..........................................................................................205
Captulo 22: Apndice D Instalao do JDK.................................................207
22.1 - O Link................................................................................................207
22.2 - Instalao do JDK em ambiente Windows........................................207
22.3 - Instalao do JDK em ambiente Linux..............................................213
Data desta edio: Agosto/2006

vi

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Como aprender Java


Homens sbios fazem provrbios, tolos os repetem
SamuelPalmer

Comoomaterialestorganizadoedicasdecomoestudaremcasa.

1.1 - O que realmente importante?


Muitos livros, ao passar os captulos, mencionam todos os detalhes da linguagem
juntamentecomosprincpiosbsicosdela.Issoacabacriandomuitaconfuso,emespecialpois
oestudantenoconseguedistinguirexatamenteoqueimportanteaprenderereternaquele
momentodaquiloquesernecessriomaistempoeprincipalmenteexperinciaparadominar.
Seumaclasseabstratadeveounoteraomenosummtodoabstrato,seoifsaceitar
argumentos booleanos e todos os detalhes de classes internas realmente no devem ser
preocupaes para aquele que possui como objetivo primrio aprender Java. Esse tipo de
informaoseradquiridacomotempo,enonecessrioatumsegundomomento.
Nestecursoseparamosessasinformaesemquadrosespeciais,jquesoinformaes
extras.Ouentoapenascitamosnumexerccioedeixamosparaoleitorprocurarinformaesse
fordeseuinteresse.
Algumasinformaesnosomostradasepodemseradquiridasemtutoriaisouguiasde
referncia,sodetalhesqueparaumprogramadorexperienteemJavapodeserimportante,mas
noparaquemestcomeando.
Por fim falta mencionar sobre a prtica, que deve ser tratada seriamente: todos os
exercciossomuitoimportanteseosdesafiospodemserfeitosquandoocursoacabar.De
qualquer maneira recomendamos aos alunos estudar em casa, principalmente aqueles que
fazemoscursosintensivos.

Ocurso
ParaaquelesqueestofazendoocursoJavaeOrientaoaObjetos,recomendadoestudarem
casaaquiloquefoivistoduranteaaula,tentandoresolverosexercciosquenoforamfeitoseos
desafiosqueestolparaenvolvermaisoleitornomundodeJava.

ConvenesdeCdigo
ParamaisinformaessobreasconvenesdecdigofonteJava,acesse:
http://java.sun.com/docs/codeconv/

1.2 - Sobre os exerccios


Os exerccios do curso variam entre prticos at pesquisas na Internet, ou mesmo
consultas sobre assuntos avanados em determinados tpicos para incitar a curiosidade do
aprendiznatecnologia.
Captulo1ComoaprenderJavaPgina1

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Existemtambm,emdeterminadoscaptulos,umasriededesafios.Elesfocammaisno
problemacomputacionalquenalinguagem,pormsoumaexcelenteformadetreinarasintaxe
eprincipalmentefamiliarizaroalunocomabibliotecapadroJava,almdeproporcionarum
ganhonavelocidadededesenvolvimento.

1.3 - Tirando dvidas


Paratirardvidasdosexerccios,oudeJavaemgeral,recomendamosofrumdositedo
GUJ(http://www.guj.com.br/),ondesuadvidaserrespondidaprontamente.
Sevocjparticipadeumgrupodeusuriosjavaoualgumalistadediscusso,podetirar
suasdvidasnosdoislugares.
Fora isso, sintase a vontade de entrar em contato conosco para tirar todas as suas
dvidasduranteocurso.

1.4 - Sobre os autores


GuilhermeSilveira (guilherme.silveira@caelum.com.br)programadorewebdeveloper
certificadopelaSun,trabalhandocomJavadesde2000comoespecialistaeinstrutor.Programou
earquiteturouprojetosnaAlemanhadurante2anos.CofundadordoGUJ,escreveparaarevista
MundoJava,estudaMatemticaAplicadanaUSPeinstrutoreconsultornaCaelum.Umdos
comittersdoCodehausXStream.
PauloSilveira(paulo.silveira@caelum.com.br)programadoredesenvolvedorcertificado
Java. Possui grande experincia em desenvolvimento web, trabalhando em projetos na
AlemanhaeemdiversasconsultoriasnoBrasil.FoiinstrutorJavapelaSun,cofundadordo
GUJeformadoemcinciadacomputaopelaUSP,onderealizaseumestrado.umdos
editorestcnicosdarevistaMundoJava.
SrgioLopes (sergio.lopes@caelum.com.br)BacharelandoemCinciadaComputao
naUSPedesenvolvedorJavadesde2002.programadorcertificadoJavapelaSun,moderador
do GUJ e colaborador da revista Mundo Java. Trabalha com Java para Web e dispositivos
mveis,almdeministrartreinamentosnaCaelum.
Inmerasmodificaesesugestesforamrealizadasporoutrosconsultoreseinstrutores
daCaelum,emespecialAlexandredaSilva,FbioKungeThadeuRusso.
Diversos screenshots, remodelamentos e melhorias nos textos foram realizados por
GuilhermeMoreiraeJacquelineRodrigues.
Agrecimentosatodasaspessoasquecostumamenviarerros,bugsesugestesparaa
equipe.

Captulo1ComoaprenderJavaPgina2

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

O que Java

Computadores so inteis, eles apenas do respostas


Picasso

ChegouahoraderesponderasperguntasmaisbsicassobreJava.Aotrminodessecaptulovoc
sercapazde:
responderoqueJava;
mostrarasvantagensedesvantagensdeJava;
compilareexecutarumprogramasimples.

2.1 - Java
MuitosassociamJavacomumamaneiradedeixarsuaspginasdawebmaisbonitas,
comefeitosespeciais,ouparafazerpequenosformulriosnaweb.
OqueassociaasempresasaoJava?
Jiremoschegarnesteponto,masantesvamosveromotivo peloqualasempresas
fogemdasoutraslinguagens:
Quaissoosseusmaioresproblemasquandoestprogramando?

PLATAFORMA
JAVA

SUN

ponteiros?
liberarmemria?
organizao?
faltadebibliotecasboas?
terdereescreverpartedocdigoaomudardesistemaoperacional?
custodeusaratecnologia?

Java tenta amenizar esses problemas. Alguns desses objetivos foram atingidos muito
tempoatrs,porque,antesdoJava1.0sair,aidiaquealinguagemfosseusadaempequenos
dispositivos,comotvs,aspiradores,liquidificadoreseoutros.Apesardissoalinguagemteveseu
lanamentomirandoousodelanosclientesweb(browsers)pararodarpequenasaplicaes
(applets).Hojeemdiaessenomaisofocodalinguagem.
OJavadesenvolvidoemantidopelaSun(http://www.sun.com)eseusiteprincipalo
http://java.sun.com.(java.comumsitemaisinstitucional,voltadoaoconsumidordeprodutose
usuriosleigos,nodesenvolvedores).

AhistriadoJava
ASuncriouumtime(conhecidocomoGreenTeam)paradesenvolverinovaestecnolgicasem
1992.EssetimefoilideradoporJamesGosling,consideradoopaidoJava.Otimevoltoucoma
idiadecriaruminterpretador(jeraumamquinavirtual,veremosoqueissomaisafrente)
parapequenosdispositivos,facilitandoareescritadesoftwareparaaparelhoseletrnicos,como
vdeocassete,televisoeaparelhosdetvacabo.
Captulo2OqueJavaPgina3

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Aidianodeucerto,tentaramfechardiversoscontratoscomgrandesfabricantesdeeletrnicos,
comoaPanasonic,masnohouvexitodevidoaoconflitodeinteresses.Hojesabemosqueo
Javadominaomercadodeaplicaesparacelulares,pormparecequeem1994aindaeramuito
cedo.
Comoadventodaweb,aSunpercebeuquepoderiautilizaraidiacriadaem1992parapoder
rodarpequenasaplicaesdentrodobrowser.Asemelhanaeraquenainternethaviaumagrande
quantidade de sistemas operacionais e browser, e com isso seria grande vantagem poder
programarnumanicalinguagem,independentedaplataforma.FoiaqueoJava1.0foilanado:
focadoemdeixarobrowsernoapenasumclienteburro,fazendocomqueelepossatambm
realizaroperaes,noapenasrenderizarhtml.
SabemosquehojeosappletsrealmentenosoofocodaSun.engraadoqueatecnologia
Javanasceucomumobjetivoemmente,foilanadocomoutromasnofinaldecoloumesmono
desenvolvimentodeaplicaesdoladodoservidor.Sorte?
VocpodelerahistriadalinguagemJavaem:
http://java.sun.com/java2/whatis/1996/storyofjava.html
NoBrasil,diversosgruposdeusuriossejuntaramparatentardisseminaroconhecimento
da linguagem. Um deles o GUJ (www.guj.com.br), uma comunidade virtual com artigos,
tutoriaisefrumparatirardvidas,omaioremlnguaportuguesa.
Encorajamostodososalunosausarmuitoosfrunsdomesmopoisumadasmelhores
maneirasparaacharsoluesparapequenosproblemasqueacontecemcomgrandefreqncia.

2.2 - Mquina Virtual


EmumalinguagemdeprogramaocomoCePascal,temososeguintequadroquando
vamoscompilarumprograma.
O cdigo fonte compilado para uma plataforma e sistema operacional especficos.
Muitasvezes,oprpriocdigofontedesenvolvidovisandoumanicaplataforma!

CdigofonteemC
compila

Cdigobinriopara
umdeterminadorSO

Essecdigoexecutvel(binrio)resultanteserexecutadopelosistemaoperacionale,
poressemotivo,eledevesaberconversarcomosistemaoperacionalemquesto.

Captulo2OqueJavaPgina4

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos


Cdigobinriopara
Windows
aplicao

Windows

SistemaOperacional

Cdigobinriopara
Linux

Linux

Isto,temosumcdigoexecutvelparacadasistemaoperacional.necessriocompilar
umavezparaWindows,outraparaoLinux,etc...
Como foi dito anteriormente, na maioria das vezes, a sua aplicao se utiliza das
bibliotecasdosistemaoperacional,como,porexemplo,adeinterfacegrficaparadesenharas
'telinhas'.AbibliotecadeinterfacegrficadoWindowsbemdiferentedasdoLinux;resultado?
Voc precisa reescrever o mesmo pedao da aplicao para diferentes sistemas
operacionais,jqueelesnosocompatveis.
MQUINA
VIRTUAL

JoJavautilizasedoconceitode mquina virtual,ondeexisteumacamadaextra


entreosistemaoperacionaleaaplicao,responsvelportraduzir(noapenasisso)oque
suaaplicaodesejafazerparaasrespectivaschamadasdosistemaoperacionalnoqualela
estrodandonomomento:
Bytecodejava

Bytecodejava

MquinaVirtualJava
paraLinux

MquinaVirtualJava
ParaWindows

Linux

Windows

Dessaforma,amaneiraaqualvocabreumajanelanoLinuxounoWindowsamesma:
voc ganha independncia de sistema operacional. Ou, melhor ainda, independncia de
plataformaemgeral:noprecisosepreocuparemqualsistemaoperacionalsuaaplicaoest
rodando,nememquetipodemquina,configuraesetc.
Repare que uma mquina virtual um conceito bem mais amplo que o de um
interpretador.Comooprprionomediz,umamquinavirtualcomoumcomputadordementira:
ela tem tudo que um computador tem. Em outras palavras, ela responsvel por gerenciar
memria, gerenciar threads, a pilha de execuo, etc. Sua aplicao roda sem nenhum
envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual
Machine (JVM).Essacaractersticainteressante:comotudopassarpelaJVM,elapodetirar
mtricas, decidir onde melhor alocar amemria,entre outros. UmaJVMisola a aplicao
totalmentedosistemaoperacional.SeumaJVMterminaabruptamente,sasaplicaesque
estavam rodando nela iro terminar: isso no afetar outras JVMs que estejam rodando no
mesmocomputador,nemafetarosistemaoperacional.Essacamadadeisolamentotambm
interessantequandopensamosemumservidorquenopodesesujeitararodarcdigoque
Captulo2OqueJavaPgina5

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

possaavirainterferirnaboaexecuodeoutrasaplicaes.

BYTECODE

Para tudo isso precisamos de um bytecode. Bytecode o termo dado ao cdigo


binriogeradopelocompiladorJava(poisexistemmenosde256cdigosdeoperaodessa
linguagem,ecadaopcodegastaumbyte,dandoorigemaonomebytecode).Ocompilador
Java gera esse bytecodeque, diferente daslinguagenssem mquinavirtual, vai servirpara
diferentessistemasoperacionais,jqueelevaisertraduzidopelamquinavirtual.

Writeonce,runanywhere
EsseumsloganqueaSunusaparaoJava,jquevocnoprecisareescreverpartedasua
aplicaotodavezquequisermudardesistemaoperacional.
Muitaspessoascriticamoucriampiadasemcimadesseslogan,poracharemquenemsempre
umaaplicaoJavapoderodaremduasplataformasdiferentessemproblemas.

2.3 - Java lento? Hotspot e JIT


HotspotatecnologiaqueaJVMutilizaparadetectarpontosquentesdasuaaplicao:
cdigoqueexecutadomuito,provavelmentedentrodeumoumaisloops.QuandoaJVMjulgar
necessria,elavaicompilaraquelecdigoparainstruesnativasdaplataforma,tendoemvista
queissovaiprovavelmentemelhoraraperformancedasuaaplicao.EssecompiladoroJIT:
JustinTimeCompiler,ocompiladorqueaparecebemnahoraquevocprecisa.
Vocpodepensarento:porqueaJVMnocompilatudoantesdeexecutaraaplicao?
que teoricamente compilar dinamicamente, a medida do necessrio, pode gerar uma
performancemelhor.Omotivosimples:imagineum.exegeradopeloVisualBasic,pelogccou
peloDelphi,eleesttico.Elejfoiotimizadobaseadoemheursticas,ocompiladorpodeter
tomadoumadecisonotoboa.
JaJVM,porestarcompilandodinamicamenteduranteaexecuo,podeperceberque
umdeterminadocdigonoestcomperformanceadequada,eotimizarmaisumpoucoaquele
trecho, ou ainda mudar a estratgia de otimizao. por esse motivo que as JVMs mais
recentes(comoadoMustang,Java6),emalgunscasos,chegaaganharemmuitoscasosde
cdigosCcompiladoscomoGCC3.x,serodadosduranteumcertotempo.

2.4 - Verses do Java... e a confuso do Java2


Java1.0e1.1soasversesmuitoantigasdoJava.

ComoJava1.2houveumaumentograndenotamanhodaAPI,efoinessemomentoem
quetrocaramanomenclaturadeJavaparaJava2,comoobjetivodediminuiraconfusoentre
JavaeJavascript.Maslembrese,nohversodoJava2.0,o2foiincorporadoaonome:
Java21.2.
DeposvieramoJava21.3e1.4,eoJava1.5passouasechamarJava5,tantoporuma
questodemarketingeporquemudanassignificativasnalingaugemforamincludas.nesse
momentoqueo2donomeJavadesaparece.Reparequeparafinsdedesenvolvimento,oJava
5aindareferidocomoJava1.5.
Ataverso1.4existiaaterceiranumerao(1.3.1,1.4.1,1.4.2,etc),indicandobugfixese
melhorias.ApartirdoJava5existemapenasupdates:Java5update7,porexemplo.
O Java 6 est previsto para o fim de 2006, mas sem mudanas na especificao da
linguagem.

Captulo2OqueJavaPgina6

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

ExistecompatibilidadeparatrsemtodasasversesdoJava.Umclassgeradopelojavac
daverso1.2precisanecessariamenterodardaJVM5.0.

2.5 - JVM? JRE? JDK?


Oquevocvaibaixarnositedojava?
JVM=apenasavirtualmachine,essedownloadnoexiste
JRE = Java Runtime Environment, ambiente de execuo Java, formado pela JVM e
bibliotecas,tudoquevocprecisaparaexecutarumaaplicaoJava.
JDK=Ns,desenvolvedores,faremosodownloaddoJDKdoJavaSE(StandardEdition).

2.6 - Onde usar e os objetivos do Java


No decorrer do curso voc pode achar que o Java tem baixa produtividade, que a
linguagem aqualvocestacostumadomaissimplesdecriarospequenossistemasque
estamosvendoaqui.
QueremosdeixarclarodequeapremissadoJavanoadecriarsistemaspequenos,
ondetemosum oudois desenvolvedores,maisrapidamenteque linguagenscomophp,perl,
entreoutras.
O foco da plataforma outro: aplicaes de mdio a grande porte, onde o time de
desenvolvedorestemvriaspessoasepodesempreviramudarecrescer.Notenhadvidas
quecriaraprimeiraversoumaaplicaousandoJava,mesmoutilizandoIDEseferramentas
poderosas,sermaistrabalhosoqueusarumalinguagemscriptoudealtaprodutividade.Porm,
comumalinguagemorientadaaobjetosemaduracomooJava,serextremamentemaisfcile
rpidofazeralteraesnosistema,desdequevocsigaasboasprticas,recomendaese
designpatterns.
Almdisso,aquantidadeenormedebibliotecasgratuitas,pararealizarosmaisdiversos
trabalhos (tais como relatrios, grficos, sistemas de busca, gerao de cdigo de barra,
manipulaodeXML,tocadoresdevdeo,manipuladoresdetexto,persistnciatransparente,
impresso, etc) um ponto fortssimo para adoo do java: voc pode criar uma aplicao
sofisticada,usandodiversosrecursos,semprecisarcomprarumcomponenteespecfico,que
costumasercarodeacordocomsuaespecializao.
Cadalinguagemtemseuespao eseumelhoruso.Ousodojavainteressante em
aplicaesqueviroacrescer,emquealegibilidadedocdigoimportante,ondetemosmuita
conectividadeesetemosplataformas(ambientesesistemasoperacionais)heterogneos(linux,
unix,OSXewindowsmisturados).
Voc pode ver isso pela quantidade enorme de ofertas de emprego procurando
desenvolvedoresJavaparatrabalharcomsistemaswebeaplicaesdeintegraonoservidor.
Apesar disto, a Sun empenhase em tentat popularizar o uso do Java em aplicaes
desktop, mesmo com o fraco marketshare do Swing/AWT/SWT em relao as tecnologias
concorrentes(emespecialMicrosoft.NET).

2.7 - Especificao versus implementao


Outropontoimportante:quandofalamosdeJavaVirtualMachineestamosfalandodeuma
especficao. EladizcomoobytecodedeveserinterpretadopelaJVM.Quandofazemoso
downloadnositedaSun,oquevemjuntoaSunJVM.Emoutraspalavras,existemoutras
Captulo2OqueJavaPgina7

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

JVMsdisponveis,comoaJrockitdaBEA,entreoutras.
Issooutropontointeressanteparaasempresas.Casoelasnoestejamgostandode
algumdetalhedaJVMdaSun,ouprefiramtrabalharcomoutraempresapagandoporsuporte,
elaspodemtrocardeJVMtendoagarantiaabsolutaquetodoosistemacontinuarfuncionando,
tendoemvistaqueelacertificadapelaSun,precisandoaceitaromesmobytecode.Vocnem
precisarecompilarnenhumadesuasclasses.
Almdeindependnciadehardwareesistemaoperacional,voctemaindependnciade
vendor:graasaidiadaJVMserumaespecificaoenoumsoftware.

2.8 - Como o FJ11 est organizado


Javaumalinguagemsimplesnosentidodequeasregrasnosomuitas.Quebraro
paradigmaproceduralparamergulharnaorientaoaobjetosnosimples.Esseoobjetivo
doFJ11.
Ocomeopodeserumpoucofrustrante:exemplosbanais,controledefluxosimplescom
oif,for, whileecriaodepequenosprogramasquenemaomenoscaptaminformaodo
teclado.Pormistotudonecessrio,snos20%finaisdocursoqueestaremosutilizando
bibliotecas para no final criarmos um chat entre duas mquinas que transferem Strings por
TCP/IP,eteremostudoquenecessrioparaentendercompletamentecomoaAPIfunciona,
quemestendequem,eoporqu.
DepoisdessecaptuloondeoJava,JVMeprimeirosconceitossopassados,veremosos
comandosbsicos do java para controle de fluxo e utilizao de variveis do tipo primitivo..
Criaremosclassesparatestaressepequenoaprendizado,semmesmosaberoquerealmente
uma classe. Isso dificulta ainda mais a curva de aprendizado, porm cada conceito ser
introduzidonomomentoconsideradomaisapropriadopelosautores.
Passamosparaocaptulodeorientaoaobjetosbsico,mostrandoosproblemasdo
paradigmaproceduraleanecessidadedealgopararesolv+los.Atributos,mtodos,variveis
dotiporefernciaeoutros.Depoisumrpidopulopelasarrays.
Os captulos de modificadores de acesso, herana, classes abstratas e interfaces
demonstramoconceitofundamentalqueocursoquerpassar:encapsule,exponhaomnimode
suasclasses,foquenoqueelasfazem,norelacionamentoentreelas,comumamodelagemboa
acodificaoficafcil,eamodificaoeexpansodosistema
EnquantoissooEclipseintroduzidodeformanatural,evitandoseaomximowizardse
menus,esimocodeassisteseusquickfixes.IssofazcomqueoEclipsetrabalhedeforma
simbiticacomodesenvolvedor,semseintrometerefazermgica.
Pacotes,javadoc,jarsejava.langapresentamosltimosconceitosfundamentaisdoJava,
dandotodaafundaoparaagorapassarmosaestudarasprincipaisemaisutilizadasAPIsdo
JavaSE.
Java.util,java.ioejava.netsoessasAPIs,todaselasusameabusamdosconceitos
vistosnodecorrerdocurso,ajudandoasedimentlos.Juntamentetemososconceitosbsicos
dousodeThreads,eosproblemaseperigosdaprogramaoconcorrentequandodadosso
compartilhados.
Resumindo: o objetivo do curso apresentar o Java ao mesmo tempo que os
fundamentosdaorientaoaobjetossointroduzidos.Bateremosmuitonopontodedizerqueo
importantecomoasclassesserelacionamequalopapeldecadauma,enoemcomoque
elasfazemassuasobrigaes.Programevoltadoainterface,enoaimplementao.Nofinal
Captulo2OqueJavaPgina8

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

docursoautilizaodospacotesjava.io,java.utilejava.netreforarotodonossoaprendizado,
tendo em vista que essas bibliotecas foram desenvolvidas com o objetivo de reutilizao e
extenso,entoelasabusamdosconceitospreviamentevistos.

2.9 - Instalando o Java


Antes de instalar, baixe o JDK 5.0 ou superior, do site do Java da Sun, em
http://java.sun.com.Pegueaversointernacionalecuidadoparanobaixaroquetemmaisde
90megas,queaprimeiraoponapginadedownload:estaversovemcomoNetbeans,
queumaferramentadaSun,enonosinteressanomomento.Maisparabaixodapgina
existeumaversomenor,algoemtornode60megas,semessaferramenta.
EssesoftwaredisponvelnaSungratuito,assimcomoasprincipaisbibliotecasJavae
ferramentas.
interessantevoctambmbaixaradocumentaodoJDK5.0,olinkseencontrana
mesmapginaepossuioutros40megas.
OprocedimentodeinstalaonoWindowsmuitosimples:bastavocexecutaroarquivo
eseguirospassos.Instaleonodiretriodesejado.
Depois disso, necessrio configurar algumas variveis de ambiente, para que voc
possaexecutarocompiladorJavaeamquinavirtualdequalquerdiretrio.EmcadaWindows
vocconfiguraasvariveisdeambientedeumamaneiradiferente.Soduasasvariveisque
vocdevemudar:
CLASSPATH=.
PATH=<oquejaestavaantes>;c:\diretorioDeInstalacaoDoJava\bin

CLASSPATH

Avarivel PATH provavelmentejtemmuitacoisaevocsprecisaacrescentar.Ja


varivel CLASSPATH devesercriada.NoLinux,soasmesmasvariveis,maso PATH
separadopor :.NosWindowsvelhos,comoo98,vocdevealterarissono autoexec.bat.
Nos Windows mais novos, como NT, 2000, e XP, procure onde voc pode adicionar novas
variveis de ambiente (em Iniciar Painel de Controle Sistema Avanado Variveis de
Sistema).NoLinux,geralmenteaalteraodeverserfeitanoarquivo ~/.bashrc sevocno
tiverprivilgiosdeadministrador.
Sevocpossuidvidassobreainstalaoeconfiguraogeraldoambiente,consulteo
tutorialnositedoguj:http://www.guj.com.br.

VersesdoJava
ExisteumaquantidadeassombrosadesiglasenmerosaoredordoJava.Nocomeoissopode
ser bastante confuso, ainda mais porque cada biblioteca do Java mantm seu prprio
versionamento.
Talvez,oquesejamaisestranhootermoJava2.Semprequevocforleralgumacoisasobre
Java,vaiouvirfalaremJava2ouJ2comoprefixodealgumasigla.NaverdadenoexisteJava2.0,
acontecequequandoaSunlanouaverso1.2doJava fizeramumajogadademarketinge
decidiramchamladeJava2.
Hojeemdia,oJavaestnaverso1.5,masomarketingutilizaJava25.0.

Java5.0eJava1.4
MuitaspessoasestomigrandoparaoJava5.0,mascomoelemaisrecente,algumasempresas

Captulo2OqueJavaPgina9

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

voseprenderaoJava1.4durantemuitotempo.Houveumamudanasignificativanalinguagem
entreessasduasverses,comcertezaamaissignificativa).
Nodecorrerdocurso,todososrecursoseclassesqueforemexclusivamentedoJava5.0tero
estefatodestacado.
AversoJava 6.0jestemdesenvolvimentoecomoprovvellanamentonofimde2006.
Apesar do nome, no h mudana na linguagem prevista, apenas melhorias na JVM e novas
bibliotecas.

J2EE?JavaEE?
Se voc est comeando agora com Java, no dever comear pelo J2EE. Isso no importa
agora.
Quando voc ouvir falar em Servlets, JSP e EJB, isso tudo faz parte do J2EE. Apesar da
esmagadoraquantidadedevagasdeempregoparaJavaestaremno J2EE,elaapenasuma
especificao,algorelativamentesimplesdeaprenderdepoisquevocfirmarbemosconceitosdo
Java.
Novamente,nocomeceaprendendoJavaatravsdoJ2EE.

2.10 - Compilando o primeiro programa


Vamosparaonossoprimeirocdigo!Oprogramaqueimprimeumalinhasimples!
1.classMeuPrograma{
2.
publicstaticvoidmain(String[]args){
3.
System.out.println("MinhaprimeiraaplicaoJava!!");
4.
}
5.}

Notao
Todososcdigosapresentadosnaapostilaestoformatadoscomrecursosvisuaisparaauxiliara
leituraecompreensodosmesmos.Quandofordigitaroscdigosnocomputador,trateoscdigos
comotextosimples.
Anumeraodaslinhas no fazpartedocdigoenodeveserdigitada;apenasumrecurso
didtico.Ojavacasesensitive:tomecuidadocommaiusculaseminusculas.
Apsdigitarocdigoacima,graveocomoMeuPrograma.javaemalgumdiretrio.Para
compilar, voc deve pedir para que o compilador de Java da Sun, chamado javac, gere o
bytecodecorrespondentedoseucdigoJava.

Captulo2OqueJavaPgina10

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Depois de compilar, o bytecode foi gerado. Quando o sistema operacional listar os


arquivoscontidosnodiretrioatual,vocpoderverqueumarquivo.classfoigerado,como
mesmonomedasuaclasseJava.

Assustadocomocdigo?
ParaquemjtemumaexperinciacomJava,esseprimeirocdigomuitosimples.Masseseu
primeirocdigoemJava,podeserumpoucotraumatizante.Nodeixedeleroprefciodocurso,
quedeixarvocmaistranqilo.

PrecisosempreprogramarusandooNotepadousimilar?
NonecessriosempredigitarseuprogramaemumsimplesaplicativocomooNotepad.Voc
podeusarumeditorquetenhasyntaxhighlightingeoutrosbenefcios.
Mas,nocomeo,interessantevocusaralgoquenopossuaferramentas,paraquevocpossa
seacostumarcomoserrosdecompilao,sintaxe,eoutros.Depoisdocaptulodepolimorfismoe
heranasugerimosautilizaodoEclipse(www.eclipse.org),aIDElderdomercado,egratuita.
ExisteumcaptuloaparteparaousodoEclipsenestaapostila.

2.11 - Executando seu primeiro programa


Os procedimentos para executar seu programa so
muitosimples.O javac ocompiladorJava,eo java o
responsvelporinvocaramquinavirtualparainterpretaro
seuprograma.
Ao executar, pode ser que a acentuao resultante
saiaerrada,devidoaalgumasconfiguraesquedeixamos
defazer;semproblemas.

2.12 - O que aconteceu?


1.classMeuPrograma{
2.
publicstaticvoidmain(String[]args){
3.
//miolodoprogramacomeaaqui!
4.
System.out.println("MinhaprimeiraaplicaoJava!!");
5.
//fimdomiolodoprograma
6.
}
7.}

MAIN

Omiolodoprogramaoqueserexecutadoquandochamamosamquinavirtual.Por
enquanto,todasaslinhasanteriores,ondehadeclaraodeumaclasseeadeummtodo,
noimportaparans.MasdevemossaberquetodaaplicaoJavacomeaporumpontode
entrada,eestepontodeentradaummtodomain.
Aindanosabemosoquemtodo,masveremosnocaptulo4.Atl,nosepreocupe
comessasdeclaraes.Semprequeumexerccioforfeito,ocdigosempreestarnessemiolo.
Nocasodonossocdigo,alinhado System.out.println fazcomqueocontedo
entreaspassejacolocadonatela.

2.13 - E o bytecode?
OMeuPrograma.classgeradonolegvelporsereshumanos(noquesejaimpossvel).
Eleestescritonoformatoqueavirtualmachinesabeentenderequefoiespecificadoqueela

Captulo2OqueJavaPgina11

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

deveentender.
como um assembly, escrito para esta mquina em especfico. Podemos ler os
menmnicosutilizandoaferramentajavapqueacompanhaoJDK:
javapcMeuPrograma

Easada:
MeuPrograma();
Code:
0:aload_0
1:invokespecial#1;//Methodjava/lang/Object."<init>":()V
4:return
publicstaticvoidmain(java.lang.String[]);
Code:
0:getstatic#2;//Fieldjava/lang/System.out:Ljava/io/PrintStream;
3:ldc#3;//StringMinhaprimeiraaplicaoJava!!
5:invokevirtual#4;//Method
java/io/PrintStream.println:(Ljava/lang/String;)V
8:return
}

ocdigoacimaqueaJVMsabeler.Sim,umbytecodepodeserrevertidoparao.java
original(comperdadecomentriosenomesdevariveislocais).Casoseusoftwarevvirarum
produtodeprateleira,fundamentalpassarumobfuscadornoseucdigo,quevaiembaralhar
classes,mtodoseummontedeoutrosrecursos.(vejahttp://proguard.sf.net).

2.14 - Exerccios
1)Altereseuprogramaparaimprimirumamensagemdiferente.
2)Altereseuprogramaparaimprimirduaslinhasdetextousandoduaslinhasdecdigo
System.out.
3) Sabendo que os caracteres \n representam uma quebra de linhas, imprima duas
linhasdetextousandoumanicalinhadecdigoSystem.out.

2.15 - O que pode dar errado?


Muitoserrospodemocorrernomomentoquevocrodarseuprimeirocdigo.Vamosver
algunsdeles:
Cdigo:
1.publicclassX{
2.
publicstaticvoidmain(String[]args){
3.
System.out.println("Faltapontoevrgula")
4.
}
5.}
Erro:
X.java:4:';'expected
}
^
1error

Captulo2OqueJavaPgina12

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Esse o erro de compilao mais comum: aquele onde um ponto e vrgula fora
esquecido.Outroserrosdecompilaopodemocorrersevocescreveupalavraschaves(aque
colocamosemnegrito)emmaisculas,esqueceudeabrirefecharas{},etc.
Duranteaexecuo,outroserrospodemaparecer:
SevocdeclararaclassecomoX,compillaedepoistentaruslacomoxminsculo
(javax),oJavateavisa:
Exceptioninthread"main"java.lang.NoClassDefFoundError:X(wrongname:x)

Setentaracessarumaclassenodiretrioouclasspatherrado,ouseonomeestiver
errado,ocorreroseguinteerro:
Exceptioninthread"main"java.lang.NoClassDefFoundError:X

SeesquecerdecolocarstaticouoargumentoString[]argsnomtodomain:
Exceptioninthread"main"java.lang.NoSuchMethodError:main

Porexemplo:
1.publicclassX{
2.
publicvoidmain(String[]args){
3.
System.out.println("Faltouostatic");
4.
}
5.}
Senocolocaromtodomaincomopublic:
Mainmethodnotpublic.

Porexemplo:
1.publicclassX{
2.
staticvoidmain(String[]args){
3.
System.out.println("Faltouopublic");
4.
}
5.}

2.16 - Um pouco mais...


1)Procureumcolega,oualgumconhecido,queestejaemumprojetoJava.Descubra
porqueJavafoiescolhidocomotecnologia.Oqueimportanteparaesseprojetoeoqueacabou
fazendodoJavaamelhorescolha?

2.17 - Exerccios
1)UmarquivofonteJavadevesempreteraextenso.java,ouocompiladororejeitar.
Alm disso, existem algumas outras regras na hora de dar o nome de um arquivo Java.
Experimentegravarocdigodestecaptulocom OutroNome.java oualgosimilar.Compilee
verifiqueonomedoarquivogerado.Comoexecutarasuaaplicaoagora?

Curiosidade
Tentecompilarumarquivosemnadadentro,nemumaletra,nemumaquebradelinha.Oque
acontece?

Captulo2OqueJavaPgina13

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Variveis primitivas e Controle de fluxo

Pssima idia, a de que no se pode mudar


Montaigne

IremosaprenderatrabalharcomosseguintesrecursosdalinguagemJava:
declarando,atribuindovalores,castingecomparandovariveis;
controledefluxoatravsdeifeelse;
instruesdelaoforewhile,controledefluxocombreakecontinue.

3.1 - Declarando e usando variveis


VARIVEIS

Dentrodeumbloco,podemosdeclararvariveiseuslas.
EmJava,todavariveltemumtipoquenopodesermudadoumavezquedeclarado:

tipoDaVaravelnomeDaVarivel;
INT

Porexemplo,possvelterumaidadequevaleumnmerointeiro:
intidade;
Comisso,vocdeclaraavarivelidade,quepassaaexistirapartirdestemomento.Ela
do tipo int, que guarda umnmero inteiro. A partir de agora voc pode usla, primeiro
atribuindovalores.
Alinhaaseguiratraduodeidade deve valer agora quinze.
idade=15;

ComentriosemJava
Parafazerumcomentrioemjava,vocpodeusaro // paracomentaratofinaldalinha,ou
entousaro/**/paracomentaroqueestiverentreeles.

/*comentriodaqui,
ateaqui*/
//umalinhadecomentriosobreaidade
intidade;
Almdeatribuir,vocpodeutilizaressevalor.Ocdigoaseguirdeclaranovamentea
varivel idade com valor 15 e imprime seu valor na sada padro atravs da chamada a
System.out.println.

//declaraaidade
intidade;
idade=15;

Captulo3VariveisprimitivaseControledefluxoPgina14

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

//imprimeaidade
System.out.println(idade);
Porfim,podemosutilizarovalordeumavarivelparaalgumoutropropsito,comoalterar
ou definir uma segunda varivel. O cdigo a seguir cria uma varivel chamada
idadeNoAnoQueVemcomvalordeidade mais um.

//geraumaidadenoanoseguinte
intidadeNoAnoQueVem;
idadeNoAnoQueVem=idade+1;
No momento que voc declara uma varivel, tambm possvel inicializla por
praticidade:
intidade=15;
OPERADORES
Voc pode usar os operadores +, , / e * para operar com nmeros, sendo eles
ARITMTICOS responsveis pela adio, subtrao, diviso e multiplicao, respectivamente. Alm desses

operadoresbsicos,hooperador % (mdulo)quenadamaismaisqueo resto de uma


diviso inteira.Vejaalgunsexemplos:

intquatro=2+2;
inttres=52;
intoito=4*2;
intdezesseis=64/4;
intum=5%2;//5divididopor2d2etemresto1;
//ooperador%pegaorestodadivisointeira

Ondetestaressescdigos?
Vocdevecolocaressestrechosdecdigodentrodomtodomain,quevimosnocaptuloanterior.
Isto,issodeveficarnomiolodoprograma.UsebastanteSystem.out.println,dessaforma
vocpodeveralgumresultado,casocontrrio,aoexecutaraaplicao,nadaaparecer.
Por exemplo, para imprimir a idade e a idadeNoAnoQueVem podemos escrever o seguinte
programadeexemplo:
1.classTestaIdade{
2.
3.
publicstaticvoidmain(String[]args){
4.
5.
//declaraaidade
6.
intidade;
7.
idade=15;
8.
9.
//imprimeaidade
10.
System.out.println(idade);
11.
12.
//geraumaidadenoanoseguinte
13.
intidadeNoAnoQueVem;
14.
idadeNoAnoQueVem=idade+1;
15.
16.
//imprimeaidade
17.
System.out.println(idadeNoAnoQueVem);
18.
19.
}
20.}
Captulo3VariveisprimitivaseControledefluxoPgina15

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Representarnmerosinteirosfcil,mascomoguardarvaloresreais,comofraesde
nmerosinteiroseoutros?Outrotipodevarivelmuitoutilizadoodouble,quearmazenaum
nmerocompontoflutuante.

DOUBLE

doubled=3.14;
doublex=5*10;
BOOLEAN

Otipobooleanarmazenaumvalorverdadeirooufalso,es.

booleanverdade=true;
Otipo char guardaumeapenasumcaractere.Essecaracteredeveestarentreaspas
simples. No se esquea dessas duas caractersticas de uma varivel do tipo char! Por
exemplo,elanopodeguardarumcdigocomopoisovazionoumcaractere!

CHAR

charletra='a';
System.out.println(letra);

3.2 - Tipos primitivos e valores


ATRIBUIO

EssestiposdevariveissotiposprimitivosdoJava:ovalorqueelasguardamsooreal
contedo da varivel. Quando voc utilizar o operador de atribuio = o valor ser
copiado.

inti=5;//irecebeumacpiadovalor5
intj=i;//jrecebeumacpiadovalordei
i=i+1;//ivira6,jcontinua5
Aqui,ificacomovalorde6.Masej?Nasegundalinha,jestvalendo5.Quandoi
passaavaler6,serquejtambmficavalendo?No,poisovalordeumtipoprimitivosempre
copiado.
Apesardalinha2fazerj=i,apartirdessemomentoessasvariveisnotemrelao
nenhuma:oqueacontecercomumanorefleteemnadacomaoutra.

Outrostiposprimitivos
Vimosaquiostiposprimitivosquemaisaparecem.OJavatemoutros,quesoo byte, short,
longefloat.
Cada tipo possui caractersticas especiais que, para um programador avanado, podem fazer
muitadiferena.

3.3 - Exerccios
1)Naempresaondetrabalhamos,htabelascomoquantofoigastoemcadams.Para
fechar o balano do primeiro trimestre, precisamos somar o gasto total. Sabendo que, em
Janeirofoigasto15000reais,emFevereiro,23000reais eemMaro,17000reais,faaum
programaquecalculeeimprimaogastototalnotrimestre.Sigaessespassos:
a) Crie uma classe chamada BalancoTrimestral com um bloco main, como nos
exemplosanteriores;

Captulo3VariveisprimitivaseControledefluxoPgina16

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

b) Dentro do main (o miolo do programa), declare uma varivel inteira chamada


gastosJaneiroeinicializeacom15000;
c) Crie tambm as variveis gastosFevereiro e gastosMarco, inicializandoas com
23000e17000,respectivamente,utilizeumalinhaparacadadeclarao;
d)Crieumavarivelchamada gastosTrimestre einicializeacomasomadasoutras3
variveis:
int gastosTrimestre = gastosJaneiro + gastosFevereiro +
gastosMarco
e)ImprimaavarivelgastosTrimestre.
2)(opcional)Adicionecdigo(semalteraraslinhasquejexistem)noprogramaaseguir
paraimprimiroresultado:
Resultado:15,15.1,y,false
1.classExercicioSimples{
2.
3.publicstaticvoidmain(String[]args){
4.
5.
inti=10;
6.
doubled=5;
7.
charc='t';
8.
booleanb=true;
9.
10.
//imprimeconcatenandodiversasvariveis
11.
System.out.println("Resultado:"+i+","+d+","+c+","+
b);
12.
13.}
14.}
3)(opcional)Procureporcodeconventionsnocampodebuscadositejava.sun.com.

3.4 - Casting e promoo


Algunsvaloressoincompatveissevoctentarfazerumaatribuiodireta.Enquantoum
nmerorealcostumaserrepresentadoemumavariveldotipodouble,tentaratribuireleauma
varivelintnofuncionapoisumcdigoquediz:i deve valer d,masnosesabesed
realmenteumnmerointeiroouno.

doubled=3.1415;
inti=d;//nocompila
Omesmoocorrenoseguintetrecho:
inti=3.14;
Omaisinteressante,quenemmesmooseguintecdigocompila:
doubled=5;//ok,odoublepodeconterumnmerointeiro
inti=d;//nocompila
Apesarde5serumbomvalorparaumint,ocompiladornotemcomosaberquevalor
estardentrodesse double nomomentodaexecuo.Essevalorpodetersidodigitadopelo
Captulo3VariveisprimitivaseControledefluxoPgina17

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

usurio,eningumvaigarantirqueessaconversoocorrasemperdadevalores.
Jnocasoaseguirocontrrio:
inti=5;
doubled2=i;
Ocdigoacimacompilasemproblemas,jqueum double podeguardarumnmero
com ou sem ponto flutuante. Todos os inteiros representados por uma varivel do tipo int
podemserguardadosemumavariveldouble,entonoexistemproblemasnocdigoacima.

CASTING

svezes,precisamosqueumnmeroquebradosejaarredondadoearmazenadonum
nmerointeiro.Parafazerissosemquehajaoerrodecompilao,precisoordenarqueo
nmeroquebradosejamoldado (casted)comoumnmerointeiro.Esseprocessorecebeo
nomedecasting.
doubled3=3.14;
inti=(int)d3;
Ocastingfoifeitoparamoldaravariveld3comoumint.Ovalordelaagora3.
Omesmoocorreentrevaloresintelong.
longx=10000;
inti=x;//naocompila,poispodeestarperdendoinformao
E,sequisermosrealmentefazerisso,fazemosocasting:
longx=10000;
inti=(int)x;

Casosnotocomunsdecastingeatribuio
Algunscastingsaparecemtambm:
floatx=0.0;
Ocdigoacimanocompilapoistodososliteraiscompontoflutuantesoconsideradosdouble
pelo Java. E float no pode receber um double sem perda de informao, para fazer isso
funcionarpodemosescreveroseguinte:
floatx=0.0f;
Aletra f,quepodesermisculaouminscula,indicaqueaqueleliteraldevesertratadocomo
float.
longl=0.0L;
AletraL,quetambmpodesermisculaouminscula,indicaqueaqueleliteraldevesertratado
comolong.
Outrocaso,quemaiscomum:
doubled=5;
floatf=3;
floatx=(float)d+f;

Captulo3VariveisprimitivaseControledefluxoPgina18

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

VocprecisadocastingporqueoJavafazascontasevaiarmazenandosemprenomaiortipoque
apareceuduranteasoperaes,nocasoodouble.
Eumaobservaonomnimo,oJavaarmazenaemumint,nahoradefazerascontas.
Atcastingcomvariveisdotipo char podemocorrer.Onicotipoprimitivoquenopodeser
atribudoanenhumoutrotipooboolean.

Castingspossveis
AbaixoestorelacionadostodososcastspossveisnalinguagemJava,mostrandoquandovoc
querconverterdeumvalorparaoutro.AindicaoImpl.querdizerqueaquelecastimplcitoe
automtico,ouseja,vocnoprecisaindicarocastexplicitamente.(lembrandoqueotipoboolean
nopodeserconvertidoparanenhumoutrotipo)
PARA:

byte

short

char

int

long

float

double

byte

Impl.

(char)

Impl.

Impl.

Impl.

Impl.

short

(byte)

(char)

Impl.

Impl.

Impl.

Impl.

char

(byte)

(short)

Impl.

Impl.

Impl.

Impl.

int

(byte)

(short)

(char)

Impl.

Impl.

Impl.

long

(byte)

(short)

(char)

(int)

Impl.

Impl.

float

(byte)

(short)

(char)

(int)

(long)

Impl.

double

(byte)

(short)

(char)

(int)

(long)

(float)

DE:

Tamanhodostipos
Natabelaabaixo,estoostamanhosdecadatipoprimitivodoJava.
TIPO

TAMANHO

boolean

1bit

byte

1byte

short

2bytes

char

2bytes

int

4bytes

float

4bytes

long

8bytes

double

8bytes

3.5 - O If-Else
IF

AsintaxedoifnoJavaaseguinte
if(condicaoBooleana){
codigo;
}
Uma condio booleana qualquerexpressoque retorne true ou false.Para
Captulo3VariveisprimitivaseControledefluxoPgina19

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

isso,vocpodeusarosoperadores<,>,<=,>=eoutros.Umexemplo:

CONDIO
BOOLEANA

intidade=15;
if(idade<18){
System.out.println("Nopodeentrar");
}
Almdisso,vocpodeusaraclusulaelseparaindicarocomportamentoquedeveser
executadonocasodaexpressobooleanaserfalsa:

ELSE

intidade=15;
if(idade<18){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
OPERADORES
Voc pode concatenar expresses booleanas atravs dos operadores lgicos
LGICOS
OU.OErepresentadopelo&eoOUrepresentadopelo|.

E e

intidade=15;
booleanamigoDoDono=true;
if(idade<18&amigoDoDono==false){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
OPERADOR
DE NEGAO

Essecdigopoderiaaindaficarmaislegvel,utilizandoseooperadordenegao,o !.
Esseoperadortransformaumaexpressobooleanadefalseparatrueeviceversa.

intidade=15;
booleanamigoDoDono=true;
if(idade<18&!amigoDoDono){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
Reparenalinha3queotrechoamigoDoDono==false virou!amigoDoDono.Eles
tm o mesmo valor.
Paracompararseumavariveltemomesmovalorqueoutravarivelouvalor,utilizamos
ooperador ==.Reparequeutilizarooperador = vairetornarumerrodecompilao,jqueo
operador=odeatribuio.
intmes=1;
if(mes==1){
System.out.println(Vocdeveriaestardefrias);
}

&&ou&?
Emalgunslivros,logoserapresentadoavocdoistiposdeoperadoresdeOUedeE.Voc
realmentenoprecisasaberdistinguiradiferenaentreelesporenquanto.
Oqueacontecequeosoperadores && e || funcionamcomoseusoperadoresirmos,porm
Captulo3VariveisprimitivaseControledefluxoPgina20

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

elesfuncionamdamaneiramaisrpidapossvel,quandopercebemquearespostanomudar
mais, eles param de verificar as outras condies booleanas. Por isso eles so chamados de
operadoresdecurtocircuito(shortcircuitoperators).
if(true|algumaCoisa){
//...
}
OvalordealgumaCoisaseranalisadonessecaso.Reparequenoprecisaria,poisjtemosum
true.trueouqualqueroutracoisadsempretrue.
if(true||algumaCoisa){
//...
}
NestecasooalgumaCoisanoseranalisado.Podenofazersentidoterasduasopes,mas
em alguns casos interessante e til usar um ou outro, alm de dar diferena no resultado.
Veremosmaisadianteemoutroscaptulos.

3.6 - O While
LAO
WHILE

Owhileumcomandousadoparafazerumlao(loop),isto,repetirumtrechode
cdigo algumas vezes. A idia que esse trecho de cdigo seja repetido enquanto uma
determinadacondiopermanecerverdadeira.
intidade=15;
while(idade<18){
System.out.println(idade);
idade=idade+1;
}
Otrechodentrodoblocodo while serexecutadoatomomentoemqueacondio
idade<18 passeaserfalsa.Eissoocorrerexatamentenomomentoemque idade==
18,oquenoofarimprimir18.
inti=0;
while(i<10){
System.out.println(i);
i=i+1;
}
Jowhileacimaimprimede0a9.

3.7 - O For
FOR

Outrocomandodeloopextremamenteutilizadoofor.Aidiaamesmadowhile,
fazerumtrechodecdigoserrepetidoenquantoumacondiocontinuarverdadeira.Masalm
disso,o for isolatambmumespaoparainicializaodevariveiseomodificadordessas
variveis.Issofazcomquefiquemaislegvelasvariveisquesorelacionadasaoloop:
for(inicializacao;condicao;incremento){
codigo;
}
Umexemplooaseguir:
for(inti=0;i<10;i=i+1){
System.out.println(ol!);
}
Captulo3VariveisprimitivaseControledefluxoPgina21

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Reparequeesseforpoderiasertrocadopor:
inti=0;
while(i<10){
System.out.println(i);
i=i+1;
}
Porm, o cdigo do for indica claramente que a varivel i serve em especial para
controlar a quantidade de laos executados. Quando usar o for? Quando usar o while?
Dependedogostoedaocasio.

psincremento++
i=i+1 poderealmentesersubstitudopor i++ quandoisolado,porm,emalgunscasos,
temososeguinte:
inti=5;
intx=i++;
Qualovalordex?Odei,apsessalinha,6.
O operador ++, quando vem a frente da varivel, retorna o valor antigo, e incrementa (ps
incremento),fazendoxvaler5.
Sevoctivesseusadoo++antesdavarivel(princremento),oresultadoseria6,comosegue:
inti=5;
intx=++i;

3.8 - Controlando loops


Apesardetermoscondiesbooleanasnosnossoslaos,emalgummomentopodemos
decidirpararoloopporalgummotivoespecial,semqueorestodolaosejaexecutado.
for(inti=x;i<y;i++){
if(i%19==0){
System.out.println("Acheiumnmerodivisvelpor19entrexe
break;
}
}

y");

BREAK

Ocdigoacimavaipercorrerosnmerosdexayepararquandoencontrarumnmero
divisvelpor19,umavezquefoiutilizadaapalavrachavebreak.

CONTINUE

Da mesma maneira, possvel obrigar o loop a executar o prximo lao. Para isso
usamosapalavrachavecontinue.

for(inti=0;i<100;i++){
if(i>50&&i<60){
continue;
}
System.out.println(i);
}
Ocdigoacimanovaiimprimiralgunsnmeros.(Quaisexatamente?)

Captulo3VariveisprimitivaseControledefluxoPgina22

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

3.9 - Escopo das variveis


NoJava,podemosdeclararvariveisaqualquermomento.Porm,dependendodeonde
vocasdeclarou,elavaivalerdeumdeterminadopontoaoutro.

//aquiavarivelinoexiste
inti=5;
//apartirdaquielaexiste
ESCOPO

O escopo da varivel onomedadoaotrechodecdigoemqueaquelavarivel


existeequepossvelacessla.
Quandoabrimosumnovoblococomaschaves,asvariveisdeclaradasalidentro s
valem at o fim daquele bloco.

//aquiavarivelinoexiste
inti=5;
//apartirdaquielaexiste
while(condicao){
//oiaindavaleaqui
intj=7;
//ojpassaaexistir
}
//aquiojnoexistemais,masoicontinuaavaler
No bloco acima, a varivel j pra de existir quando termina o bloco onde ela foi
declarada. Se voc tentar acessar uma varivel fora de seu escopo, ocorrer um erro de
compilao.

Omesmovaleparaumif:
if(algumBooleano){
inti=5;
}
else{
inti=10;
}
System.out.println(i);//cuidado!
Aquiavarivelinoexisteforadoifedoelse!Sevocdeclararavarivelantesdo
if, vai haver outro erro de compilao: dentro do if e do else a varivel est sendo
redeclarada!Entoocdigoparacompilarefazersentidofica:
inti;
if(algumBooleano){
i=5;
}
else{
i=10;
Captulo3VariveisprimitivaseControledefluxoPgina23

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
System.out.println(i);
Umasituaoparecidapodeocorrercomofor:
for(inti=0;i<10;i++){
System.out.println("ol!");
}
System.out.println(i);//cuidado!

Nesteforavarivelimorreaoseutrmino,nopodendoseracessadadeforadofor,
umerrodecompilao.Sevocrealmentequeracessarocontadordepoisdoloopterminar,
precisadealgocomo:
inti;
for(i=0;i<10;i++){
System.out.println("ol!");
}
System.out.println(i);

3.10 - Um bloco dentro do outro


Umblocotambmpodeserdeclaradodentrodeoutro.Isto,umifdentrodeumfor,
ouumfordentrodeumfor,algocomo:
while(condicao){
for(inti=0;i<10;i++){
//cdigo
}
}

3.11 - Um pouco mais...


1)Vimosapenasoscomandosmaisusadosparacontroledefluxo.OJavaaindapossuio
do..whileeoswitch.Pesquisesobreelesedigaquandointeressanteusarcadaumdeles.
2) Algumas vezes temos vrios laos encadeados. Podemos utilizar o break para
quebrar o lao mais interno, mas se quisermos quebrar um lao mais externo, teremos de
encadeardiversos ifseseucdigoficarumabaguna.OJavapossuiumartifciochamado
labeled loops,pesquisesobreeles.
3)Oqueacontecesevoctentardividirumnmerointeiropor0?Epor0.0?
4)Existeumcaminhoentreostiposprimitivosqueindicamsehanecessidadeouno
decastingentreostipos.Porexemplo,int>long>double(umintpodesertratadocomo
um double,masnoocontrrio).Pesquise(outeste),eposicioneosoutrostiposprimitivos
nessefluxo.
5)Existemoutrosoperadores,comoo%,<<,>>.Descubraparaqueservem.
6)Almdosoperadoresdeincremento,existemosdedecremento,como i e i,
almdesse,vocpodeusarinstruesdotipoi+=xei=x,oqueessasinstruesfazer?
Teste.

3.12 - Exerccios
Captulo3VariveisprimitivaseControledefluxoPgina24

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Maisexercciosdefixaodesintaxe.Quemjconheceumpoucodejavapodesermuito
simples,masrecomendamosfortementequevocfaaosexercciosparaseacostumarcom
errosdecompilao,mensagensdojavac,convenodecdigo,etc...
Apesardeextremamentesimples,precisamospraticarasintaxequeestamosapredendo.
Para cada exerccio, crie um novo arquivo com extenso java, e declare aquele estranho
cabealho,dandonomeaumaclasseecomummtodomaindentrodele:
classExercicioX{
publicstaticvoidmain(String[]args){
//seuexerciciovaiaqui
}
}
Nocopieecoledeumexercciojexistente!Aproveiteparapraticar.
1)Imprimatodososnmerosde150a300.
2)Imprimaasomade1at1000.
3)Imprimatodososmltiplosde3,entre1e100.
4)Imprimaosfatoriaisde1a10.
Ofatorialdeumnmeronn*n1*n2...atn=1.Lembresedeutilizarosparnteses.
Ofatorialde01
Ofatorialde1(0!)*1=1
Ofatorialde2(1!)*2=2
Ofatorialde3(2!)*3=6
Ofatorialde4(3!)*4=24
Faaumforqueinicieumavariveln(nmero)como1efatorial(resultado)como1e
variande1at10:
for(intn=1,fatorial=1;n<=10;n++){

5)Aumenteaquantidadedenmerosqueteroosfatoriaisimpressos,at20,30,40.Em
um determinado momento, alm desse clculo demorar, vai comear a mostrar respostas
completamenteerradas.Porque?Mudedeintparalong,evocpoderveralgumamudana.
6)(opcional)ImprimaosprimeirosnmerosdasriedeFibonacciatpassarde100.A
sriedeFibonacciaseguinte:0,1,1,2,3,5,8,13,21,etc...Paracalculla,oprimeiroe
segundo elementos valem 1, da por diante, o nsimo elemento vale o n1simo elemento
somandoaon2simoelemento(ex:8=5+3).
7) (opcional) Escreva um programa que, dada uma varivel x (com valor 180, por
exemplo),temosydeacordocomaseguinteregra:
sexpar,y=x/2
seximpar,y=3*x+1
imprimey
Oprogramadeveentojogarovalordeyemxecontinuaratqueytenhaovalorfinal
de1.Porexemplo,parax=13,asadaser:
40>20>10>5>16>8>4>2>1

Imprimindosempularlinha
Captulo3VariveisprimitivaseControledefluxoPgina25

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Umdetalheimportantedomtodoqueestamosusandoatagoraqueumaquebradelinha
impressatodavezquechamado.Paranopularumalinhausamosomtodoaseguir:
System.out.print(variavel);
8)(opcional)Imprimaaseguintetabela,usandoforsencadeados:
1
24
369
481216
nn*2n*3....n*n

3.13 - Desafios
1)FaaoexercciodasriedeFibonacciusandoapenasduasvariveis.

Captulo3VariveisprimitivaseControledefluxoPgina26

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Orientao a objetos bsica


Programao orientada objetos uma pssima idia, que s
poderia ter nascido na Califrnia.
EdsgerDijkstra

Aotrminodestecaptulo,vocsercapazde:
dizeroqueeparaqueserveorientaoaobjetos,
conceituarclasses,atributosecomportamentose
entenderosignificadodevariveiseobjetosnamemria.

4.1 - Motivao: problemas do paradigma procedural


ORIENTAO
OBJETOS

Orientaoobjetosumamaneiradeprogramarqueajudanaorganizaoeresolve
muitosproblemasenfrentadospelaprogramaoprocedural.
ConsideremosoclssicoproblemadavalidaodeumCPF. Normalmente, temosum
formulrio,noqualrecebemosessainformao,edepoistemosqueenviaressescaracteres
paraumafunoqueirvalidlo,comonopseudocdigoabaixo:

cpf=formulario>campo_cpf
valida(cpf)

AlgumteobrigaasemprevalidaresseCPF?Vocpode,inmerasvezes,esquecerde
chamaressevalidador.Mais:considerequevoctem50formulrioseprecisevalidaremtodos
elesoCPF.Sesua equipetem3programadorestrabalhandonessesformulrios,quem fica
responsvelporessavalidao?Todos!
Asituaopodepiorar:naentradadeumnovodesenvolvedor,precisaramosavisloque
sempredevemosvalidarocpfdeumformulrio.nessemomentoquenasceaquelesguiasde
programaoparao desenvolvedor quefor entrarnesse projeto (as vezes um documento
enorme). Em outras palavras, todo desenvolvedor precisaficar sabendo de umaquantidade
enormedeinformaes,quenamaioriadasvezesnoestrealmenterelacionadoasuaparte
nosistema,maseleprecisalertudoisso,resultandoumentravemuitogrande!E
Outro ponto onde fica claro os problemas da programao procedural quando nos
encontamosnanecessidadedelerocdigoquefoiescritoporoutrodesenvolvedorequesomos
usurio desse pedao do sistema. Um sistema bem encapsulado no deveria gerar essa
necessidade.Emumsistemagrandesimplesmentenotemostempodelerumagrandeparte
docdigo.
Considerando que voc no erre a e quesua equipe tem uma comunicao muitog
rande (perceba que comunicao excessiva pode ser prejudicial e atrapalhar o andamento),
aindatemosoutroproblema:imaginequeagoraemtodoformulriovoctambmquerquea
idadedoclientetambmsejavalidada,precisesermaiorde18anos.Vamosterdecolocarum
if...masonde?Espalhadoportodoseucdigo...Mesmoquesecrieoutrafunoparavalidar,
precisaremos incluir isso nos nossos 50 formulrios j existentes. Qual a chance de
esquecermosemumdeles?muitogrande.
Captulo4OrientaoaobjetosbsicaPgina27

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Aresponsabilidadedeverificarseoclientetemounotem18anos,ficouespalhadapor
todoseucdigo.Seriainteressantepoderconcentraressaresponsabilidadeemumlugars,
paranoterchancesdeesquecerisso.
Melhoraindaseriaseconseguissemosmudaressavalidaoeosoutrosprogramadores
nemprecisassemficarsabendodisso.Emoutraspalavras,elescriariamformulrioseumnico
programadorseriaresponsvelpelavalidao:osoutrosnemsabemdaexistnciadessetrecho
decdigo.Ummundoideal?No,oparadigmadaoerientaoaobjetofacilitatudoisso.
Oproblemaquenoexisteumaconexoentreseusdados!Noexisteumaconexo
entreseusdadosesuasfuncionalidades!Aidiateressaamarraatravsdalinguagem.

Quaisasvantagens?
Orientaoaobjetosvaiteajudaremmuitoemseorganizareescrevermenos,almdeconcentrar
asresponsabilidadesnospontoscertos,flexibilizandosuaaplicao, encapsulando algicade
negcios.
Outra enorme vantagem, de onde voc realmente vai economizar montanhas de cdigo, o
polimorfismodasreferncias,queveremosemumposteriorcaptulo.

4.2 - Criando um tipo


Considere um programa para um banco, bem fcil perceber que uma entidade
extremamenteimportanteparaonossosistemaaconta.Nossaidiaaquigeneralizarmos
algumainformao,juntamentecomfuncionalidadesquetodacontadeveter.
Oquetodacontatemeimportanteparans?
nmerodaconta
nomedocliente
saldo
limite
Oquetodacontafazeimportanteparans?Isto,oquegostaramosdepedir
conta.
sacaumaquantidadex
depositaumaquantidadex
imprimeonomedodonodaconta
devolve o saldo atual
transfere uma quantidade x para uma outra conta y
devolve o tipo de conta
Comissotemosoprojetodeumacontabancria.Podemospegaresseprojetoeacessar
seusaldo?No.Oquetemosaindaoprojeto.Antesprecisamosconstruirumaconta,para
poderacessaroqueelatem,epedirparaelafazeralgumacoisa.

Captulo4OrientaoaobjetosbsicaPgina28

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Reparenafigura:apesardopapeldoladoesquerdoestarespecificadoumaConta,essa
especificaoumaConta?Nsdepositamosesacamosdinheirodessepapel?No.Utilizamos
aespecificaodaContaparapodercriarinstncias,querealmentesocontas,ondepodemos
realizarasoperaesquecriamos.Apesardedeclararmosquetodacontatemumsaldo,um
nmeroeumaagncianopedaodepapel(comoaesquerdanafigura),sonasinstncias
desseprojetoquerealmentehespaoparaarmazenasessesvalores.
CLASSE

Ao projeto da conta, isto , a definio da conta, damos o nome de classe. O que


podemosconstruirapartirdesseprojeto,quesoascontasdeverdade,damosonomede
objetos.
Apalavra classe vemdataxonomiadabiologia.Todososseresvivosdeumamesma
classe biolgicatemumasriede atributos e comportamentos emcomuns,masnoso
iguais,podemvariasnosvaloresdesses atributos ecomorealizamesses comportamentos.
HomoSapiens defineumgrupodeseresquepossuemcaracterstcasemcomuns,porma
definio (a idia, o conceito) de um Homo Sapies um ser humano? No. Tudo est
especificadonaclasseHomoSapiens,massequisermosmandaralgemcorrer,comer,pular,
precisaremos de uma instncia de Homo Sapiens, ou ento de um objeto do tipo Homo
Sapiens.
Umoutroexemplo:umareceitadebolo.Aperguntacerteira:voccomeumareceitade
bolo?No.Precisamosinstacila,criarumobjetoboloapartirdessaespecificao(aclasse)
parautilizla.Podemoscriarcentenasdebolosapartirdessaclasse(areceita,nocaso),eles
podemserbemsemelhantes,algunsatidnticos,massoobjetosdiferentes.
Podemosfazermilharesdeanalogiassemelhantes.Aplantadeumacasaumacasa?
Definitivamenteno.Nopodemosmorardentrodeumaplantadeumacasa,nempodemos
abrirsuaportaoupintarsuasparedes.Precisamosantesconstruirinstnciasapartirdessa
planta.Essasinstnciassimpodemos
Podeparecerbvio,masadificuldadeinicialdoparadigmadaorientaoaobjetosjusto
saberdistinguiroqueclasseeoqueobjeto.comumoinicianteutilizar,obviamentede
formaerrada,essasduaspalavrascomosinnimas.

4.3 - Uma classe em Java


VamoscomearapenascomoqueumaContatem,enocomoqueelafaz(veremos
logoemseguida).
Umtipodesses,comoespecificadodeContaacima,podeserfacilmentetraduzidopara
Java:

Captulo4OrientaoaobjetosbsicaPgina29

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

classConta{
intnumero;
Stringnome;
doublesaldo;
doublelimite;
//..
}

String
StringumaclasseemJava.Elaguardaumapalavra,issoumpunhadodecaracteres.Como
estamosaprendendooqueumaclasse,entenderemoscomdetalhesaclasseStringapenasem
captulosposteriores.

ATRIBUTO

Porenquantodeclaramosoquetodacontadeveter.Estessoosatributos quetoda
conta,quandocriada,vaiter.Reparequeessasvariveisforamdeclaradasforadeumbloco,
diferentedoqueagentefaziaquandotinhaaquele main.Quandoumavariveldeclarada
diretamentedentrodoescopodaclasse,chamadadevariveldeobjeto,ouatributo.

4.4 - Criando e usando um objeto


AgoratemosumaclasseemJava,queespecificaoquetodoobjetodessaclassedeveter.
Mascomousla?AlmdessaclasseaindateremosoPrograma.java,eapartirdeleque
iremosutilizaraclasseConta.
NEW

Paracriar(construir,instanciar)uma Conta,bastausarapalavrachave new,utilizamos


tambmoparnteses,quedescobriremosoqueexatamenteeleemumcaptuloposterior:
classPrograma{
publicstaticvoidmain(String[]args){
newConta();
}
}
Bem,ocdigoacimacriaumobjetodotipoConta,mascomoacessaresseobjetoquefoi
criado? Precisamos ter alguma forma de nos referenciar a esse objeto. Precisamos de uma
varivel:
classPrograma{
publicstaticvoidmain(String[]args){
ContaminhaConta;
minhaConta=newConta();
}
}
Pode parecer estranho escrevermos duas vezes Conta: uma vez na declarao da
varivel e outra vez no uso do new. Mas h um motivo que iremos entender tambm
posteriormente.
Captulo4OrientaoaobjetosbsicaPgina30

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Atravs da varivel minhaConta agora podemos acessar o objeto recm criado para
alterarseunome,seusaldoetc:
1.classPrograma{
2.
publicstaticvoidmain(String[]args){
3.
ContaminhaConta;
4.
minhaConta=newConta();
5.
6.
minhaConta.nome=Duke;
7.
minhaConta.saldo=1000.0;
8.
9.
System.out.println(Saldoatual:+minhaConta.saldo);
10.
}
11.}
importantefixarqueo ponto foiutilizadoparaacessaralgoem minhaConta.Agora,
minhaContapertenceaoDuke,etemsaldodemilreais.

4.5 - Mtodos
Dentrodaclasse,tambmiremosdeclararoquecadacontafaz,ecomoistofeito.Os
comportamentosquecadaclassetem,isto,oqueelafaz.Porexemplo,dequemaneiraque
umaContasacadinheiro?IremosespecificarissodentrodaprpriaclasseConta,enoemum
local desatrelado das informaes da prpria Conta.. por isso que essas funes so
chamadasdemtodoPoisamaneiradefazerumaoperaocomumobjeto.

MTODO

Queremos criar um mtodo que saca uma determinada quantidade e no retorna


nenhumainformaoparaquemacionaressemtodo:
voidsaca(doublequantidade){
doublenovoSaldo=this.saldoquantidade;
this.saldo=novoSaldo;
}
VOID

Apalavrachavevoiddizque,quandovocpedirparaacontaimprimironomedobanco,
nenhumainformaoserenviadadevoltaaquempediu.

ARGUMENTO

Quando algum pedir para sacar, ele tambm vai dizer quanto quer sacar. Por isso
precisamosdeclararomtodocomalgodentrodosparnteses,oquevaiadentrochamado
deargumentodomtodo(ouparmetro).Essavarivelumavarivelcomum,chamada
tambmdetemporriaoulocal,poisaofinaldaexecuodessemtodo,eladeixadeexistir.

PARMETRO

THIS

Dentrodomtodo,estamosdeclarandoumanovavarivel.Essavarivel,assimcomoo
argumento, vai morrer no fim do mtodo, pois este seu escopo. No momento que vamos
acessarnossoatributo,usamosapalavrachave this paramostrarqueesseumatributo,e
noumasimplesvarivel.(veremosdepoisqueopcional)
Reparequenessecaso,acontapodeestourarolimitefixadopelobanco.Maisparafrente
iremosevitaressasituao,edeumamaneiramuitoelegante.
Damesmaforma,temosomtodoparadepositaralgumaquantia:
voiddeposita(doublequantidade){
this.saldo+=quantidade;
}

Captulo4OrientaoaobjetosbsicaPgina31

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Observeque,agora,nousamosumavarivelauxiliareaindausamosaabreviao+=
paradeixaromtodobemsimples.O+=somaquantidadeaovalorantigodosaldoeguardano
prpriosaldoovalorresultante.

INVOCAO
DE MTODO

Paramandarumamensagemaoobjeto,epedirqueeleexecuteummtodo,tambm
usamosoponto.Otermousadoparaissoumainvocao de mtodo.
Ocdigoaseguirsacaumdinheiroedepoisdepositaoutraquantiananossaconta:

1.classSacaEDeposita{
2.
publicstaticvoidmain(String[]args){
3.
//criandoaconta
4.
ContaminhaConta;
5.
minhaConta=newConta();
6.
7.
//alterandoosvaloresdeminhaConta
8.
minhaConta.nome="Duke";
9.
minhaConta.saldo=1000;
10.
11.
//saca200reais
12.
minhaConta.saca(200);
13.
14.
//deposita500reais
15.
minhaConta.deposita(500);
16.
System.out.println(minhaConta.saldo);
17.
}
18.}
Umavezqueseusaldoinicial1000reais,sesacamos200reais,depositamos500reais
eimprimimosovalordosaldo,oqueserimpresso?

4.6 - Mtodos com retorno


Ummtodosempretequeretornaralgumacoisa,nemqueessacoisasejanada,como
nosexemplosanteriores,estvamosusandoovoid.
Um mtodo pode retornar um valor para o cdigo que o chamou. No caso do nosso
mtodosacapodemosdevolverumvalorbooleanoindicandoseaoperaofoibemsucedida.
booleansaca(doublevalor){
if(this.saldo<valor){
returnfalse;
}
else{
this.saldo=this.saldovalor;
returntrue;
}
}

RETURN

Agoraadeclaraodomtodomudou!Omtodosacanotemvoidnafrente,istoquer
dizerque,quandoacessado,eledevolvealgumtipodeinformao.Nocaso,umboolean.A
palavrachavereturnindicaqueomtodovaiterminarali,retornandotalinformao.

Captulo4OrientaoaobjetosbsicaPgina32

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Exemplodeuso:
minhaConta.saldo=1000;
booleanconsegui=minhaConta.saca(2000);
if(consegui){
System.out.println(Conseguisacar);
}else{
System.out.println(Noconseguisacar);
}
Ouentopossoeliminaravariveltemporria,sedesejado:
minhaConta.saldo=1000;
System.out.println(minhaConta.saca(2000));
Maisadianteveremosquealgumasvezesmaisinteressantelanarumaexceo
(exception)nessescasos.
Meuprogramapodemanternamemrianosumaconta,comomaisdeuma:
1.classTestaDuasContas{
2.
publicstaticvoidmain(String[]args){
3.
4.
ContaminhaConta;
5.
minhaConta=newConta();
6.
minhaConta.saldo=1000;
7.
8.
9.
ContameuSonho;
10.
meuSonho=newConta();
11.
meuSonho.saldo=1500000;
12.
13.
}
14.}

4.7 - Objetos so acessados por referncias


REFERNCIA

Quandodeclaramosumavarivelparaassociaraumobjeto,naverdade,essavarivel
noguardaoobjeto,esimumamaneiradeacesslo,chamadadereferncia.
poressemotivoque,diferentedostiposprimitivoscomointelong,precisamosdarnew
depoisdedeclaradaavarivel:

1.publicstaticvoidmain(Stringargs[]){
2.
Contac1;
3. c1=newConta();
4.
5. Contac2;
6.
c2=newConta();
7.}

Captulo4OrientaoaobjetosbsicaPgina33

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Ocorretoaquidizerque c1 serefereaumobjeto. Nocorreto dizerque c1 um


objeto,poisc1umavarivelreferncia,apesardequedepoisdeumtempoosprogramadores
javafalemTenhoumobjetocdotipoConta,masapenasparaencurtarafraseTenhouma
refernciacaumobjetodotipoConta.
Basta lembrar que em java uma varivel nunca um objeto. No h no java uma
maneiradecriarmosoqueconhecidocomoobjetopilhaouobjetolocal,poistodoobjetoem
java,semexceo,sempreacessadoporumavarivelreferncia.
Essecdigonosdeixanaseguintesituao:
Contac1;
c1=newConta();
Contac2;
c2=newConta();

Internamente,c1ec2voguardarumnmeroqueidentificaemqueposiodamemria
aquelaContaseencontra.Dessamaneira,aoutilizarmoso.paranavegar,ojavavaiacessara
Contaqueseencontranaquelaposiodememria,enoumaoutra.
Paraquemconhece,parecidocomumponteiro,pormvocnopodemanipulloe
utilizloparaguardaroutrascoisas.
Agoravamosaumoutroexemplo:
1.classTestaReferencias{
2.
publicstaticvoidmain(Stringargs[]){
3.
Contac1=newConta();
4.
c1.deposita(100);
5.
6.
Contac2=c1;//linhaimportante!
7.
c2.deposita(200);
8.
9.
System.out.println(c1.saldo);
10.
System.out.println(c2.saldo);
11.
}
12.}
Qualoresultadodocdigoacima?Oqueapareceaorodar?
Oqueaconteceaqui?Ooperador=copiaovalordeumavarivel.Masqualovalorda
varivel c1?oobjeto?No.Naverdade,ovalorguardadoareferncia(endereo)para
ondeoobjetoseencontranamemriaprincipal.
Namemria,oqueacontecenessecaso:

Captulo4OrientaoaobjetosbsicaPgina34

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Contac1=newConta();
Contac2=c1;

Quandofizemos c2=c1, c2 passaafazerrefernciaparaomesmoobjetoque c1


referencianesseinstante.
Ento,nessecdigoemespecifico,quandoutilizamosc1ouc2estamosnosreferindo
aexatamenteao mesmo objeto!Elassoduasrefernciasdistintas,pormapontamparao
mesmoobjeto!Comparlascom==irnosretornartrue,poisovalorqueelascarregamo
mesmo!
Outraformadeperceberquedemosapenasumnew,entospodehaverumobjeto
Contanamemria.
Ateno: noestamosdiscutindoaquiautilidadedefazerumarefernciaapontarpro
mesmo objeto que outra referncia est apontando. Essa utilidade ficar mais clara quando
passarmosvariveisdotiporefernciacomoargumentoparamtodos.

new
Oqueexatamentefazonew?
Onewexecutaumasriedetarefas,queveremosmaisadiante.
Mas,paramelhorentenderasrefernciasnoJava,saibaqueonew,depoisdealocaramemria
paraesseobjeto,devolveumaflecha,isto,umvalordereferncia.Quandovocatribuiissoem
umavarivel,essavarivelpassaasereferirparaessemesmoobjeto.
Podemosentoveroutrasituao:
1.publicstaticvoidmain(Stringargs[]){
2.
Contac1=newConta();
3.
c1.nome="Duke";
4.
c1.saldo=227;
5.
6.
Contac2=newConta();
7.
c2.dono="Duke";
8.
c2.saldo=227;
9.
10.
if(c1==c2){
11.
System.out.println("Contasiguais");
12.
}
13.}
Ooperador==comparaocontedodasvariveis,masessasvariveisnoguardamo
objeto, e sim o endereo em que ele se encontra. Como em cada uma dessas variveis
guardamosduascontascriadasdiferentemente,elesestoemespaosdiferentesdamemria,
oquefazotesteno if valer false.Ascontaspodemserequivalentesnonossocritriode
igualdade, porm eles no so o mesmo. Quando se trata de objetos, pode ficar mais fcil
Captulo4OrientaoaobjetosbsicaPgina35

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

pensarqueo== comparaseosobjetos(refernciasnaverdade)soomesmo,enoseso
iguais.

Parasabersedoisobjetostemomesmocontedo,vocprecisacompararatributopor
atributo.Veremosumasoluomaiseleganteparaissotambm.

4.8 - O mtodo transfere()


Esequisermosterummtodoquetransferedinheiroentreduascontas?Podemosfica
tentadosacriarummtodoquerecebedoisparmetros:conta1econta2dotipoConta.Mas
cuidado:assimestamospensandodemaneiraprocedural.
Aidiaquequandochamarmosomtodotransfere,jteremosumobjetodotipoConta
(othis),portantoomtodorecebeapenasumparmetrodotipoConta,aContadestino(alm
dovalor):
classConta{
//atributosemetodos...
voidtransfere(Contadestino,doublevalor){
this.saldo=this.saldovalor;
destino.saldo=destino.saldo+valor;
}
}

Paradeixarocdigomaisrobusto,poderamosverificarseacontapossuiaquantidadea
sertransferidadisponvel.Paraficaraindamaisinteressante,vocpodechamarosmtodos
depositaesacajexistentesparafazeressatarefa:
classConta{
//atributosemetodos...
Captulo4OrientaoaobjetosbsicaPgina36

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

booleantransfere(Contadestino,doublevalor){
booleanretirou=this.saca(valor);
if(retirou==false){
//nodeuprasacar!
returnfalse;
}
else{
destino.deposita(valor);
returntrue;
}
}
}

QuandopassamosumaContacomoargumento,oqueserqueacontecenamemria?
Serqueoobjetoclonado?
Nojava,apassagemdeparmetrofuncionacomoumasimplesatribuiocomonousodo
=.Entoesseparmetrovaicopiarovalordavariveldotipo Conta queforpassadocomo
argumento.Equalovalordeumavariveldessas?Seuvalorumendereo,umareferncia,
nuncaumobjeto.Porissonohcpiadeobjetosaqui.
Essetltimocdigopoderiaserescritocomumasintaxemuitomaissucinta.Como?

TransferePara
PercebequeonomedestemtodopoderiasertransfereParaaoinvsdestransfere.A
chamadadomtodoficamuitomaisnatural,possvellerafraseemportugusqueelatemum
sentido:
conta1.transferePara(conta2,50);
AleituradestecdigoseriaConta1transfereparaconta250reais.

4.9 - Continuando com atributos


Asvariveisdotipoatributo,diferentementedasvariveistemporrias(declaradasdentro
deummtodo),recebemumvalorpadro.Nocasonumrico,valem0,nocasode boolean,
valefalse.
VALORES
DEFAULT

Voctambmpodedarvalores default,comosegue:

1.classConta{
2.
intnumero=1234;
3.
Stringdono="Duke";
4.
Stringcpf="123.456.78910";
5.
doublesaldo=1000;
6.
doublelimite=1000;
Captulo4OrientaoaobjetosbsicaPgina37

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

7.}
Nessecaso,quandovoccriarumcarro,seusatributosjestopopuladoscomesses
valorescolocados.
Imagine que agora comeamos a crescer nossa classe Conta e adicionar nome,
sobrenomeecpfdoclientedonodaconta.Comearamosatermuitosatributos...esevoc
pensardireito,umaContanotemnome,nemsobrenomenemcpf,quemtemessesatributos
umCliente.Entopodemoscriarumanovaclasseefazerumacomposio
Seusatributostambmpodemserrefernciasparaoutrasclasses.Suponhaaseguinte
classeCliente:
1.classCliente{
2.
Stringnome;
3.
Stringsobrenome;
4.
Stringcpf;
5.}
1.classConta{
2.
intnumero;
3.
doublesaldo;
4.
doublelimite;
5.
Clientecliente;
6.
//..
7.}
Edentrodomaindaclassedeteste:
1.classTeste{
2.
publicstaticvoidmain(String[]args){
3.
ContaminhaConta=newConta();
4.
Clientec=newCliente();
5.
minhaConta.cliente=c;
6.
//...
7.
}
8.}
Aquisimplesmentehouveumaatribuio.Ovalordavarivelccopiadoparaoatributo
clientedoobjetoaqualminhaContaserefere.Emoutraspalavras,minhaContaagoratem
uma referncia ao mesmo Cliente que c se refere, e pode ser acessado atravs de
minhaConta.cliente.
Vocpoderealmentenavegarsobretodaessaestruturadeinformao,sempreusandoo
ponto:
ClienteclienteDaMinhaConta=minhaConta.cliente;
clienteDaMinhaConta.nome="Duke";
Ouaindapodefazerissodeumaformamaisdireta,eatmaiselegante:
minhaConta.cliente.nome="Duke";

NULL

Mas e se dentro do meu cdigo eu no desse new em Cliente e tentasse acessalo


diretamente?
classTeste{
publicstaticvoidmain(String[]args){
ContaminhaConta=newConta();
Captulo4OrientaoaobjetosbsicaPgina38

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

minhaConta.cliente.nome="paulo";
//...
}
}
Quando damos new em um objeto, ele o incializa com seus valores default, 0 para
nmeros, falsepara booleanenullparareferncias.nullumapalavrachaveemjava,
queindicaumarefernciaparanenhumobjeto.

Seemalgumcasovoctentaracessarumatributooumtododealgumqueestse
referenciando para null, voc receber um erro durante a execuo
(NullPointerException,queveremosmaisafrente).Daparaperceberentoqueonewno
trazumefeitocascata,amenosquevocdeumvalordefault(ouuseconstrutoresquetambm
veremosmaisafrente):
1.classConta{
2.
intnumero;
3.
doublesaldo;
4.
doublelimite;
5.
Clientecliente=newCliente();
6.
7.}

//quandochamaremnewConta,
//haveraumnewClienteparaele.

Comessecdigo,todanova Conta criadacriadojterumnovo Cliente associado,


sem necessidade de instancilo logo em seguida da instanciao de uma Conta. Qual
alternativavocdeveusar?Dependedocaso:paratodanovaContavocprecisadeumnovo
Cliente?essaperguntaquedeveserrespondida.Nessenossocasoarespostano,mas
dependedonossoproblema.
Ateno: para quem no est acostumado com ponteiros, pode ser bastante confuso
pensarsempreemcomoosobjetosestonamemriaparapodertirarasconclusesdeoque
ocorrer ao executar determinado cdigo, por mais simples que ele seja. Com tempo voc
adquireahabilidadederapidamentesaberoefeitodeatrelarasreferncias,semterdegastar
muitotempoparaisso.importantenessecomeovocestarsemprepensandonoestadoda
memria.ErealmentelembrarquenoJavaumavarivelnuncacarregaumobjeto,esimuma
refernciaparaelefacilitamuito.

Captulo4OrientaoaobjetosbsicaPgina39

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

4.10 - Para saber mais: Uma Fbrica de Carros


Alm do Banco que estamos criando, vamos ver como ficariam certas classes
relacionadasumafbricadecarros.VamoscriarumaclasseCarro,comcertosatributosque
descrevemsuascaractersticasecomcertosmtodosquedescrevemseucomportamento.
1.classCarro{
2.
Stringcor;
3.
Stringmodelo;
4.
doublevelocidadeAtual;
5.
doublevelocidadeMaxima;
6.
7.
//ligaocarro
8.
voidliga(){
9.
System.out.println("Ocarroestligado");
10.
}
11.
12.
//aceleraumacertaquantidade
13.
voidacelera(doublequantidade){
14.
doublevelocidadeNova=this.velocidadeAtual+quantidade;
15.
this.velocidadeAtual=velocidadeNova;
16.
}
17.
18.
//devolveamarchadocarro
19.
intpegaMarcha(){
20.
if(this.velocidadeAtual<0){
21.
return1;
22.
}
23.
if(this.velocidadeAtual>=0&&this.velocidadeAtual<40){
24.
return1;
25.
}
26.
if(this.velocidadeAtual>=40&&this.velocidadeAtual<80{
27.
return2;
28.
}
29.
return3;
30.
}
31.}
Agora,vamostestarnossoCarroemumprogramadetestes:
1.classTestaCarro{
2.
publicstaticvoidmain(String[]args){
3.
CarromeuCarro;
4.
meuCarro=newCarro();
5.
meuCarro.cor="Verde";
6.
meuCarro.modelo="Fusca";
7.
meuCarro.velocidadeAtual=0;
8.
meuCarro.velocidadeMaxima=80;
9.
10.
//ligaocarro
11.
meuCarro.liga();
12.
13.
//aceleraocarro
14.
meuCarro.acelera(20);
15.
System.out.println(meuCarro.velocidadeAtual);
16.
}
17.}
NossocarropodecontertambmumMotor:
1.classMotor{
2.
intpotencia;
3.
Stringtipo;
4.}
Captulo4OrientaoaobjetosbsicaPgina40

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

1.classCarro{
2.
Stringcor;
3.
Stringmodelo;
4.
doublevelocidadeAtual;
5.
doublevelocidadeMaxima;
6.
Motormotor;
7.
8.
//..
9.}
PodemosagoracriardiverosCarrosemexercomseusatributosemtodos,assimcomo
fizemosnoexemplodoBanco.

4.11 - Um pouco mais...


1)Quandodeclaramosumaclasse,ummtodo,ouumatributo,podemosdaronomeque
quiser,seguindoumaregra.Porexemplo,onomedeummtodonopodecomearcomum
nmero.Pesquisesobreessasregras.
2) Como voc pode ter reparado, sempre damos nomes as variveis com letras
minsculas. que existem convenes de cdigo, dadas pela Sun, para facilitar a
legibilidadedocdigoentreprogramadores.Essaconveno muitoseguida.Pesquisesobre
elanohttp://java.sun.com,procureporcodeconventions.
3)necessriousarapalavrachave this quandoforacessarumatributo?Paraque
entoutilizla?
4)Oexerccioaseguirirpedirparamodelarumfuncionrio.Existeumpadropara
representarsuasclassesemdiagramasqueamplamenteutilizadochamado UML.Pesquise
sobreele.

4.12 - Exerccios
O modelo de funcionrios a seguir ser utilizado para os exerccios de alguns dos
posteriorescaptulos.
OobjetivoaquicriarumsistemaparagerenciarosfuncionriosdoBanco.Osexerccios
dessecaptulosoextremamenteimportantes.
1) Modele um funcionrio. Ele deve ter onome do funcionrio, odepartamento onde
trabalha,seusalrio(double),adatadeentradanobanco(String),seuRG(String),eum
valorbooleanoqueindiqueseofuncionrioestnaempresanomomentoousejfoiembora.
Voc deve criar alguns mtodos de acordo como quevoc sentirnecessidade. Alm
deles,crieummtodo bonifica queaumentao salario dofuncionriodeacordocomo
parmetro passado como argumento. Crie tambm um mtodo demite que no recebe
parmetroalgum,smodificaovalorbooleanoindicandoqueofuncionrionotrabalhamais
aqui.
Aidiaaquiapenasmodelar,isto,sidentifiquequeinformaessoimportantes,eo
queumfuncionriofaz.DesenhenopapeltudooqueumFuncionariotemetudoqueelefaz.
2)TransformeomodeloacimaemumaclasseJava.Testea,usandoumaoutraclasse
quetenhaomain.VocdevecriaraclassedofuncionriochamadaFuncionario,eaclasse
detestevocpodenomearcomoquiser.Adetestedevepossuiromtodomain.
Umesboodaclasse:
Captulo4OrientaoaobjetosbsicaPgina41

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

classFuncionario{
doublesalario;
//seusoutrosatributosemtodos
voidbonifica(doublevalor){
//oquefazeraquidentro?
}
voiddemite(){
//oquefazeraquidentro?
}
}
Vocpode(edeve)compilarseuarquivojavasemquevocaindatenhaterminadosua
classe Funcionario.Issoevitarquevocrecebadezenasdeerrosdecompilaodeuma
vez s. Crie a classe Funcionario, coloque seus atributos, e antes de colocar qualquer
mtodo,compileoarquivojava. Funcionario.class sergerado,nopodemosexecutla
poisnohummain,masassimverificamosquenossaclasseFuncionariojesttomando
forma.

Esseumprocessoincremental.Procuredesenvolverassimseusexerccios,parano
descobrirsnofimdocaminhoquealgoestavamuitoerrado.
Umesboodaclassequepossuiomain:
1.classTestaFuncionario{
2.
3.
publicstaticvoidmain(String[]args){
4.
Funcionariof1=newFuncionario();
5.
6.
f1.nome="Fiodor";
7.
f1.salario=100;
8.
f1.bonifica(50);
9.
10.
System.out.println("salarioatual:"+f1.salario);
11.
12.
}
13.}
Incremente essa classe. Faa outros testes, imprima outros atributos e invoque os
mtodosquevoccriouamais.
Lembresedeseguiraconveojava,issoimportantssimo.Isto,nomeDeAtributo,
nomeDeMetodo,nomeDeVariavel,NomeDeClasse,etc...

Captulo4OrientaoaobjetosbsicaPgina42

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Todasasclassesnomesmoarquivo?
Porenquanto,vocpodecolocartodasasclassesnomesmoarquivo,eapenascompileesse
arquivo.Elevaigerarosdois.class.
Pormboaprticacriarumarquivo.javaparacadaclasse,eemdeterminadoscasos,vocser
obrigadoadeclararumaclasseemumarquivoseparado,comoveremosnocaptulo10.Istono
importanteparaoaprendizadonomomento.

3) Crie um mtodo mostra(), que no recebe nem devolve parmetro algum, e


simplesmenteimprimetodososatributosdonossofuncionrio.Dessamaneiravocnoprecisa
ficarcopiandoecolandoummontedeSystem.out.println()paracadamudanaetesteque
fizercomcadaumdeseusfuncionrios,vocsimplesmentevaifazer:
Funcionariof1=newFuncionario():
//brincadeirascomf1....
f1.mostra();
VeremosmaisafrenteomtodotoString,queumasoluomuitomaiselegantepara
mostrararepresentaodeumobjetocomoString,almdenojogartudoproSystem.out(s
sevocdesejar).
Oesqueletodomtodoficariaassim:
classFuncionario{
//seusoutrosatributosemtodos
voidmostra(){
System.out.println("Nome:"+this.nome);
//imprimiraquiosoutrosatributos...
}
}
4)Construadoisfuncionrioscomonew,ecompareoscomo==.Eseelestiveremos
mesmosatributos?Paraissovocvaiprecisarcriaroutrareferncia:
Funcionariof1=newFuncionario();
f1.nome="Fiodor";
f1.salario=100;
Funcionariof2=newFuncionario();
f2.nome="Fiodor";
f2.salario=100;
if(f1==f2){
System.out.println("iguais");
}else{
System.out.println("diferentes");
}
5)Crieduasrefernciasparao mesmo funcionrio,compareoscomo ==.Tiresuas
concluses.Paracriarduasrefernciaspromesmofuncionrio:
Funcionariof1=newFuncionario():
f1.nome="Fiodor";
f1.salario=100;

Captulo4OrientaoaobjetosbsicaPgina43

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Funcionariof2=f1;
Oqueacontececomoifdoexerccioanterior?
6)(opcional)Emvezdeutilizaruma String pararepresentaradata,crieumaoutra
classe, chamada Data. Ela possui 3 campos int, para dia, ms e ano. Faa com que seu
funcionrio passe a usla. ( parecido com o ltimo exemplo, que a Conta passou a ter
refernciaparaumCliente).
classFuncionario{
DatadataDeEntrada;//qualovalordefaultaqui?
//seusoutrosatributosemtodos
}
1.classData{
2.
3.
intdia;
4.
intms;
5.
intano;
6.}

ModifiquesuaclasseTestaFuncionarioparaquevoccrieumaDataeatribuaelaao
Funcionario:
Funcionariof1=newFuncionario();
//...
Datadata=newData();//ligao!
f1.dataDeEntrada=data;
FaaodesenhodoestadodamemriaquandocriarmosumFuncionario.
7) (opcional) Modifique seu mtodo mostra para que ele imprima o valor da
dataDeEntradadaqueleFuncionario:
classFuncionario{
//seusoutrosatributosemtodos
DatadataDeEntrada;
voidmostra(){
System.out.println("Nome:"+this.nome);
//imprimiraquiosoutrosatributos...
System.out.println("Dia:"+this.dataDeEntrada.dia);
System.out.println("Ms:"+this.dataDeEntrada.mes);
System.out.println("Ano:"+this.dataDeEntrada.ano);
}
}
Testeo.

Agora,oqueacontecesechamarmosomtodomostraantesdeatribuirmosumadata
paraesteFuncionario?
8)(opcional)Oqueacontecesevoctentaracessarumatributodiretamentenaclasse?
Comoporexemplo:
Captulo4OrientaoaobjetosbsicaPgina44

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Conta.saldo=1234;
Essecdigofazsentido?Eeste:
Conta.saca(50);
Fazsentidopedirparaoesquemadocontasacarumaquantia?

4.13 - Desafios
1) Um mtodo pode chamar ele mesmo. Chamamos isso de recurso. Voc pode
resolverasriedefibonacciusandoummtodoquechamaelemesmo.Oobjetivovoccriar
umaclasse,quepossaserusadadaseguintemaneira:
Fibonaccifibo=newFibonacci();
inti=fibo.calculaFibonacci(5);
System.out.println(i);
Aquiiraimprimir8,jqueesteosextonmerodasrie.
EstemtodocalculaFibonaccinopodeternenhumlao,spodechamarelemesmo
comomtodo.Pensenelecomoumafuno,queusaaprpriafunoparacalcularoresultado.
2)Porqueomodoacimaextremamentemaislentoparacalcularasriedoqueomodo
iterativo(queseusaumlao)?
3) Escreva o mtodo recursivo novamente, usando apenas uma linha. Para isso,
pesquisesobreooperador condicional ternrio.(ternaryoperator)

4.14 - Fixando o conhecimento


O objetivodosexercciosaseguirfixaroconceito declasseseobjetos,mtodose
atributos.Dadaaestruturadeumaclasse,bastatraduzilaparaalinguagemJavaefazerusode
umobjetodamesmaemumprogramasimples.
Sevocestcomdificuldadeemalgumapartedessecaptulo,aproveiteetreinetudoo
quevimosatagoranospequenosprogramasabaixo:
Programa1

Classe:Pessoa.
Atributos:nome,idade.
Mtodo:voidfazAniversario()

Crie uma pessoa,coloqueseunome eidade inicial, faa alguns aniversrios


(aumentandoaidade)eimprimaseunomeesuaidade.
Programa2
Classe:Porta
Atributos:aberta,cor,dimensaoX,dimensaoY,dimensaoZ
Mtodos:voidabre(),voidfecha(),
voidpinta(Strings),booleanestaAberta()
Crieumaporta,abraefecheamesma,pinteadediversascores,alteresuasdimensese
Captulo4OrientaoaobjetosbsicaPgina45

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

useometodoestaAbertaparaverificarseelaestaaberta.
Programa3
Classe:Casa
Atributos:cor,porta1,porta2,porta3
Mtodo:voidpinta(Strings),
intquantasPortasEstaoAbertas()
Crieumacasaepintea.Crietrsportasecoloqueasnacasa;abraefecheasmesmas
como desejar. Utilize o mtodo quantasPortasEstaoAbertas para imprimir o nmero de
portasabertas.

Captulo4OrientaoaobjetosbsicaPgina46

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Um pouco de arrays

O homem esquecer antes a morte do pai que a perda da


propriedade
Maquiavel

Aotrminodessecaptulo,vocsercapazde:
declarareinstanciararrays;
popularepercorrerarrays.

5.1 - O problema
Dentrodeumbloco,podemosdeclararvariveiseuslas.
intidade1;
intidade2;
intidade3;
intidade4;
MATRIZ
ARRAY

Mastambmpodemosdeclararumamatriz(array)deinteiros:
int[]idades;
O int[] umtipo.Umaarraysempreumobjeto,portanto,avarivelidadesuma
referncia.Vamosprecisarcriarumobjetoparapoderusaraarray. Comocriamosoobjeto
array?
idades=newint[10];
Aquioquefizemosfoicriarumaarraydeintde10posies,eatribuiroendereooqual
elafoicriada.Agorapodemosacessarasposiesdoarray.
idades[5]=10;

Ocdigoacimaalteraasextaposiodoarray.NoJava,osndicesdoarrayvode0an
1,ondenotamanhodadonomomentoquevoccriouaarray.Sevoctentaracessaruma
posioforadessealcance,umerroocorrerduranteaexecuo.

Captulo5UmpoucodearraysPgina47

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Arraysumproblemanoaprendizadodemuitaslinguagens
Aprender a usar arrays s vezes pode ser um problema em qualquer linguagem. Isso porque
envolve uma srie de conceitos, sintaxe, e outros. No Java, muitas vezes utilizamos outros
recursosemvezdearrays,emespecialospacotesdecoleesdoJava,queveremosnocaptulo
11. Portanto, fique tranqilo caso no consiga digerir toda sintaxe das arrays num primeiro
momento.

5.2 - Arrays de referncias


comum ouvirmos array de objetos. Porm quando criamos uma array de alguma
classe,elapossuireferncias.Oobjeto,comosempre,estnamemriaprincipal,enasuaarray
sficamguardadasasreferncias(endereos).
Conta[]minhasContas;
minhasContas=newConta[10];
Quantascontasforamcriadasaqui?Naverdade,nenhuma.Foramcriados10espaos
que voc pode utilizar para guardar uma referncia a uma Conta. Por enquanto, eles se
referenciamparalugarnenhum(null).Sevoctentar:
System.out.println(minhasContas[0].saldo);
Umerroduranteaexecuoocorrer!Poisnaprimeira posiodaarraynohuma
refernciaparaumaconta,nemparalugarnenhum.Vocdevepopularsuaarrayantes.
ContacontaNova=newConta();
contaNova.saldo=1000.0;
minhasContas[0]=contaNova;
Ouvocaindapodefazerissodiretamente:
minhasContas[1]=newConta();
minhasContas[1].saldo=3200.0;

Captulo5UmpoucodearraysPgina48

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Uma array de tipos primitivos guarda valores, uma array de objetos guarda
referncias.

5.3 - Percorrendo uma array


Percorrerumaarraymuitosimplesquandofomosnsqueacriamos:
1.publicstaticvoidmain(Stringargs[]){
2.
int[]idades=newint[10];
3.
for(inti=0;i<10;i++){
4.
idades[i]=i*10;
5.
}
6.
for(inti=0;i<10;i++){
7.
System.out.println(idades[i]);
8.
}
9.}
Porm,emmuitoscasos,recebemosumaarraycomoargumentoemummtodo:
1.voidimprimeArray(int[]array){
2.
//nocompila!!
3.
for(inti=0;i<????;i++){
4.
System.out.println(array[i]);
5.
}
6.}
Atondeofor deveir?TodaarrayemJavatemumatributoquesechamalength,e
vocpodeacessloparasaberotamanhodaarrayaqualvocestsereferenciandonaquele
momento:
1.voidimprimeArray(int[]array){
2.
for(inti=0;i<array.length;i++){
3.
System.out.println(array[i]);
4.
}
5.}

Arraysnopodemmudardetamanho
Apartirdomomentoqueumaarrayfoicriada,elano podemudardetamanho.
Sevocprecisardemaisespao,sernecessriocriarumanovaarray,eantesdesereferenciar
paraela,copieoselementosdaarrayvelha.

5.4 - Percorrendo uma array no Java 5.0


OJava5.0trazumanovasintaxeparapercorremosarrays(ecolees,queveremosmais
afrente).
Nocasodevocnoternecessidadedemanterumavarivelcomondicequeindicaa
posiodoelementonovetor,podemosusaroenhanced-for.
1.publicstaticvoidmain(Stringargs[]){
2.
int[]idades=newint[10];
3.
for(inti=0;i<10;i++){
4.
idades[i]=i*10;
5.
}
6.
for(intx:idades){
Captulo5UmpoucodearraysPgina49

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

7.
8.
9.}

System.out.println(x);
}
Eagoranemprecisamosmaisdolengthparapercorrermatrizesquenoconhecemos
seutamanho:

1.voidimprimeArray(int[]array){
2.
for(intx:array){
3.
System.out.println(x);
4.
}
5.}

5.5 - Um pouco mais...


1)Arrayspodemtermaisdeumadimenso.Isto,emvezdetermosumaarrayde10
contas,podemosterumaarrayde10por10contas,evocpodeacessaracontanaposioda
coluna x e linha y. Na verdade, uma array bidimensional em Java uma array de arrays.
Pesquisesobreisso.

2)Umaarraybidimensionalnoprecisaserretangular,isto,cadalinhapodeterum
nmerodiferentedecolunas.Como?Porque?

Captulo5UmpoucodearraysPgina50

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

3)Oqueacontecesecriarumaarrayde0elementos?e1?
4)OmtodomainrecebeumaarraydeStringscomoargumento.Oquevemnela?Faa
umforquepercorraesseargumentoargsdentrodomaindeumaclasseTeste,edepoistente:
$javaTestearg1outromaisoutro

5.6 - Exerccios
1)VolteaonossosistemadeFuncionarioecrieumaclasse Empresa.AEmpresa tem
um nome, cnpj e uma array de Funcionario, alm de outros atributos que voc julgar
necessrio
classEmpresa{
//outrosatributos
Funcionario[]funcionarios;
Stringcnpj;
}
2) A empresa deve ter um mtodo adiciona que recebe uma referncia a
Funcionariocomoargumento,eguardaessefuncionario.Algocomo:
...

voidadiciona(Funcionariof){
//algotipo:this.funcionarios[???]=f;
//...
}
...

Vocdeveinseriro Funcionario emumaposiodaarrayqueestejalivre.Existem


vriasmaneiraparavocfazerisso:guardarumcontadorparaindicarqualaprximaposio
vaziaouprocurarporumaposiovaziatodavez.Oqueseriamaisinteressante?
importanterepararqueomtodoadicionanorecebenome,rg,salrio,etc.Essaseria
umamaneiranemumpoucoestruturada,muitomenosorientadaaobjetosdesetrabalhar.Voc
antes cria um Funcionario e j passa a referncia dele, que dentro do objeto possui rg,
salrio,etc.
3)Crieumaoutraclasse,quevaipossuiroseumtodomain.Dentrodelecriealgumas
instnciasdeFuncionarioepasseparaaempresapelomtodoadiciona.Reparequeantes
Captulo5UmpoucodearraysPgina51

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

vocvaiprecisarcriaraarray,poisinicialmenteoatributofuncionariosdaclasseEmpresano
sereferenciaalugarnenhum(null):
Empresaempresa=newEmpresa();
empresa.funcionarios=newFuncionario[10];
//
....
OuvocpodeconstruiraarraydentrodaprpriadeclaraodaclasseEmpresa.
Criealgunsfuncionriosepassecomoargumentoparaoadicionadaempresa:
Funcionariof1=newFuncionario();
f1.salario=1000;
empresa.adiciona(f1);
Vocpodecriaressesfuncionriosdentrodeumloopsepreferir.
Opcional:omtodoadicionapodegerarumamensagemdeerroindicandoqueaarray
estcheia.
4)PercorraoatributofuncionariosdasuainstnciadaEmpresaeimprimaosalriosde
todosseusfuncionrios.
Ouvocpodechamaromtodomostra()decadaFuncionariodasuaarray.
Usetambmofornovodojava5.0.
Cuidado:algunsndicesdoseuarraypodemnoconterrefernciapara Funcionario
construdo,isto,aindasereferiremparanull.
5)(Opcional)CrieummtodoparaverificarseumdeterminadoFuncionarioseencontra
ounocomofuncionariodestaempresa:
booleancontem(Funcionariof){
//...
}
Vocvaiprecisarfazerumfornasuaarray,everificarsearefernciapassadacomo
argumentoseencontradentrodaarray.Eviteaomximousarnmeroshardcoded,isto,useo
.length.
6)(Opcional)Casoaarrayjestejacheianomomentodeadicionarumoutrofuncionrio,
criarumanovamaiorecopiarosvalores.Isto,fazerarealocaojquejavanotemisso:
umaarraynasceemorrecomomesmolength.

Usandoothisparapassarargumento
Dentrodeummtodo,vocpodeusarapalavrathisparareferenciarasimesmo,epodepassar
essarefernciacomoargumento.

5.7 - Desafios
1)Nocaptuloanterior,vocdeveterreparadoqueaversorecursivaparaoproblema
deFibonaccilentaporquetodahoraestamosrecalculandovalores.Faacomqueaverso
recursivasejatoboaquantoaversoiterativa.

Captulo5UmpoucodearraysPgina52

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

5.8 - Testando o conhecimento


Oobjetivodosexercciosaseguirfixarosconceitosvistosatagora.Sevocestcom
dificuldadeemalgumapartedessecaptulo,aproveiteetreinetudooquevimosatagoranos
pequenosprogramasabaixo:
Programa1
Classe:Casa
Atributos:cor,totalDePortas,portas[]
Mtodo:voidpinta(Strings),intquantasPortasEstaoAbertas(),voidadicionaPorta(Porta
p),inttotalDePortas()
Crie uma casa, pinte ela. Crie trs portas e coloqueas na casa atravs do mtodo
adicionaPorta, abra e feche as mesmas como desejar. Utilize o mtodo
quantasPortasEstaoAbertasparaimprimironmerodeportasabertaseomtodototalDePortas
paraimprimirototaldeportasemsuacasa.

Captulo5UmpoucodearraysPgina53

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Modificadores de acesso e atributos de classe


A marca do homem imaturo que ele quer morrer nobremente
por uma causa, enquanto a marca do homem maduro querer
viver modestamente por uma.
J.D.Salinger

Aotrminodessecaptulo,vocsercapazde:
controlaroacessoaosseusmtodos,atributoseconstrutoresatravsdosmodificadoresprivatee
public;
escrevermtodosdeacessoaatributosdotipogettersesetters;
escreverconstrutoresparasuasclassese
utilizarvariveisemtodosestticos.

6.1 - Controlando o acesso


Umdosproblemasmaissimplesquetemosnonossosistemadecontasqueafuno
sacapermitesacarmesmoqueolimitetenhasidoatingido.Aseguirvocpodelembrarcomo
estaclasseConta:
1.classConta{
2.
intnumero;
3.
Stringdono;
4.
doublesaldo;
5.
doublelimite;
6.
7.
//..
8.
9.
voidsaca(doublequantidade){
10.
this.saldo=this.saldoquantidade;
11.
}
12.}
Aclasseaseguirmostracomopossvelultrapassarolimiteusandoomtodosaca:
1.classTestaContaEstouro1{
2.
publicstaticvoidmain(Stringargs[]){
3.
ContaminhaConta=newConta();
4.
minhaConta.saldo=1000.0;
5.
minhaConta.limite=1000.0;
6.
minhaConta.saca(50000);//saldo+limites2000!!
7.
}
8.}
Podemos incluir um if dentro do nosso mtodo saca() para evitar a situao que
resultariaemumacontaemestadoinconsistente,comseusaldoabaixodolimite.Fizemosisso
nocaptulodeorientaoaobjetosbsica.
Apesardemelhorarbastante,aindatemosumproblemamaisgrave:ningumgaranteque
ousuriodaclassevaisempreutilizaromtodoparaalterarosaldodaconta.Ocdigoaseguir
Captulo6ModificadoresdeacessoeatributosdeclassePgina54

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

ultrapassaolimitediretamente:
1.classTestaContaEstouro2{
2.
publicstaticvoidmain(Stringargs[]){
3.
ContaminhaConta=newConta();
4.
minhaConta.limite=100;
5.
minhaConta.saldo=200;//saldoestabaixodos100delimite
6.
}
7.}
Comoevitarisso?Umaidiasimplesseriatestarsenoestamosultrapassandoolimite
todavezqueformosalterarosaldo:
1.classTestaContaEstouro3{
2.
3.
publicstaticvoidmain(Stringargs[]){
4.
//aConta
5.
ContaminhaConta=newConta();
6.
minhaConta.limite=100;
7.
minhaConta.saldo=100;
8.
9.
//queromudarosaldopara200
10.
doublenovoSaldo=200;
11.
12.
//testaseonovoSaldoultrapassaolimitedaconta
13.
if(novoSaldo<minhaConta.limite){//
14.
System.out.println("Nopossomudarparaessesaldo");
15.
}else{
16.
minhaConta.saldo=novoSaldo;
17.
}
18.
}
19.}
Esse cdigo iria se repetir ao longo de toda nossa aplicao e, pior, algum pode
esquecer de fazer essa comparao em algum momento, deixando a conta na situao
inconsistente.AmelhorformaderesolverissoseriaforarquemusaaclasseContaachamaro
mtodosacaenopermitiroacessodiretoaoatributo.omesmocasodavalidaodeCPF.
PRIVATE

ParafazerissonoJavabastadeclararqueosatributosnopodemseracessadosdefora
daclasseusandoapalavrachaveprivate:
classConta{
privatedoublesaldo;
privatedoublelimite;
//...
}

MODIFICADOR
private um modificador
DE ACESSO visibilidade).

de acesso (tambm chamadode modificador de

Marcandoumatributocomoprivado,fechamosoacessoaomesmodetodasasoutras
classes,fazendocomqueoseguintecdigonocompile:
classTestaAcessoDireto{
publicstaticvoidmain(Stringargs[]){
ContaminhaConta=newConta();
//nocompila!vocnopodeacessaroatributoprivadodeoutra
classe
minhaConta.saldo=1000;
}
Captulo6ModificadoresdeacessoeatributosdeclassePgina55

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Programandoorientadoaobjetosuma prtica quase que obrigatria proteger


seus atributos como private. (discutiremos outros modificadores de acesso em outros
captulos).
Cadaclasseresponsvelporcontrolarseusatributos,portantoeladevejulgarseaquele
novovalorvlidoouno!Estavalidaonodevesercontroladaporquemestusandoa
classeesimporelamesma,centralizandoessaresponsabilidade,facilitandoosistemapara
futurasmudanas.
Reparequeagoraquemchamaomtodosacanofazamenoridiadequeexisteum
limitequeestsendochecado,quemforusaressaclassebastasaberoqueomtodofaz,eno
comoelefazexatamente(oqueummtodofazsempremaisimportantedecomoelefaz:
mudaraimplementaofcil,jmudaraassinaturadeummtodovaigerarproblemas).
Apalavrachaveprivatetambmpodeserusadaparamodificaroacessoaummtodo.
Talfuncionalidadenormalmenteusadaquandoexiste ummtodoapenasauxiliaraprpria
classe,enoqueremosqueoutraspessoasousem(ouapenasparaseguiraboaprticade
exporseaomnimo).Sempredevemosexporomnimopossveldefuncionalidades,paracriar
umbaixoacoplamentoentreasnossasclasses.
PUBLIC

Damesmamaneiraquetemosoprivate,temosomodificadorpublic,quepermitea
todosacessaremumdeterminadoatributooumtodo:

1.classConta{
2.//...
3.publicvoidsaca(doublequantidade){
4.if(quantidade>this.saldo+this.limite){//possosacaratsaldo+limite
5. System.out.println("Nopossosacarforadolimite!");
6. }else{
7. this.saldo=this.saldoquantidade;
8. }
9.}
10.}

Equandonohmodificadordeacesso?
Atagoratnhamosdeclaradovariveisemtodossemnenhummodificadorcomo private e
public. Quando isto acontece, o seu mtodo ou atributo fica num estado de visibilidade
intermedirioentreoprivateeopublic,queveremosmaisprafrente,nocaptulodepacotes.
muitocomum,efaztodosentido,queseusatributossejam private,equasetodos
seusmtodossejampublic(noumaregra!).Destaforma,todaconversadeumobjetocom
outrofeitaportrocademensagens,isso,acessandoseusmtodos,algomuitomaiseducado
quemexerdiretamenteemumatributoquenoseu!
Melhorainda!Odiaqueprecisarmosmudarcomorealizadoumsaquenanossaclasse
Conta, adivinhe onde precisaramos modificar? Apenas no mtodo saca, o que faz todo o
sentido. Como exemplo, imagine cobrar CPMF de cada saque: basta voc modificar ali, e
nenhumoutrocdigo,foraaclasse Conta,precisarserrecompilado.Mais:asclassesque
Captulo6ModificadoresdeacessoeatributosdeclassePgina56

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

usam esse mtodo nem precisam ficar sabendo de tal modificao! Voc precisa apenas
recompilaraquelaclasse,esubstituiraquelearquivo.class.

6.2 - Encapsulamento

ENCAPSULAR

Oquecomeamosavernessecaptuloaidiadeencapsular,isto,escondertodos
osmembrosdeumaclassecomovimosacima,almdeescondercomofuncionaasrotinas(no
casomtodos)donossosistema.
Encapsular fundamental para que seu sistema seja sucetvel a mudanas: no
precisaremosmudarumaregradenegcioemvrioslugares,massimemapenasumnico
lugar,jqueessaregraestencapsulada.(vistoocasodomtodosaca)

Oconjuntodemtodospblicosdeumaclassetambmchamadode interface da
classe,poisestaanicamaneiraaqualvocsecomunicacomobjetosdessaclasse.

Programandovoltadoparaainterfaceenoparaaimplementao
sempre bom programar pensando na interface da sua classe, como seus usurios estaro
utilizandoela,enosomentecomoelairfuncionar.
Aimplementaoemsi,ocontedodosmtodos,notemtantaimportnciaparaousuriodessa
classeumavezqueelesprecisasaberoquecadamtodopretendefazer,enocomoelefaz
poisistopodemudarcomotempo.
Essa frasevemdolivroDesignPatterns,deEricGammaetal.Umlivro cultuadonomeioda
orientaoaobjetos.
Sempre que vamos acessar um objeto utilizamos sua interface. Existem diversas
analogiasfceisnomundoreal:

Quandovocdirigeumcarro,oqueteimportasoospedaiseovolante(interface)e
noomotorquevocestusando(implementao).claroqueummotordiferente
podetedarmelhoresresultados,mas oqueelefaz amesmacoisaqueummotor
menospotente,adiferenaestem comoelefaz.Paratrocarumcarroaalcoolpara
Captulo6ModificadoresdeacessoeatributosdeclassePgina57

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

umagasolinavocnoprecisareapreenderadirigir!(voctrocaraimplementaodos
mtodosnoprecisamudarainterface,fazendocomqueasoutrasclassescontinuem
teusandodamesmamaneira).
Todososcelularesfazemamesmacoisa(interface),elespossuemmaneiras(mtodos)
dediscar,ligar,desligar,atender,etc.Oquemudacomoelesfazem(implementao),
masreparequeparaousuriocomumpoucoimportaseocelularGSMouCDMA,
issoficaencapsuladonaimplementao(queaquisooscircuitos).

Repare que agora temos conhecimentos suficientes para resolver aquele problema da
validaodeCPF:
classCliente{
privateStringnome;
privateStringendereco;
privateStringcpf;
privateintidade;
publicvoidmudaCPF(Stringcpf){
validaCPF(cpf);
this.cpf=cpf;
}
privatevoidvalidaCPF(Stringcpf){
//sriederegrasaqui,falhacasonaosejavlido
}
//..
}
Agora,sealgumtentarcriarumClienteenousaromudaCPF,vaireceberumerrode
compilao,jqueoatributoCPFprivado.Eodiaquevocnoprecisarvalidarquemtem
maisde60anos?Seumtodoficaoseguinte:
publicvoidmudaCPF(Stringcpf){
if(this.idade<=60){
validaCPF(cpf);
}
this.cpf=cpf;
}
OcontrolesobreoCPFestcentralizado:ningumconsegueacesslosempassarpora,
aclasseClienteanicaresponsvelpelosseusprpriosatributos!

6.3 - Getters e Setters


Parapermitiroacessoaosatributos(jqueelessoprivate)deumamaneiracontrolada,
aprticamaiscomumdecriardoismtodos,umqueretornaovaloreoutroquemudaovalor.
GETTERS
SETTERS

Opadroparaessesmtodosdecolocarapalavra get ou set antesdonomedo


atributo.Porexemplo,anossacontacomsaldo,limiteedonoficaassim:

1.publicclassConta{
2.
3.
privatedoublesaldo;
4.
privatedoublelimite;
5.
privateClientedono;
6.
7.
publicdoublegetSaldo(){
Captulo6ModificadoresdeacessoeatributosdeclassePgina58

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.}

returnthis.saldo;
}
publicvoidsetSaldo(doublesaldo){
this.saldo=saldo;
}
publicdoublegetLimite(){
returnthis.limite;
}
publicvoidsetLimite(doublelimite){
this.limite=limite;
}
publicClientegetDono(){
returnthis.dono;
}
publicvoidsetDono(Clientedono){
this.dono=dono;
}

umamprticacriarumaclasseelogoemseguidacriargettersesettersprosseus
atributos.Vocsdevecriarumgetterousettersetiverarealnecessidade.Reparequenesse
exemplosetSaldonodeveriatersidocriado,jquequeremosquetodosusemdeposita()e
saca().
Outrodetalheimportante,ummtodo getX nonecessariamenteretornaovalordeum
atributoquechamaXdoobjetoemquesto.Issointeressanteparaoencapsulamento.Imagine
a situao: queremos que obanco sempre mostre como saldo o valor do limite somado ao
saldo(umaprticacomumdosbancosquecostumailudirseusclientes).Poderamossempre
chamarc.getLimite()+c.getSaldo(),masissopoderiagerarumasituaodereplaceall
quando precisassemos mudar como o saldo mostrado. Podemos encapsular isso em um
mtodo,eporquenodentrodoprpriogetSaldo?Repare:

1.publicclassConta{
2.
3.
privatedoublesaldo;
4.
privatedoublelimite;
5.
privateClientedono;
6.
7.
privatedoublegetSaldo(){
8.
returnthis.saldo+this.limite;
9.
}
10.
11.
//deposita()esaca()
12.
13.
publicClientegetDono(){
14.
returnthis.dono;
15.
}
16.
17.
publicvoidsetDono(Clientedono){
18.
this.dono=dono;
19.
}
20.}
Ocdigoacimanempossibilitaachamadadomtodo getLimite(),elenoexiste.E
nem deveexistirenquantono houveressa necessidade.O mtodo getSaldo no devolve
Captulo6ModificadoresdeacessoeatributosdeclassePgina59

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

simplesmenteosaldo...esimoquequeremosqueseja mostradocomosefosseo saldo.


Utilizargetteresettersnosajudamvocaprotegerseusatributos,comotambmpossibilita
terdemudaralgoemumslugar...chamamosissodeencapsulamento,poisescondeamaneira
comoseusobjetosguardamseusdados.umaprticamuitoimportante.
Nossaclasseestagoratotalmentepronta?Isto,existeachancedelaficarcommenos
dinheirodoqueolimite?Podeparecerqueno,masesedepositarmosumvalornegativona
conta?Ficaramoscommenosdinheiroqueopermitido,jquenoespervamosporisso.Para
nosprotegerdissobastamudarmosomtodo deposita()paraqueeleverifiqueseovalor
necessariamente positivo. Depois disso precisaramos mudar mais algum outro cdigo? A
respostano,graasaoencapsulamentodosnossosdados.

6.4 - Construtores
Quandousamosapalavrachavenew,estamosconstruindoumobjeto.Semprequandoo
construtor da classe. O construtor da classe um bloco
declaradocomomesmo nomequeaclasse:

CONSTRUTOR new chamado, executa o

1.classConta{
2.
intnumero;
3.
Stringdono;
4.
doublesaldo;
5.
doublelimite;
6.
7.
//construtor
8.
Conta(){
9.
System.out.println("Construindoumaconta.");
10.
}
11.
12.
//..
13.}
Ento,quandofizermos:
Contac=newConta();
Amensagemconstruindoumacontaaparecer.comoumarotinadeinicializaoque
chamadasemprequeumnovoobjetocriado.Umconstrutorpodeparecer,mas noum
mtodo.

Oconstrutordefault
Atagora,asnossasclassesnopossuamnenhumconstrutor.Entocomoqueerapossveldar
new,setodonewchamaumconstrutorobrigatoriamente?
Quando voc no declara nenhum construtor na sua classe, o Java cria um para voc. Esse
construtoroconstrutor default,elenorecebenenhumargumentoeocorpodelevazio.
Apartirdomomentoquevocdeclaraumconstrutor,oconstrutordefaultnomaisfornecido.
Ointeressantequeumconstrutorpodereceberumargumento,podendoassiminicializar
algumtipodeinformao:
1.classConta{
2.
intnumero;
Captulo6ModificadoresdeacessoeatributosdeclassePgina60

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.}

Stringdono;
doublesaldo;
doublelimite;
//construtor
Conta(Stringdono){
this.dono=dono;
}
//..

Esseconstrutorrecebeodonodaconta.Assim,quandocriarmosumaconta,elajter
umdeterminadodono.
Contac=newConta(Duke);
System.out.println(c.dono);

6.5 - A necessidade de um construtor


Tudoestavafuncionandoatagora.Paraqueutilizamosumconstrutor?
Aidiabemsimples.Setodacontaprecisadeumdono,comoobrigartodososobjetos
queforemcriadosaterumvalordessetipo?Bastacriarumnicoconstrutorquerecebeessa
String!
Oconstrutorseresumeaisso!Darpossibilidadesouobrigarousuriodeumaclassede
passarargumentosparaoobjetoduranteoprocessodecriaodomesmo.
Porexemplo,nopodemosabrirumarquivo paraleiturasemdizerqualonomedo
arquivoquedesejamosler!PortantonadamaisnaturalquepassarumaStringrepresentandoo
nomedeumarquivonahoradecriarumobjetodotipodeleituradearquivo,equeissoseja
obrigatrio.
Vocpodetermaisdeumconstrutornasuaclasse,enomomentodonew,oconstrutor
apropriadoserescolhido.

Construtor:ummtodoespecial?
Um construtor no um mtodo. Algumas pessoas o chamam de um mtodo especial, mas
definitivamenteno,jquenopossuiretornoeschamadoduranteaconstruodoobjeto.

Chamandooutroconstrutor
Um construtor s pode rodar durante a construo do objeto, isto , voc nunca conseguir
chamaroconstrutoremumobjetojconstrudo.Porm,duranteaconstruodeumobjeto,voc
podefazercomqueumconstrutorchameoutro,paranoterdeficarcopiandoecolando:
classConta{
intnumero;
Stringdono;
doublesaldo;
doublelimite;

//construtor
Conta(Stringdono){
//
fazmaisumasriedeinicializaeseconfiguraes
this.dono=dono;
Captulo6ModificadoresdeacessoeatributosdeclassePgina61

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
publicConta(intnumero,Stringdono){
this(dono);//chamaoconstrutorquefoideclaradoacima
this.numero=numero;
}
}

//..
Existeumoutromotivo,ooutroladodosconstrutores:facilidade.svezescriamosum
construtorquerecebediversosargumentosparanoobrigarousuriodeumaclasseachamar
diversosmtodosdotipo'set'.
NonossoexemplodoCPF,podemosforarqueaclasseClienterecebanomnimooCPF,
dessamaneiraumClientejserconstrudoecomumCPFvlido.

JavaBean
Quandocriamosumaclassecomtodososatributosprivados,seusgettersesetters,eum
construtorvazio(padro),naverdadeestamoscriandoumJavaBean(masnoconfundacom
EJB,queEnterpriseJavaBeans).
Parasabermaisacesse:
http://java.sun.com/products/javabeans/

6.6 - Atributos de classe


Nossobancotambmquercontrolaraquantidadedecontasexistentesnosistema.Como
poderamosfazeristo?Aidiamaissimples:
Contac=newConta();
totalDeContas=totalDeContas+1;
Aqui voltamos em um problema parecido com o da validao de CPF. Estamos
espalhandoumcdigoportodaaplicao,equemgarantequevamosconseguirlembrarde
incrementaravariveltotalDeContastodavez?
Tentamosento,passarparaaseguinteproposta:
classConta{
privateinttotalDeContas;
//...
Conta(){
this.totalDeContas=this.totalDeContas+1;
}
}
Quandocriarmosduascontas,qualserovalordototalDeContasdecadaumadelas?
Vaiser1.Poiscadaumatemessavarivel.O atributo de cada objeto.
STATIC

Seria interessante ento, que essa varivel fosse nica, compartilhada por todos os
objetosdessaclasse.Dessamaneira,quandomudasseatravsdeumobjeto,ooutroenxergaria
omesmovalor.Parafazerissoemjava,declaramosavarivelcomostatic.
privatestaticinttotalDeContas;

Captulo6ModificadoresdeacessoeatributosdeclassePgina62

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Quandodeclaramosumatributocomostatic,elepassaanosermaisumatributode
cadaobjeto,esimum atributo da classe,ainformaoficaguardadapelaclasse,no
maisindividualparacadaobjeto.
Paraacessarmosumatributoesttico,nousamosapalavrachavethis,esimonome
daclasse:
classConta{
privatestaticinttotalDeContas;
//...
Conta(){
Conta.totalDeContas=Conta.totalDeContas+1;
}
}
Jqueoatributoprivado,comopodemosacessaressainformaoapartirdeoutra
classe?Precisamosdeumgetterparaele!
classConta{
privatestaticinttotalDeContas;
//...
Conta(){
Conta.totalDeContas=Conta.totalDeContas+1;
}
publicintgetTotalDeContas()[
returnConta.totalDeContas;
}
}

Comofazemosentoparasaberquantascontasforamcriadas?
Contac=newConta();
inttotal=c.getTotalDeContas();
Precisamoscriarumacontaantesdechamaromtodo!Issonolegal,poisgostariade
saber quantas contas existem sem precisar ter acesso a um objeto conta. A idia aqui a
mesma,transformaressemtodoquetodoobjetocontatem,paraserummtododetodaa
classe.Usamosapalavrastaticdenovo,mudandoomtodoanterior.
publicstaticintgetTotalDeContas(){
returnConta.totalDeContas;
}
Paraacessaressenovomtodo:
inttotal=Conta.getTotalDeContas();
ReparequeestamoschamandoummtodonocomumarefernciaparaumaConta,e
simusandoonomedaclasse.

Mtodoseatributosestticos
Mtodoseatributosestticosspodemacessaroutrosmtodoseatributosestticosdamesma
classe,oquefaztodosentidojquedentrodeummtodoestticonotemosacessoareferncia
this,poisummtodoestticochamadoatravsdaclasse,enodeumobjeto.

Captulo6ModificadoresdeacessoeatributosdeclassePgina63

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Ostaticrealmentetrazumcheiroprocedural,pormemmuitasvezesnecessrio.

6.7 - Um pouco mais...


1) Em algumas empresas, o UML amplamente utilizado. s vezes, o programador
recebeoUMLjpronto,completo,esdevepreencheraimplementao,devendoseguira
riscaoUML.Oquevocachadessaprtica?Vantagensedesvantagens.
2)Seumaclassestematributosemtodosestticos,queconclusespodemostirar?O
quelhepareceummtodoesttico?
3)Opadrodosmtodosgetesetnovaleparaasvariveisdetipoboolean.Esses
atributossoacessadosviaiseset.Porexemplo,paraverificarseumcarroestligadoseriam
criadososmtodosisLigadoesetLigado.

6.8 - Exerccios
1)Adicioneomodificadordevisibilidade(privatesenecessrio)paracadaatributo
emtododaclasseFuncionario.TentecriarumFuncionarionomainemodificaroulerum
deseusatributosprivados.Oqueacontece?
2)CrieosgettersesettersnecessriosdasuaclasseFuncionario.
3)ModifiqueassuasclassesqueacessamemodificamatributosdeumFuncionario
parautilizarosgettersesetters.
Porexemplo:
f.salario=100;
System.out.println(f.salario);
passapara:
f.setSalario(100);
System.out.println(f.getSalario());

4)(opcional)Adicioneumatributonaclasse Funcionario detipo int quesechama


identificador. Esse identificador deve ter um valor nico para cada instncia do tipo
Funcionario.OprimeiroFuncionarioinstanciadotemidentificador1,osegundo2,eassim
pordiante.Vocdeveutilizarosrecursosaprendidosaquipararesolveresseproblema.
Crieumgetterparaoidentificador.Devemosterumsetter?
5)(opcional)CrieosgettersesettersdasuaclasseEmpresaecoloqueseusatributos
comoprivate.Lembresedequenonecessariamentetodososatributosdevemtergetterse
setters.
Porexemplo,naclasse Empresa,seriainteressanteterumsetteregetterparaasua
arraydefuncionarios?Noseriamaisinteressanteterummtodocomoeste:?
classEmpresa{
//...
FuncionariogetFuncionario(intposicao){
Captulo6ModificadoresdeacessoeatributosdeclassePgina64

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

returnthis.funcionarios[posicao];
}
}

6)(opcional)Naclasse Empresa,emvezdecriarumaarraydetamanhofixo,receba
comoparmetronoconstrutorotamanhodaarraydeFuncionario
Agora com esse construtor, o que acontece se tentarmos dar new Empresa() sem
passarargumentoalgum?Porque?
7)(opcional)Comogarantirquedatascomo31/2/2005nosejamaceitaspelasuaclasse
Data?
8)(opcional)Crieaclasse PessoaFisica.Queremosteragarantiaquepessoafisica
algumatenhaCPFinvalido,nemsejacriadaPessoaFisicasemcpfinicial.(vocnoprecisa
escreveroalgoritmodevalidaodecpf,bastapassarocpfporummtodo valida(String
x)....)

6.9 - Desafios
1)Porqueessecdigonocompila?
1.classTeste{
2.
intx=37;
3.
publicstaticvoidmain(String[]args){
4.
System.out.println(x);
5.
}
6.}
2)Imaginequetenhoumaclasse FabricaDeCarro equerogarantirquesexisteum
objetodessetipoemtodaamemria.Noexisteumapalavrachaveespecialparaistoemjava,
entoteremosdefazernossaclassedetalmaneiraqueelarespeiteessanossanecessidade.
Comofazerisso?(pesquise:singletondesignpattern)

Captulo6ModificadoresdeacessoeatributosdeclassePgina65

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Orientao a Objetos herana, reescrita e


polimorfismo
O homem absurdo aquele que nunca muda.
GeorgesClemenceau

Aotrminodessecaptulo,vocsercapazde:
dizeroqueheranaequandoutilizla;
reutilizarcdigoescritoanteriormente;
criarclassesfilharereescrevermtodos;
usartodoopoderqueopolimorfismoda.

7.1 - Repetindo cdigo?


Como toda empresa, nosso Banco possui funcionrios. Vamos modelar a classe
Funcionario:
classFuncionario{
Stringnome;
Stringcpf;
doublesalario;
//mtodosdevemviraqui
}
Alm de um funcionrio comum, h tambm outros cargos, como os gerentes. Os
gerentes guardam a mesma informao que um funcionrio comum, mas possuem outras
informaes, alm de ter funcionalidades um pouco diferentes. Um gerente no nosso banco
possuitambmumasenhanumricaquepermiteoacessoaosistemainternodobanco:
classGerente{
Stringnome;
Stringcpf;
doublesalario;
intsenha;
publicbooleanautentica(intsenha){
if(this.senha==senha){
System.out.println("AcessoPermitido!");
returntrue;
}else{
System.out.println("AcessoNegado!");
returnfalse;
}
}
//outrosmtodos
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina66

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Precisamosmesmodeoutraclasse?
PoderamosterdeixadoaclasseFuncionariomaisgenrica,mantendonelasenhadeacesso.
Casoofuncionrionofosseumgerente,deixaramosesteatributovazio.
Essa umapossibilidade.Maseemrelaoaosmtodos?Aclasse Gerente temomtodo
autentica,quenofazsentidoseracionadoemumfuncionrioquenogerente.
Se tivssemos um outro tipo de funcionrio, que tem caractersticas diferentes do
funcionriocomum,precisaramoscriarumaoutraclasse,ecopiarocdigonovamente!
Alm disso, se um dia precisarmos adicionar uma nova informao para todos os
funcionrios,precisaramospassarportodasasclassesdefuncionrioeadicionaresseatributo.
Oproblemaacontecenovamentepornocentralizarasinformaesprincipaisdofuncionrioem
umnicolugar!
HERANA

EXTENDS

Existeumamaneira,emJava,derelacionarmosumaclassedetalmaneiraqueumadelas
herdatudoqueaoutratem.Istoumarelaodeclassemeeclassefilha.Nonossocaso,
gostaramosdefazercomqueoGerentetivessetudoqueumFuncionariotem,gostaramos
que ela fosse uma extenso de Funcionario. Fazemos isto atravs da palavra chave
extends.

classGerenteextendsFuncionario{
intsenha;
publicbooleanautentica(intsenha){
if(this.senha==senha){
System.out.println("AcessoPermitido!");
returntrue;
}else{
System.out.println("AcessoNegado!");
returnfalse;
}
}
}

TodomomentoquecriarmosumobjetodotipoGerente,esteobjetopossuirtambmos
atributosdefinidosnaclasseFuncionario,poisagoraumGerente umFuncionario:

classTestaGerente{
publicstaticvoidmain(String[]args){
Gerentegerente=newGerente();
gerente.setNome("JoodaSilva");
gerente.setSenha(4231);
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina67

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
}

DizemosqueaclasseGerenteherdatodososatributosemtodosdaclasseme,no
nossocaso,aFuncionario.Parasermaispreciso,elatambmherdaosatributosemtodos
privados,pormnoconsegueacessalosdiretamente.
SUPER E SUB
CLASSES

SupereSubclasse

AnomenclaturamaisencontradaqueFuncionarioasuperclassedeGerente,eGerentea
subclassedeFuncionario.DizemostambmquetodoGerenteumFuncionrio.

PROTECTED

E se precisamos acessar os atributos que herdamos? No gostaramos de deixar os


atributos de Funcionario public, pois dessa maneira qualquer um poderia alterar os
atributosdosobjetosdestetipo.Existeumoutromodificadordeacesso,oprotected,quefica
entreo private eo public.Umatributo protected spodeseracessado (visvel)pela
prpriaclasseousuassubclasses.

classFuncionario{
protectedStringnome;
protectedStringcpf;
protecteddoublesalario;
//mtodosdevemviraqui
}

Sempreusarprotected?
Entoporqueusar private?Depoisdeumtempoprogramandoorientadoaobjetos,vocvai
comearasentirquenemsempreumaboaidiadeixarqueaclassefilhaacesseosatributosda
classeme,poisistoquebraumpoucoaidiadequesaquelaclassedeveriamanipularseus
atributos.Essaumadiscussoumpoucomaisavanada.
Almdisso,nosassubclassespodemacessarosatributosprotected,comooutrasclasses,
queveremosmaisafrente(mesmopacote).
REESCRITA
DE MTODO

Todo fim de ano, os funcionrios do nosso banco recebem uma bonificao. Os


funcionrioscomunsrecebem10%dovalordosalrioeosgerentes,15%.
DamesmamaneirapodemosterumaclasseDiretorqueestendaGerente,eaclasse
PresidentepodeestenderdiretamentedeFuncionario.
Quefiqueclaroqueessaumadecisodenegcio.SevocvaiestenderDiretorde
Gerenteouno,vaidependerseDiretorumGerente.
Umaclassepodetervriasfilhas,maspodeterapenasumamo,achamadaherana
simplesdojava.

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina68

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

7.2 - Reescrita de mtodo


Todo fim de ano, os funcionrios do nosso banco recebem uma bonificao. Os
funcionrioscomunsrecebem10%dovalordosalrioeosgerentes,15%.
VamosvercomoficaaclasseFuncionario:
classFuncionario{
protectedStringnome;
protectedStringcpf;
protecteddoublesalario;
publicdoublegetBonificacao(){
returnthis.salario*0.10;
}
//mtodos
}
Se deixarmos a classe Gerente como ela est, ela vai herdar o mtodo
getBonificacao.
Gerentegerente=newGerente();
gerente.setSalario(5000.0);
System.out.println(gerente.getBonificacao());
REESCRITA

Oresultadoaquiser500.Noqueremosessaresposta,noqueremosestemtodoque
foiescritonaclasseme,euqueroreescrever(sobrescrever,override)estemtodo:

classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnthis.salario*0.15;
}
//...
}
Agorasimomtodoestcorretoparao Gerente.Refaaotesteevejaque,agora,o
valorimpressoocorreto(750):
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina69

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Gerentegerente=newGerente();
gerente.setSalario(5000.0);
System.out.println(gerente.getBonificacao());

7.3 - Chamando o mtodo reescrito


Depoisdereescrito,nopodemosmaischamaromtodoantigo,pormpodemosfazer
issodedentrodaclasse.
ImaginequeparacalcularabonificaodeumGerente,devemosfazerigualaoclculo
deumFuncionarioporemadicionandoR$1000.Poderamosfazerassim:
classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnthis.salario*0.10+1000;
}
//...
}
Aqui teramos um problema: o dia que o getBonificacao do Funcionario mudar,
precisaremosmudaromtododoGerentetambmparaacompanharanovabonificao.Para
evitarisso,ogetBonificacaodoGerentepodechamarodoFuncionarioutilizandoseda
palavrachavesuper.

classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnsuper.getBonificacao()+1000;
}
//...
}
Essa invocaovai procurar o mtodocom o nome getBonificacao de umasuper
classedeGerenteestende.NocasoelevailogoencontraressemtodoemFuncionario.
Emmuitoscasosissoocorre,poisomtodoreescritogeralmentefazalgoamaisqueo
mtododaclasseme.Chamarounoomtododecimaumadecisosua,edependedoseu
problema.

7.4 - Polimorfismo
O que guarda uma varivel do tipo Funcionario? Uma referncia para um
Funcionario.
Naherana,vimosque Gerente um Funcionario,poisumaextensodeste.Eu
possomereferenciaraum Gerente comosendoum Funcionario.Sealgumprecisafalar
comumFuncionariodobanco,podefalarcomumGerente!Porque?PoisGerente um
Funcionario.Essaasemnticadaherana.

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina70

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Gerentegerente=newGerente();
Funcionariofuncionario=gerente;
funcionario.setSalario(5000.0);
POLIMORFISMO

Polimorfismo acapacidadedeumobjetopoderserreferenciadodevriasformas.
(cuidado,polimorfismonoquerdizerqueoobjetoficasetransformando,muitopelocontrrio,
um objeto nasce de um tipo e morre daquele tipo, o que muda a maneira como nos
referenciamosaele).
Ataquitudobem,maseseeutentar:
funcionario.getBonificacao();

Qualoretornodessemtodo?500ou750?NoJava,achamadademtodosemprevai
serdecidida em tempo de execuo.OJavavaiprocuraroobjetonamemriaeaisim
decidirqualmtododeveserchamado,semprerelacionandocomsuaclassedeverdade,eno
a que estamos usando para referencialo. Apesar de estarmos nos referenciando a esse
Gerente comosendoum Funcionario,omtodoexecutadoodo Gerente.Oretorno
750.
Pareceestranhocriarumgerenteereferencilocomoapenasumfuncionrio.Porque
fariaisso?Naverdade,asituaoquecostumaapareceraquetemosummtodoquerecebe
umargumentodotipoFuncionario:
classControleDeBonificacoes{
privatedoubletotalDeBonificacoes=0;
publicvoidregistra(Funcionariofuncionario){
this.totalDeBonificacoes+=funcionario.getBonificacao();
}
publicdoublegetTotalDeBonificacoes(){
returnthis.totalDeBonificacoes;
}
}
E,emalgumlugardaminhaaplicao(ounomainseforapenasparatestes):
ControleDeBonificacoescontrole=newControleDeBonificacoes();
Gerentefuncionario1=newGerente();
funcionario1.setSalario(5000.0);
controle.registra(funcionario1);
Funcionariofuncionario2=newFuncionario();
funcionario2.setSalario(1000.0);
controle.registra(funcionario2);
System.out.println(controle.getTotalDeBonificacoes());
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina71

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Repare que conseguimos passar um Gerente para um mtodo que recebe um


Funcionariocomoargumento.Pensecomonumaportanaagnciabancriacomoseguinte
aviso:PermitidaaentradaapenasdeFuncionrios.Umgerentepodepassarnessaporta?Sim,
poisGerenteumFuncionario.
Qual ser o valor resultante? No importa que dentro do mtodo registra, do
ControleDeBonificacoes receba Funcionario, quando ele receber um objeto que
realmenteum Gerente,oseumtodoreescritoserinvocado.Reafirmando:noimporta
comonosreferenciamosaumobjeto,omtodoqueserinvocadosempreoquedele.
OdiaquecriarmosumaclasseSecretaria,porexemplo,quefilhadeFuncionario,
precisaremos mudar a classe de ControleDeBonificacoes? No. Basta a classe
Secretariareescreverosmtodosquelheparecernecessrio.exatamenteesseopoderdo
polimorfismojuntamentecomaheranaereescritademtodo:diminuiracoplamentoentreas
classes,paraqueevitarquenovoscdigosresultememmodificaeseminmeroslugares.
Repare que quem criou ControleDeBonificacoes pode nunca ter imaginado a
criaodaclasseSecretariaouEngenheiro.Istotrasumreaproveitamentoenormede
cdigo.

7.5 - Um outro exemplo


Imaginequevamosmodelarumsistemaparaafaculdade,quecontroleasdespesascom
funcionrioseprofessores.Nossofuncionrioficaassim:
classEmpregadoDaFaculdade{
privateStringnome;
privatedoublesalario;
doublegetGastos(){
returnthis.salario;
}
StringgetInfo(){
returnnome:+this.nome+comsalrio+this.salario;
}
//mtodosdeget,seteoutros
}
Ogastoquetemoscomoprofessornoapenasseusalrio.Temosdesomarum
bnusde10reaisporhora/aula.Oquefazemosento?Reescrevemosomtodo.Assimcomoo
getGastosdiferente,ogetInfotambmser,poistemosdemostrarashorasaulatambm.
classProfessorDaFaculdadeextendsEmpregadoDaFaculdade{
privateinthorasDeAula;
doublegetGastos(){
returnthis.getSalario()+this.horasDeAula*10;
}
StringgetInfo(){
StringinformacaoBasica=super.getInfo();
Stringinformacao=informacaoBasica+horasdeaula:+
this.horasDeAula;
returninformacao;
}

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina72

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

//mtodosdeget,seteoutros
}
A novidade aqui a palavra chave super. Apesar do mtodo ter sido reescrito,
gostaramosdeacessaromtododaclasseme,paranoterdecopiarecolocarocontedo
dessemtodoedepoisconcatenarcomainformaodashorasdeaula.
Comotiramosproveitodopolimorfismo?Imaginequetemosumaclassederelatrio:
classGeradorDeRelatorio{
publicvoidadiciona(EmpregadoDaFaculdadef){
System.out.println(f.getInfo());
System.out.println(f.getGastos());
}
}
Podemos passar para nossa classe qualquer EmpregadoDaFaculdade! Vai funcionar
tantoparaprofessor,quantoparafuncionriocomum.
Umcertodia,muitodepoisdeterminaressaclassederelatrio,resolvemosaumentar
nossosistema,ecolocarumaclassenova,querepresentaoReitor.Comoeletambmum
EmpregadoDaFaculdade,serquevamosprecisaralteraralgumacoisananossaclassede
Relatorio?No.essaaidia.Quemprogramouaclasse GeradorDeRelatorio nunca
imaginouqueexistiriaumaclasseReitor,emesmoassimosistemafunciona.
classReitorextendsProfessorDaFaculdade{
//informaesextras
StringgetInfo(){
returnsuper.getInfo()+eeleumreitor;
}
//nosobreescrevemosogetGastos!!!
}

7.6 - Um pouco mais...


1)SenohouvesseheranaemJava,comovocpoderiareaproveitarocdigodeoutra
classe?
COMPOSIO

2)Umadiscussomuitoatualsobreoabusonousodaherana.Algumaspessoas
usamheranaapenasparareaproveitarocdigo,quandopoderiaterfeitoumacomposio.
Procuresobreheranaversuscomposio.
3)Mesmodepoisdereescreverummtododaclasseme,aclassefilhaaindapode
acessaromtodoantigo.Istofeitoatravsdapalavrachavesuper.mtodo().Algoparecido
ocorreentreosconstrutoresdasclasses,oque?

7.7 - Exerccios
1)VamoscriarumaclasseConta,quepossuaumsaldo,eosmtodosparapegarsaldo,
depositar,esacar.
a)CrieaclasseConta
classConta{
}

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina73

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

b)Adicioneoatributosaldo
classConta{
privatedoublesaldo;
}
c)CrieosmtodosgetSaldo(),deposita(double)esaca(double)
classConta{
privatedoublesaldo;
voiddeposita(doublevalor){
this.saldo+=valor;
}
voidsaca(doublevalor){
this.saldo=valor;
}
doublegetSaldo(){
returnthis.saldo;
}

}
2)Adicioneummtodonaclasse Conta,queatualizaessacontadeacordocomuma
taxapercentualfornecida.
classConta{
privatedoublesaldo;
//outrosmtodosaqui...
voidatualiza(doubletaxa){
this.saldo=this.saldo*taxa;
}
}
3)CrieduassubclassesdaclasseConta:ContaCorrenteeContaPoupanca.Ambas
teroomtodoatualizareescrito:AContaCorrentedeveatualizarsecomodobrodataxaea
ContaPoupancadeveatualizarsecomotriplodataxa.
Almdisso,a ContaCorrente devereescreveromtodo deposita,afimderetirara
CPMFde0.38%acadadepsito.
a) Crie as classes ContaCorrente e ContaPoupanca. Ambas so filhas da classe
Conta:
classContaCorrenteextendsConta{
}
classContaPoupancaextendsConta{
}
b)ReescrevaomtodoatualizanaclasseContaCorrente,seguindooenunciado:
classContaCorrenteextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*2;
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina74

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
}
Reparequeparaacessaroatributosaldoherdadodaclasse Conta,vocvaiprecisar
trocaromodificadordevisibilidadedesaldoparaprotected.
c)ReescrevaomtodoatualizanaclasseContaPoupanca,seguindooenunciado:
classContaPoupancaextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*3;
}
}
d)NaclasseContaCorrente,reescrevaomtododepositaparadescontaracpmf:
classContaCorrenteextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*2;
}

voiddeposita(doublevalor){
this.saldo+=valor*0.9962;
}
}

Observao:existemoutrassoluesparamodificarosaldodasuaclasseme:voc
pode utilizar os mtodos retira e deposita se preferir continuar com o private
(recomendado!),ouentocriarummtodosetSaldo,masprotected,paranodeixaroutras
pessoasalteraremosaldosempassarporummtodo(nemmesmosuafilhaconseguiriaburlar
isso). Hoje emdiamuitaspessoasdizem queo protected quebra encapsulamento, assim
comoalgunscasosdeheranaondeameefilhatemumacoplamentomuitoforte.
4)Crieumaclassecommtodo main einstancieessasclasses,atualizeasevejao
resultado.Algocomo:
publicclassTestaContas{
publicstaticvoidmain(String[]args){
Contac=newConta();
ContaCorrentecc=newContaCorrente();
ContaPoupancacp=newContaPoupanca();
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina75

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

c.deposita(1000);
cc.deposita(1000);
cp.deposita(1000);
c.atualiza(0.01);
cc.atualiza(0.01);
cp.atualiza(0.01);
System.out.println(c.getSaldo());
System.out.println(cc.getSaldo());
System.out.println(cp.getSaldo());
}
}

Apsimprimirosaldo(getSaldo())decadaumadascontas,oqueacontece?
5)Oquevocachaderodarocdigoanteriordaseguintemaneira:
Contac=newConta();
Contacc=newContaCorrente();
Contacp=newContaPoupanca();

Compila?Roda?Oquemuda?Qualautilidadedisso?Realmenteessanoamaneira
maistildopolimorfismo,veremososeurealpodernoprximoexerccio.Pormexisteuma
utilidadededeclararmosumavariveldeumtipomenosespecficoqueoobjetorealmente
extremamenteimportanteperceberquenoimportacomonosreferimosaumobjeto,
omtodoqueserinvocadosempreomesmo!AJVMvaidescobriremtempodeexecuo
qualdeveserinvocado,dependendodequetipoaqueleobjeto,e no deacordocomonos
referimosaele.
6)(opcional)Vamoscriarumaclassequesejaresponsvelporfazeraatualizaode
todasascontasbancrias,egerarumrelatriocomosaldoanterioresaldonovodecadauma
dascontas.
classAtualizadorDeContas{
privatestaticdoublesaldoTotal=0;
privatedoubleselic;
AtualizadorDeContas(doubleselic){
this.selic=selic;
}

voidroda(Contac){
//aquivoceimprimeosaldoanterior,atualizaaconta,
//edepoisimprimeosaldofinal
//lembrandodesomarosaldofinalaoatributosaldoTotal
}
//outrosmtodos

7)(opcional)Nomtodomain,vamoscriaralgumascontasepassala
classTestaAtualizadorDeContas{
publicstaticvoidmain(String[]args){
AtualizadorDeContasadc=newAtualizadorDeContas(0.01);
Contac=newConta();
Contacc=newContaCorrente();
Contacp=newContaPoupanca();

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina76

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

c.deposita(1000);
cc.deposita(1000);
cp.deposita(1000);
adc.roda(c);
adc.roda(cc);
adc.roda(cp);
System.out.println("SaldoTotal:"+adc.getSaldoTotal());
}
}

8)(Opcional)CrieumaclasseBancoquepossuiumaarraydeConta.Reparequenuma
arrayde Conta vocpodecolocartanto ContaCorrente quanto ContaPoupanca.Crieum
metodo voidadiciona(Contac),ummtodo ContapegaConta(intx) eoutro int
pegaTotalDeContas(),muitosimilararelaoanteriordeEmpresaFuncionario.
Faacomqueseumtodomaincriediversascontas,insiraasnoBanco,edepoiscom
um for percorra todas as contas do Banco para passlas como argumento para o
AtualizadorDeContas.
9)(Opcional)Useapalavrachavesupernosmtodosatualizareescritos,paranoterde
refazerotrabalho.
10) (Opcional) Se voc precisasse criar uma classe ContaInvestimento, e seu
mtodo atualiza fosse complicadssimo, voc precisaria alterar as classes Banco e
AtualizadorDeContas?

Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina77

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Eclipse IDE

D-se importncia aos antepassados quando j no temos


nenhum.
FranoisChateaubriand

Nestecaptulo,vocserapresentadoaoAmbientedeDesenvolvimentoEclipseesuasprincipais
funcionalidades.

8.1 - O Eclipse
OEclipse(www.eclipse.org)umaIDE(integrateddevelopmentenvironment).Diferente
deumaRAD,ondeoobjetivodesenvolveromaisrpidopossvelatravsdearrastaresoltar
do mouse, onde montanhas de cdigo so gerados em background, uma IDE te auxilia no
desenvolvimento,evitandoseintrometerefazermuitamgica.
OEclipseaIDElderdemercado.FormadaporumconsrciolideradopelaIBM,possui
seucdigolivre.Altimaversoemdesenvolvimentoa3.2.PrecisamosdoEclipse3.1ou
posterior,poisapartirdessaversoqueaplataformadsuporteaojava5.0.Vocprecisater
apenasaJavaREinstalada.
Veremos aqui os principais recursos do Eclipse. Voc ir perceber que ele evita ao
mximo te atrapalhar, e apenas gera trechos de cdigos bvios, sempre ao seu comando.
ExistemtambmcentenasdepluginsgratuitosparagerardiagramasUML,suporteservidores
deaplicao,visualizadoresdebancodedadosemuitosoutros.
BaixeoEclipsedositeoficialwww.eclipse.org.ApesardeserescritoemJava,abiblioteca
grficausadanoEclipse,chamadaSWT,usacomponentesnativosdosistemaoperacional.Por
isso,vocdevebaixaraversocorrespondenteaoseusistemaoperacional.
Descompacteoarquivoepronto;bastarodaroexecutvel.

OutrasIDEs
UmaoutraIDEopensourcefamosaoNetbeans,daSun.(www.netbeans.org).
Almdessas,Oracle,BorlandeaprpriaIBMpossuemIDEscomerciais.
ApresentandooEclipse
Abraoterminaledigiteeclipse.
Aprimeiraperguntaqueeletefazqueworkspacevocvaiusar.Workspacedefineo
diretrioemqueassuasconfiguraespessoaiseseusprojetosserogravados.

Captulo8EclipseIDEPgina78

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Vocpodedeixarodiretrioqueelejdefiniu.
LogoemseguidaumateladeWelcomeseraberta,ondevoctemdiversoslinkspara
tutoriaiseajuda.CliqueemWorkbench.AteladeWelcomedoEclipse3.2(queestnafigura
abaixo)umpoucodiferentedado3.1.

8.2 - Views e Perspective


Captulo8EclipseIDEPgina79

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

FecheateladeWelcomeevocveratelaabaixo.Nestatela,destacamosasViews(em
linhacontnua)easPerspectives(emlinhapontilhada)doEclipse.

Mude para a perspectiva Resource clicando no cone ao lado da perspectiva Java


selcionando Other e depois Resource. Neste momento, trabalharemos com esta perspectiva
antesdadeJava,poiselapossuiumconjuntodeViewsmaissimples.

AViewNavigatormostraaestruturadediretrioassimcomoestnosistemadearquivos.
AViewOutlinemostraumresumodasclasses,interfaceseenumeraesdeclaradasnoarquivo
javaatualmenteeditado(servetambmparaoutrostiposdearquivos).

Captulo8EclipseIDEPgina80

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

NomenuWindow>ShowView>othervocpodeverasdezenasdeViewsquejvem
embutidasnoEclipse.AcostumeseasempreprocurarnovasViews,elaspodemteajudarem
diversastarefas.

8.3 - Criando um projeto novo


VemFile>New>Project.SelecionaJavaProjectecliqueemNext.

Captulo8EclipseIDEPgina81

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

VocpodechegarnessamesmateladandocliquedadiretanoespaodaViewNavigator
eseguindoomesmomenu.Nestatela,configureseuprojetocomonatelaabaixo:

Captulo8EclipseIDEPgina82

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Isto,marquecreateseparatesourceandoutputfolders,destamaneiraseusarquivos
javaearquivosclassestaroemdiretriosdiferentes,paravoctrabalhardeumamaneiramais
organizada.
CliqueemFinish.OEclipsepedirparatrocaraperspectivaparaJava;escolhaNopara
permanceremResource.Agora,naViewNavigator,vocveronovoprojetoesuaspastase
arquivos:

8.4 - Nossa classe Conta


VamosiniciarnossoprojetocriandoaclasseConta.Paraisso,vemFile>New>Other
>Class.CliqueemNextecrieaclasseseguindoatelaabaixo:

CliqueemFinish.OEclipsepossuidiversoswizards,masusaremosomnimodeles.O
interessante usar o code assist e quick fixes que a ferramente possui, que veremos em
Captulo8EclipseIDEPgina83

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

seguida.Noseatenteasmilharesdeopesdecadawizard,apartemaisinteressantedo
Eclipsenoessa.
Escreva o mtodo deposita como abaixo, e note que o Eclipse reclama de erro em
this.saldopoisesteatributonoexiste.

VamosusarorecursodoEclipsedequickfix.Coloqueocursoremcimadoerroeaperte
Ctrl+1.

OEclipsesugerirpossveisformasdeconsertaroerro;umadelasjustamentecriaro
camposaldonaclasseConta,quenossoobjetivo.Cliquenestaopo.

Este recurso de quick fixes, acessvel pelo Ctrl+1, uma das grandes facilidades do
Eclipseeextremamentepoderoso.Atravsdelepossvelcorrigirboapartedoserrosnahora
deprogramare,comofizemos,economizaradigitaodecertoscdigosrepetitivos.Nonosso
exemplo noprecisamoscriarocampoantes;oEclipsefazissoparans.Eleatacertaa
tipagem,jqueestamossomandoeleaumdouble.Oprivatecolocadopormotivosquej
estudamos.
VaomenuFile>Saveparagravar.Control+Stemomesmoefeito.
Captulo8EclipseIDEPgina84

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

8.5 - Criando o main


CrieumanovaclassechamadaPrincipal.Vamoscolocarummtodomainpara testar
nossaConta.Aoinvsdedigitartodoomtodomain,vamosusaro codeassist doEclipse.
EscrevasmaineaperteCtrl+Espaologoemseguida.

Captulo8EclipseIDEPgina85

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

OEclipsesugeriracriaodomtodomaincompleto;selecioneestaopo.Ocontrol+
espaochamadode codeassist.Assimcomoosquickfixessodeextremaimportncia.
Experiementeusarocodeassistemdiversoslugares.
Agora,dentrodomtodomain,comeceadigitaroseguintecdigo:
Contaconta=newConta();
conta.deposita(100.0);

Observeque,nahoradeinvocaromtodoemcimadoobjetoconta,oEclipsesugereos
mtodospossveis.Esterecursobastantetil,principalmentequandoestivermosprogramando
com classesqueno so asnossas, como daAPI doJava. O Eclipse aciona este recurso
quandovocdigitaopontologoapsumobjeto(evocpodeusaroCtrl+Espaoparaacion
lo).
Agora, vamos imprimir o saldo com System.out.println. Mas, mesmo nesse cdigo, o
Eclipse nos ajuda. Escreva sysout e aperte Ctrl+Espao que o Eclipse escrever
System.out.println()paravoc.
Paraimprimir,chameoconta.getSaldo():
System.out.println(conta.getSaldo());

NotequeoEclipseacusarerroemgetSaldo()porqueestemtodonoexistenaclasse
Conta.VamosusarCtrl+1emcimadoerroparacorrigiroproblema:

OEclipsesugerecriarummtodogetSaldo()naclasseConta.Selecioneestaopoeo
mtodoserinseridoautomaticamente.
publicObjectgetSaldo(){
//TODOAutogeneratedmethodstub
returnnull;
}

ImplementeomtodogetSaldocomosegue:
publicdoublegetSaldo(){
returnthis.saldo;
}

Captulo8EclipseIDEPgina86

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

EssespequenosrecursosdoEclipsesodeextremautilidade.Dessamaneiravocpode
programarsemsepreocuparcommtodosqueaindanoexistem,jqueaqualquermomento
elepodetegeraroesqueleto(apartedaassinaturadomtodo).

8.6 - Rodando o main


Vamosrodaromtodomaindessanossaclasse.NoEclipse,cliquecomobotodireitono
arquivoPrincipal.javaevemRunas...JavaApplication.

O Eclipse abrir uma View chamada Console onde ser apresentada a sada do seu
programa:

Quandovocprecisarrodardenovo,bastaclicarnoconeverdedeplaynatoolbar,que
rodaoprogramaanterior.Aoladodesseconetemumasetinhaondesolsitadosos10ltimos
executados.

8.7 - Pequenos truques


OEclipsepossuimuitosatalhosteisparaoprogramador.Algunsbeminteressantesde
Captulo8EclipseIDEPgina87

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

saber:
Ctrl+1Acionaoquickfixescomsugestesparacorreodeerros.
Ctrl+EspaoCompletacdigos
Ctrl+PgUp e Ctrl+PgDown Naveganasabasabertas.tilquandoestivereditando
vriosarquivosaomesmotempo.
Ctrl+Shift+FFormataocdigosegundoasconvenesdoJava
Ctrl+MExpandeaViewatualparaatelatoda(mesmoefeitodedardoiscliquesnottulo
daView)
Ctrl+Shift+LExibetodososatalhospossveis.
Ctrl+OExibeumoutlinepararpidanavegao
Veremosmaisnodecorrerdocurso,emespecialquandovermospacotes.

8.8 - Exerccios
1) Crie as classes ContaCorrente, ContaPoupanca e opcionalmente o
AtualizadorDeContasnonossoprojetodoEclipse.Destaveztenteabusardocontrol+espaoe
control+1.
Porexemplo:
ContaCorr<ControlEspaco><ControlEspaco>=new<ControlEspaco>();

Reparequeatmesmonomesdevariveiselecriaparavoc!
2)ImaginequequeremoscirarumsetterdosaldoparaaclasseConta.Dentrodaclasse
Conta,digite:
setSa<ControlEspaco>

Omesmovalenocasodevocquererreescreverummtodo.DentrodeContaCorrente
faa:
atua<ControlEspaco>

3)VnasuaclassequetemomainesegureoCONTROLapertadoenquandovoc
passaomousesobreoseucdigo.Reparequetudovirouhyperlink.Cliqueemummtodoque
vocestinvocandonaclasseConta.
4)Deumcliquedadireitaemumarquivononavigator.EscolhaCompareWith>Local
History.Oqueestatela?

Captulo8EclipseIDEPgina88

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

5)UseoControl+Shift+Fparaformataroseucdigo.Dessamaneiraelevaiarrumara
bagunadeespaamentoeentersdoseucdigo.

6)(opcional)Oquesoosarquivos.projecte.classpath?Leiaocontedodeles.
7)(opcional)Cliquedadireitanoprojeto,propriedades.umadastelasmaisimportantes
do Eclipse, onde voc pode configurar diversas funcionalidades para o seu projeto, como
compilador,verses,formatador,cvseoutros.

Captulo8EclipseIDEPgina89

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Captulo8EclipseIDEPgina90

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

Orientao a Objetos Classes Abstratas


D-se importncia aos antepassados quando j no temos
nenhum.
FranoisChateaubriand

Aotrminodessecaptulovocsercapazdeutilizarclassesabstratasquandonecessrio.

9.1 - Repetindo mais cdigo?


NestecaptuloaconselhamosquevocpasseausaroEclipse.Vocjtemconhecimento
suficientedoserrosdecompilaodojavac,eagorapodeaprenderasfacildiadesqueoEclipse
tetrazaoajudarvocnocdigocomoschamadosquickfixesequickassists.
VamosrecordaremcomopodeestarnossaclasseFuncionario:
classFuncionario{
protectedStringnome;
protectedStringcpf;
protecteddoublesalario;
publicdoublegetBonificacao(){
returnthis.salario*1.2;
}
//outrosmtodosaqui
}
ConsidereagoraonossoControleDeBonificacao:

classControleDeBonificacoes{
privatedoubletotalDeBonificacoes=0;
publicvoidregistra(Funcionariof){
System.out.println("Adicionandobonificacaodofuncionario:"+
f);
this.totalDeBonificacoes+=funcionario.getBonificacao();
}
publicdoublegetTotalDeBonificacoes(){
returnthis.totalDeBonificacoes;
}
}
NossomtodoregistrarecebequalquerreferenciadotipoFuncionario,isto,pode
ser objetos do tipo Funcionario e qualquer de seus subtipos: Gerente, Diretor e
eventualmentealgumanovasubclassequevenhaserescrita,semprvioconhecimentodoautor
Captulo9OrientaoaObjetosClassesAbstratasPgina91

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

daControleDeBonificacao.
Estamosutilizandoaquiaclasse Funcionario paraopolimorfismo:senofosseela
teramosumgrandeprejuzo:precisaramoscriarummtodobonificapararecebercadaum
dostiposdeFuncionario,umparaGerente,umparaDiretor,etc.Reparequeperderesse
podermuitopiorqueapequenavantagemqueaheranatrazemherdarcdigo.
Porm, em alguns sistemas, como o nosso caso, usamos uma classe apenas com
essesintuitos:deeconomizarumpoucocdigoeganharpolimorfismoparacriarmtodosmais
genricosequeseencaixemadiversosobjetos.
FazsentidoterumobjetodotipoFuncionario?Essaperguntadiferentedesaberse
faz sentido ter uma referncia do tipo Funcionario: esse caso faz sim e muito til.
Referenciando Funcionario temos o polimorfismo de referncia, j que podemos receber
qualquercoisaquesejaumFuncionario.Porm,darnewemFuncionariopodenofazer
sentido,isso,noqueremosreceberumobjetodotipoFuncionario,queremosqueaquela
referncia seja ou um Gerente, ou um Diretor, etc. Algo mais concreto que um
Funcionario.
ControleDeBonificacoescdb=newControleDeBonificacoes();
Funcionariof=newFuncionario();
cdb.adiciona(f);//fazsentido?
Umoutrocasoemquenofazsentidoterumobjetodaqueletipo,apesardaclasseexistir:
imagineaclassePessoaeduasfilhas,PessoaFisicaePessoaJuridica.Quandopuxamos
umrelatriodenossosclientes(umaarraydePessoaporexemplo),queremosquecadaum
delessejaouuma PessoaFisica,ouuma PessoaJuridica.Aclasse Pessoa nessecaso
estaria sendo usada apenas para ganhar o polimorfismo e herdar algumas coisas: no faz
sentidopermitirinstancila.
Pararesolveressesproblemastemosasclassesabstratas.

9.2 - Classe abstrata


OqueexatamentevemaseranossaclasseFuncionario?Nossaempresatemapenas
Diretores, Gerentes, Secretarias, etc. Ela uma classe que apenas idealiza um tipo, define
apenasumrascunho.
ParaonossosistemainadmissvelumobjetoserapenasdotipoFuncionario(pode
existirumsistemaemquefaasentidoterobjetosdotipo Funcionario ouapenas Pessoa,
mas,nonossocaso,no).
CLASSE
ABSTRATA
ABSTRACT

Usamosapalavrachaveabstractparaimpedirqueelapossaserinstanciada.Esseo
efeitodiretordeseusaromodificadorabstractnadeclaraodeumaclasse:

abstractclassFuncionario{
protecteddoublesalario;
publicdoublegetBonificacao(){
returnthis.salario*1.2;
}
//outrosatributosemtodoscomunsatodosFuncionarios
}

Captulo9OrientaoaObjetosClassesAbstratasPgina92

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Enomeiodeumcdigo:
Funcionariof=newFuncionario()//nocompila!!!

Ocdigoacimanocompila.Oproblemainstanciaraclasse,criarrefernciavocpode
(e deve, pois til). Se ela no pode ser instanciada, para que serve? Somente para o
polimorfismoeheranadosatributosemtodos.
Vamosentoherdardessaclasse,reescrevendoomtodogetBonificacao:
classGerenteextendsFuncionario{
publicStringgetBonificacao(){
returnthis.salario*1.4+1000;
}
}

Masqualarealvantagemdeumaclasseabstrata?Poderamosterfeitoistocomuma
heranacomum.Porenquanto,anicadiferenaquenopodemosinstanciarumobjetodo
tipoFuncionario,quejdegrandevalia,dandomaisconsistnciaaosistema.
Que fique claro que a nossa deciso de tranformar Funcionario em uma classe
abstratadependeudonossonegcio.Podeserqueemumsistemacomclassessimilaresuma
classeanlogaaFuncionariofaasentidoserconcreta.

9.3 - Mtodos abstratos


SenotivssemosreescritoomtodogetBonificacao,essemtodoseriaherdadoda
classeme,fazendocomqueeledevolvesseosalriomais20%.Cadafuncionrioemnosso
sistematemumaregratotalmentediferenteparaserbonificado.
Serentoquefazalgumsentidoteressemtodonaclasse Funcionario?Serque
existeumabonificaopadroparatodotipode Funcionario?Pareceno,cadaclassefilha
terummtododiferentedebonificaopoisdeacordocomnossosistemanoexisteuma
Captulo9OrientaoaObjetosClassesAbstratasPgina93

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

regrageral:queremosquecadapessoaqueescreveaclassedeum Funcionario diferente


(subclassesdeFuncionario)reescrevaomtodogetBonificacaodeacordocomassuas
regras.
PoderamosentojogarforaessemtododaclasseFuncionario?Oproblemaquese
ele no existisse, no poderamos chamar o mtodo apenas com uma referncia a um
Funcionario,poisningumgarantequeessarefernciaapontaparaumobjetoquepossui
essemtodo.
MTODO
ABSTRATO

Existe um recurso em Java que, em uma classe abstrata, podemos escrever que
determinadomtodosersempreescritopelasclassesfilhas.Isto,ummtodo abstrato.
Eleindicaquetodasasclassesfilhas(concretas,isso,quenoforemabstratas)devem
reescreveressemtodo,ounocompilaro.comosevocherdassearesponsabilidadedeter
aquelemtodo.

Comodeclararummtodoabstrato
svezesnoficaclarocomodeclararummtodoabstrato.
Bastaescreverapalavrachaveabstractnaassinaturadomesmoecolocarumpontoevrgulaem
vezdeabreefechachaves!
abstractclassFuncionario{
abstractdoublegetBonificacao();
//outrosatributosemtodos
}

Reparequenocolocamosocorpodomtodo,eusamosapalavrachave abstract
paradefiniromesmo.Porquenocolocarcorpoalgum?Porqueessemtodonuncavaiser
chamado,semprequandoalgumchamaromtodo getBonificacao,vaicairemumadas
suasfilhas,querealmenteescreveramomtodo.
Qualquerclassequeestenderaclasse Funcionario serobrigadaareescrevereste
mtodo, tornandoo concreto. Se no reescreverem esse mtodo, um erro de compilao
ocorrer.
OmtododoControleDeBonificacaoestavaassim:
publicvoidregistra(Funcionariof){
System.out.println(Adicionandobonificacaodofuncionario:+f);
this.totalDeBonificacoes+=funcionario.getBonificacao();
}

Como posso acessar o mtodo getBonificacao se ele no existe na classe


Funcionario?
J que o mtodo abstrato, com certeza suas subclasses tm esse mtodo, o que
garantequeessainvocaodemtodonovaifalhar.Bastapensarqueumarefernciadotipo
Funcionario nuncaapontaparaumobjetoquenotemomtodo getBonificacao,pois
nopossvelinstanciarumaclasseabstrata,apenasasconcretas.Ummtodoabstratoobriga
a classe em que ele se encontra ser abstrata, o que garante a coerncia do cdigo acima
compilar.

9.4 - Um outro exemplo


Captulo9OrientaoaObjetosClassesAbstratasPgina94

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Nosso banco deseja todo dia de manh atualizar as contas bancrias de todas as
pessoas. Temos dois tipos de conta, a ContaCorrente e a ContaPoupanca. A
ContaPoupancaatualizatododiaumapequenaporcentagem,jaContaCorrentesprecisa
atualizarsecomumfatordecorreomensal.
1.classConta{

2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.}

privatedoublesaldo=0.0;
publicvoidretira(doublevalor){
this.saldo=valor;
}
publicvoiddeposita(doublevalor){
this.saldo+=valor;
}
publicdoublegetSaldo(){
returnthis.saldo();
}

1.classContaCorrenteextendsConta{

2.
3.
4.
5.
6.
7.
8.}

privatedoublelimiteDoChequeEspecial=1000.0;
privatedoublegastosNoChequeEspecial=100.0;
publicvoidatualiza(){
super.retira(this.gastosNoChequeEspecial*0.08);
}

1.classContaPoupancaextendsConta{

2.
3.
4.
5.
6.
7.}

privatedoublecorrecaoMensal;
publicvoidatualiza(){
super.deposita(this.saldo*this.correcaoMensal);
}
O que no est legal aqui? Por enquanto usamos herana para herdar um pouco de
cdigo,eassimnoterdereescrevlo.Masjfrisamosqueessanoagrandevantagemde
seusarherana,aidiautilizaropolimorfismoadquirido.Podemosnosreferenciarauma
ContaCorrenteeContaPoupancacomosendoumaConta:

classAtualizadorDeSaldos{
privateConta[]contas;
publicvoidsetContas(Conta[]contas){
this.contas=contas;
}
publicvoidatualizaSaldos(){
for(Contaconta:this.contas){
conta.atualiza();//nocompila!!!
}
}
}

Estecdigoacimanocompila!SetenhoumarefernciaparaumaConta,quemgarante
queoobjetoreferenciadotemomtodoatualiza?Ningum.Podemosentocoloclonaclasse
Conta:
classConta{
protecteddoublesaldo;
Captulo9OrientaoaObjetosClassesAbstratasPgina95

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

publicvoidretira(doublevalor){
this.saldo=valor;
}
publicvoiddeposita(doublevalor){
this.saldo=valor;
}
publicdoublegetSaldo(){
returnthis.saldo();
}
publicvoidatualiza(){
//nofaznada,servesparaopolimorfismo
}
}

Oqueaindanoestlegal?CadatipodeConta,isto,cadasubclassedeContasabe
comoseatualizar.Squequandoherdamosde Conta nsjherdamosomtodoatualiza,o
quenonosobrigaareescrevlo.Almdisso,nonossosistema,nofazsentidoexistirum
objeto que realmente da classe Conta, essa classe s um conceito, uma idia, ela
abstrata! Assim como seu mtodo atualiza, o qual queremos forar que as subclasse
reescrevam.
abstractclassConta{
protecteddoublesaldo;
publicvoidretira(doublevalor){
this.saldo=valor;
}
publicvoiddeposita(doublevalor){
this.saldo+=valor;
}
publicdoublegetSaldo(){
returnthis.saldo;
}
publicabstractvoidatualiza();
}

Podemosentotestaressesconceitoscriando2Contas(umadecadatipo)echamandoo
mtodoatualizadecadaumadelas:
publicclassTesteClassesAbstratas{
publicstaticvoidmain(Stringargs[]){
//criamosascontas
Conta[]contas=newConta[2];
contas[0]=newContaPoupanca();
contas[1]=newContaCorrente();
//iteramosechamamosatualiza
for(Contaconta:contas){
conta.atualiza(0.01);
}
}
}

Eagorasenonossoexemplodeempresasetivssemososeguintediagramadeclasses
comosseguintesmtodos:

OusejatenhoaclasseabstrataFuncionario,comomtodoabstrato getBonificacao,
as classes Gerente e Presidente estendendo Funcionario, e implementando o mtodo
getBonificacao,eporfimaclasses Diretor queestende Gerente, masnoimplementao

Captulo9OrientaoaObjetosClassesAbstratasPgina96

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

mtodogetBonificacao.

Essasclassesvocompilar?Vorodar?
Arespostasim,ealmdetudofaroexatamenteoquensqueremos,poisquando
Gerente e Presidente possuem os mtodos perfeitamente implementados, e a classe
Diretor,quenopossuiomtodoimplementado,vaiusaraimplementaodeGerente.

Eessediagrama,queagoraincluimosumaclasseabstrata Secretaria,semomtodo
getBonificacao, que estendida por mais duas classes (SecretariaAdministrativa,
SecretariaAgencia)queimplementamomtodogetBonificacao,vaicompilar?Vairodar?
Denovoarespostasim,poisSecretariaumaclasseabstrataeporissooJavatem
certezaqueningumvaiconseguirinstncilaemuitomenoschamaromtodogetBonificacao
dela.Lembrandoquenoprecisamosquenessecasonoprecisamosnemaomenosescrever
omtodoabstratogetBonificacaonaclasseSecretaria.Seeunoreescreverummtododa
minhaclassemequeabstratoocdigonoircompilar.Maspossoclassetambmabstrata!

java.io
Classesabstratasnopossuemnenhumsegredonoaprendizado,masquemestaprendendo
Captulo9OrientaoaObjetosClassesAbstratasPgina97

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

orientaoaobjetospodeterumaenormedificuldadeparasaberquandoutilizlas,oquemuito
normal.
Estudaremosopacotejava.io,queusabastanteclassesabstratas,sendoumexemplorealdeuso
desserecurso,quevaimelhoraroentendimentodasmesmas.(classeInputStreamesuasfilhas)

9.5 - Para saber mais...


1) Uma classe que estende uma classe normal tambm pode ser abstrata! Ela no
poderserinstanciada,massuaclassepaisim!
2)Umaclasseabstratanoprecisanecessariamenteterummtodoabstrato.

9.6 - Exerccios
1) Repare que a nossa classe Conta uma excelente candidata para uma classe
abstrata.Porque?Quemtodosseriaminteressantescandidatosaseremabstratos?
Transformeaclasse Conta paraabstrata,nomaintentedarum new nelaecompileo
cdigo.
abstractclassConta{
//...
}
2)SeagoranopodemosdarnewemConta,qualautilidadedeterummtodoque
recebeumarefernciaaContacomoargumento?Alis,possoterisso?
3) Remova o mtodo atualiza() da ContaPoupanca, dessa forma ele herdar o
mtodo diretamente de Conta. Transforme o mtodo atualiza() da classe Conta para
abstrato. Repare que ao colocar a palavra chave abstract ao lado do mtodo, o Eclipse
rapidamentevaisugerirquevocdeveremoverocorpo(body)domtodo.

Compileocdigo.QualoproblemacomaclasseContaPoupanca?
abstractclassConta{
//atributosemetodosquejexistiam
abstractvoidatualiza(doubletaxaSelic);
}
4) Reescreva o mtodo atualiza() na classe ContaPoupanca para que a classe
possacompilarnormalmente.(Oeclipsetambmsugereissocomoumquickfix)

Captulo9OrientaoaObjetosClassesAbstratasPgina98

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

5) (opcional) Existe outra maneira da classe ContaCorrente compilar se voc no


reescreveromtodoabstrato?
6)(opcional)PraqueteromtodoatualizanaclasseContaseelenofaznada?Oque
acontece se simplesmente apagamos esse mtodo da classe Conta, e deixamos o mtodo
atualizanasfilhas?
7)(opcional)NopodemosdarnewemConta,masporqueentopodemosdarnewem
Conta[10],porexemplo?
8)(opcional)Vocpodechamaromtodoatualizadedentrodaprpriaclasse Conta?
Porque?(pesquise:templatemethoddesignpattern)

Captulo9OrientaoaObjetosClassesAbstratasPgina99

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

10

Orientao Objetos Interfaces

10

O homem absurdo aquele que nunca muda.


GeorgesClemenceau

Aotrminodessecaptulo,vocsercapazde:
dizeroqueumainterfaceeasdiferenasentreheranaeimplementao;
escreverumainterfaceemJava;
utilizlascomoumpoderosorecursoparadiminuiracoplamentoentreasclasses.

10.1 - Aumentando nosso exemplo


ImaginequeumSistemadeControledoBancopodeseracessado,almdosGerentes,
pelosDiretoresdoBanco.Ento,teramosumaclasseDiretor:
classDiretorextendsFuncionario{
publicbooleanautentica(intsenha){
//verificaaquiseasenhaconferecomarecebidacomo
parametro
}
}
EaclasseGerente:
classGerenteextendsFuncionario{
publicbooleanautentica(intsenha){
//verificaaquiseasenhaconferecomarecebidacomo
parametro
//nocasodogerenteverificatambemseodepartamentedele
//temacesso
}
}

Captulo10OrientaoObjetosInterfacesPgina100

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

ReparequeomtododeautenticaodecadatipodeFuncionariopodevariarmuito.
Masvamosaosproblemas.ConsidereoSistemaInterno,eseucontrole,precisamosreceber
umDiretorouGerentecomoargumento,verificarseeleseautenticaecoloclodentrodo
sistema:
classSistemaInterno{
voidlogin(Funcionariofuncionario){
//chamaromtodoautentica?noda!NemtodoFuncionariotem
}
}
OSistemaInternoaceitaqualquertipodeFuncionario,tendoeleacessoaosistema
ouno,masnotequenemtodoFuncionariopossuiomtodoautentica.Issonosimpede
de chamar esse mtodo com uma referncia apenas a Funcionario (haveria um erro de
compilao).Oquefazerento?
Uma possibilidade: criar dois mtodos login no SistemaInterno: um para receber
DiretoreoutroparareceberGerente.Jvimosqueessanoumaboaescolha.Porque?
Cada vez que criarmos uma nova classe de Funcionario que autenticvel,
precisaramosadicionarumnovomtododeloginnoSistemaInterno.
SOBRECARGA

Mtodoscommesmonome
EmJava,mtodospodemteromesmonomedesdequenosejamambguos,isso,queexista
umamaneiradedistinguirnomomentodachamada.
Issosechamasobrecargademtodo.(overloading,noconfundircomoverriding,que
umconceitomuitomaispoderosonocaso).
Umasoluomaisinteressanteseriacriarumaclassenomeiodarvoresdeherana,
FuncionarioAutenticavel:
classFuncionarioAutenticavelextendsFuncionario{
publicbooleanautentica(intsenha){
//fazautenticacaopadrao
}

Captulo10OrientaoObjetosInterfacesPgina101

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

//outrosatributosemetodos
}

As classes
Diretor
e
Gerente
passariam a estender de
FuncionarioAutenticavel,eoSistemaInternoreceberiarefernciasdessetipo,comoa
seguir:
classSistemaInterno{
voidlogin(FuncionarioAutenticavelfa){
intsenha=//pegasenhadeumlugar,oudeumscannerde
polegar
booleanok=
fa.autentica(senha);
//aquieupossochamaroautentica!
//PoistodoFuncionarioAutenticaveltem
}
}

ReparequeFuncionarioAutenticavelumafortecandidataaclasseabstrata.Mais
ainda,omtodoautenticapoderiaserummtodoabstrato.
Ousodeheranaresolveessecaso,masvamosaumaoutrasituao:
PrecisamosquetodososclientestambmtenhamacessoaoSistemaInterno.Oque
fazer?UmaopocriaroutromtodologinemSistemaInterno:masjdescartamosessa
anteriormente.
Uma outra, que comum entre os novatos, fazer uma herana sem sentido para
resolver o problema, por exemplo, fazer Cliente extends FuncionarioAutenticavel.
Realmente resolve o problema, mas trar diversos outros. Cliente definitivamente no
FuncionarioAutenticavel.Sevocfizerisso,o Cliente ter,porexemplo,ummtodo
getBonificacao,umatributosalarioeoutrosmembrosquenofazemomenorsentidopara
estaclasse!Nofaaheranaquandoarelaonoestritamenteum.

Captulo10OrientaoObjetosInterfacesPgina102

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Comoresolverento?

10.2 - Interfaces
O que precisamos para resolver nosso problema? Arranjar uma forma de poder
referenciar Diretor, GerenteeCliente deumamesmamaneira, isto,acharumfator
comum.
Se existisse uma forma na qual essas classes garantissem a existncia de um
determinadomtodo,atravsdeumcontrato,resolveramosoproblema.
Todaclassedefine2itens:

CONTRATO

oqueumaclassefaz(asassinaturasdosmtodos)
comoumaclassefazessastarefas(ocorpodosmtodoseatributosprivados)

Podemoscriarumcontratoquedefinetudooqueumaclassedevefazersequiserter
umdeterminadostatus.Imagine:
contratoAutenticavel:

quemquiserserAutenticavelprecisasaberfazer:
1. autenticardadaumasenha,devolvendoumbooleano

Quemquiserpodeassinaressecontrato,sendoassimobrigadoaexplicarcomoser
feitaessaautenticao.Avantagemque,seumGerenteassinaressecontrato,podemosnos
referenciaraumGerentecomoumAutenticavel.
PodemoscriaressecontratoemJava!
interfaceAutenticavel{
booleanautentica(intsenha);
Captulo10OrientaoObjetosInterfacesPgina103

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
INTERFACE

Chamase interface pois a maneira a qual poderemos conversar com um


Autenticavel.Interfaceamaneiraatravsconversamoscomumobjeto.
Lemos a interface da seguinte maneira: quem desejar ser autenticavel precisa saber
autenticardadouminteiroeretornandoumbooleano.Realmenteumcontrato,ondequem
assinaseresponsabilizaporreescreveressesmtodos(cumprirocontrato).
Uma interface pode definir uma srie de mtodos, mas nunca conter implementao
deles.Elasexpeoqueoobjetodevefazer,enocomoelefaz,nemoqueeletem.Como
elefazvaiserdefinidoemumaimplementaodessainterface.

IMPLEMENTS

EoGerentepodeassinarocontrato,ouseja,implementarainterface.Nomomento
que ele implementa essa interface, ele precisa escrever os mtodos pedidos pela interface
(muito prximo ao efeito de herdar mtodos abstratos, alis, mtodos de uma interface so
pblicos e abstratos, sempre). Para implementar usamos a palavra chave implements na
classe:

classGerenteextendsFuncionarioimplementsAutenticavel{
privateintsenha;
//outrosatributosemtodos
publicbooleanautentica(intsenha){
if(this.senha!=senha)
returnfalse;
//podefazeroutraspossiveisverificacoes,comosaberseesse
//departamentodogerentetemacessoaoSistema
returntrue;
}
}

Oimplementspodeserlidodaseguintemaneira:Aclasse Gerente secomprometea


ser tratada como Autenticavel, sendo obrigada a ter os mtodos necessrios, definidos
nestecontrato.
Captulo10OrientaoObjetosInterfacesPgina104

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

A partir de agora, podemos tratar um Gerente como sendo um Autenticavel.


Ganhamospolimorfismo!Temosmaisumaformadereferenciaraum Gerente.Quandocrio
umavariveldotipoAutenticavel,estoucriandoumarefernciaparaqualquerobjetodeuma
classequeimplementaAutenticavel,diretaouindiretamente:
Autenticavela=newGerente();
//possoaquichamarometodoautentica!
Novamente,oproveitomaiscomumaquiseriarecebercomoargumento.
VoltamosaonossoSistemaInterno:
classSistemaInterno{
voidlogin(Autenticavela){
intsenha=//pegasenhadeumlugar,oudeumscannerdepolegar
booleanok= fa.autentica(senha);
//aquieupossochamaroautentica!
//nonecessariamenteumFuncionario!Maisainda,eunosei
//queobjetoarefernciaaestapontandoexatamente!
Flexibilidade.
}
}
Pronto!EjpodemospassarqualquerAutenticavelparaoSistemaInterno.Ento
precisamosfazercomqueoDiretortambmimplementeessainterface.
classDiretorextendsFuncionarioimplementsAutenticavel{
//metodoseatributos,alemdeobrigatoriamenteteroautentica
}

AgorapodemospassarumDiretor.Nodiaemquetivermosmaisumfuncionriocom
acessoaosistema,bastaqueeleimplementeessainterface,paraseencaixarnosistema.
Qualquer Autenticavel passado para o SistemaInterno. Est bom para ns.
Captulo10OrientaoObjetosInterfacesPgina105

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Reparequepoucoimportaquemoobjetoreferenciadorealmente,poiseletemummtodo
autentica queonecessrioparanosso SistemaInterno funcionarcorretamente.Alis,
qualquer outra classe que futuramente implemente essa interface poder ser passada como
argumentoaqui.
OuseagoraachamosqueoFornecedorprecisateracesso:bastaqueeleimplemente
Autenticavel.Olhesotamanhododesacoplamento:quemescreveuoSistemaInterno
sprecisasaberqueeleAutenticavel.
NofazdiferenaseumDiretor,Gerente,Clienteouqualquerclassequevenha
pora.Bastaseguirocontrato! Maisainda,cada Autenticavel podeseautenticardeuma
maneiracompletamentediferentedeoutroAutenticavel!
Lembrese:ainterfacedefinequetodosvosaberseautenticar(oqueelefaz)enquanto
aimplementaodefinecomoexatamentevaiserfeito(comoelefaz).
Amaneiracomoosobjetossecomunicamnumsistemaorientadoaobjetosmuitomais
importantedoquecomoelesexecutam.Oqueumobjetofazmaisimportantedecomoele
faz,seguindoessaregraseusistemaficamaisfcildemanter,modificaremuitomais!Como
vocjpercebeu,estaumadasidiasprincipaisquequeremospassar.

Vocpodeimplementarmaisdeumainterface!
Diferentementedasclasses,umainterfacepodeherdardemaisdeumainterface.comoum
contratoquedependedequeoutroscontratossejamfechadosantesdestevaler.Vocnoherda
mtodoseatributos,esimresponsabilidades.

10.3 - Dificuldade no aprendizado de interfaces


Interfaces representam uma barreira no aprendizado do Java: parece que estamos
escrevendoumcdigoquenoserve pranada,jqueteremosessalinha(a assinaturado
mtodo)escritanasnossasclassesimplementadoras.Essaumamaneiraerradadesepensar.
Oobjetivodousodeumainterfacedeixarseucdigomaisflexvel,epossibilitaramudanade
implementao sem maiores traumas. No apenas um cdigo de prototipao, um
cabealho!
Osmaisradicaisdizemquetodaclassedeveserinterfaceada,isto,sdevemosnos
referiraobjetosatravsdesuasinterfaces.Sedeterminadaclassenotemumainterface,ela
deveria ter. Os autores deste material acham tal medida radical demais, porm o uso de
interfacesemvezdeheranaamplamenteaconselhado.(consultarosclssicoslivrosDesign
Patterns,RefactoringeEffectiveJava).
NolivroDesignPatterns,logonoincioosautorescitam2regrasdeouro.Umaevite
herana,prefiracomposio,eaoutraprogramevoltadoainterfaceenoaimplementao.
Veremosousodeinterfacesnocaptulodecolees,oquemelhoraoentendimentodo
assunto. O exemplo da interface Comparable tambm muito esclarecedora, onde
enxergamos o reaproveitamento de cdigo atravs das interfaces, alm do encapsulamento
(paraomtodoCollections.sort()poucoimportaquemvaiserpassadocomoargumento,
para ele basta que a coleo sejam de objetos comparveis, ele pode ordenar Elefante,
ConexaoouContaCorrente,desdequeimplementemComparable).

Captulo10OrientaoObjetosInterfacesPgina106

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

10.4 - Exemplo interessante: conexes com o banco de dados


Comofazercomquetodasaschamadasparabancosdedadosdiferentesrespeitema
mesmaregra?Usandointerfaces!ImagineumainterfaceConexao,ondetodososmtodosque
precisamosparanoscomunicaretrocardadoscomobancoestodefinidosl.Cadaempresa
ficaencarregadadecriarasuaimplementaoparaessainterface.
Quemforusaruma Conexao noprecisaseimportarcomqualobjetoexatamenteest
trabalhando,jqueelevaicumpriropapelquetodaConexaodeveter.

Apesardojava.sql.Connectionnotrabalharbemassim,aidiamuitosimilar,pormas
conexesvemdeumafactorychamadaDriverManager.
Conexo a banco de dados est fora do escopo desse treinamento, mas um dos
primeirostpicosabordadosnocursoFJ21,juntamentecomDAO.

10.5 - Um pouco mais...


1) Posso substituir toda minha herana por interfaces? Qual a vantagem e a
desvantagem?
2)Umainterfacetambmpodedeclararconstantes(noatributosdeobjeto).Quala
utilidade?

10.6 - Exerccios
1) A sintaxe do uso de interfaces pode estranhas bastante a primeira vista. Vamos
comearcomumexerccioparapraticarasintaxe:
interfaceAreaCalculavel{
doublecalculaArea();
}
QueremosagoracriaralgumasclassesquesoAreaCalculavel:

Captulo10OrientaoObjetosInterfacesPgina107

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

classQuadradoimplementsAreaCalculavel{
privateintlado;
publicQuadrado(intlado){
this.lado=lado;
}
publicdoublecalculaArea(){
returnthis.lado*this.lado;
}
}
classRetanguloimplementsAreaCalculavel{
privateintlargura;
privateintaltura;
publicRetangulo(intlargura,intaltura){
this.largura=largura;
this.altura=altura;
}
publicdoublecalculaArea(){
returnthis.largura*this.altura;
}
}
Reparequeaquisevoctivesseusadoherananoiaganharmuitacoisa,jquecada
implementao totalmente diferente uma da outra: um Quadrado , um Retangulo e um
Circulotematributosemtodosbemdiferentes,pormtemmtodosemcomum.
Masmesmoqueelestivessematributosemcomum,utilizarinterfaces umamaneira
muitomaiselegantedemodelarsuasclasses.Elastambmtrazemvantagemsemnoacoplar
as classes (herana trazmuito acoplamento, muitosautores clssicosdizem queemmuitos
casos herana quebra o encapsulamento, pensamento o qual os autores dessa apostila
concordamplenamente).
Crie uma classe de teste, repare no polimorfismo (poderamos estar passando esses
objetoscomoargumentoparaalgemqueaceitasseAreaCalculavelcomoargumento:
classTeste{
publicstaticvoidmain(String[]args){
AreaCalculavela=newRetangulo(3,2);
System.out.println(a.calculaArea());
}
}

OpcionamentecriaaclasseCirculo:
classCirculoimplementsAreaCalculavel{
//...atributos(raio)emtodos(calculaArea)
}

UtilizeMath.PI*raio*raioparacalculararea.
2)Nossosbancoprecisatributardinheirodealgunsbensquenossosclientespossuem.
Paraissovamoscriarumainterface:
interfaceTributavel{
doublecalculaTributos();
}
Captulo10OrientaoObjetosInterfacesPgina108

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Lemosessainterfacedaseguintemaneira:todoquequiseremser tributvel precisam


sabercalculartributos,devolvendoumdouble
Alguns bens so tributveis e outros no, ContaPoupanca no tributvel, j
ContaCorrentevocprecisapagar1%daconta,eoSeguroDeVidatemumataxafixade42
reais.(faaamudanaemContaCorrenteecriaaclasseSeguroDeVida):
classContaCorrenteextendsContaimplementsTributavel{
//outrosatributosemetodos

publicdoublecalculaTributos(){
returnthis.saldo*0.1;
}

classSeguroDeVidaimplementsTributavel{
publicdoublecalculaTributos(){
return42;
}
}

Crie agora uma classe TestaTributavel com um main para testar as atribuies,
repare:

classTestaTributavel{
publicstaticvoidmain(String[]args){
ContaCorrentecc=newContaCorrente();
cc.deposita(100);
Tributavelt=cc;
System.out.println(t.calculaTributos());
}
}

TenteagorachamaromtodogetSaldoatravsdarefernciat,oqueocorre?Porque?

3) (opcional) Crie um GerenciadorDeImpostoDeRenda que recebe todos os


Captulo10OrientaoObjetosInterfacesPgina109

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

tributveisdeumapessoaesomaseusvalores,eummtodoparadevolverseutotal:
classGerenciadorDeImpostoDeRenda{
privatedoubletotal;
voidadiciona(Tributavelt){
System.out.println("Adicionandotributavel:"+t);
this.total=this.total+t.calculaTributos();
}
publicdoublegetTotal(){
returntotal;
}
}

Crieum main parainstaciardiversasclassesqueimplementam Tributavel epassar


como argumento para um GerenciadorDeImpostoDeRenda. Repare que voc no pode
passarqualquertipodecontaparaomtodoadiciona,apenasaqueimplementaTributavel.
AlmdissopodepassaroSeguroDeVida.
publicclassTestaGerenciadorDeImpostoDeRenda{
publicstaticvoidmain(String[]args){
GerenciadorDeImpostoDeRendagerenciador=new
GerenciadorDeImpostoDeRenda();
SeguroDeVidasv=newSeguroDeVida();
gerenciador.adiciona(sv);
ContaCorrentecc=newContaCorrente();
cc.deposita(1000);
gerenciador.adiciona(cc);
}

System.out.println(gerenciador.getTotal());

Reparequededentrodo Gerenciador voc no podeacessaromtodo getSaldo,


porexemplo,poisvocnotemagarantiadequeo Tributavel quevaiserpassadocomo
argumento tem esse mtodo. A nica certeza que voc tem de que esse objeto tem os
mtodosdeclaradosnainterfaceTributavel.
interessanteenxergarqueasinterfaces(comoaquinocaso Tributavel)costumam
ligar classes muito distintas, unindoas por uma caracterstica que elas tem em comum
(SeguroDeVida e ContaCorrente so entidades completamente distintas, porm ambas
possuemacaractersticadeseremtributveis).
4.(Opcional,Avanado)TransformeaclasseContaemumainterface.Ateno:faaisso
numprojetoapartepoisusaremosaContacomoclassesnosexercciosfuturos.
interfaceConta{
doublegetSaldo();
voiddeposita(doublevalor);
voidretira(doublevalor);
voidatualiza(doubletaxaSelic);
}

AdapteContaCorrenteeContaPoupancaparaessamodificacao:
classContaCorrenteimplementsConta{
//...
}

Captulo10OrientaoObjetosInterfacesPgina110

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos


classContaPoupancaimplementsConta{
//...
}

Algumcdigovaiter deser copiado ecolado?Isso toruim? Comovocpoderia


diminuiressecopiaecolaecentralizaressescdigosrepetidosemumlugars?Pesquisar
sobreheranaversuscomposio.
5.(Opcional)Subinterfaces:
Asvezesinteressantecriarmosumainterfacequeherdadeoutrasinterfaces.Dessa
maneira quem for implementar essa nova interface precisa implementar todos os mtodos
herdadesdassuassuperinterfaces(etalvezaindanovosmtodosdeclaradosdentrodela):
interfaceContaTributavelextendsConta,Tributavel{}
classContaCorrenteimplementsContaTributavel{
//metodos
}
Contac=newContaCorrente();
Tributavelt=newContaCorrente();

Reparequeocdigopodeparecerestranhopoisainterfacenodeclaramtodoalgum,
s herda os mtodos abstratos declarados nas outras interfaces. Repare tambm que uma
interfacepodeestenderdemaisdeumainterface,sendoqueclassespodeestenderdeuma
(heranasimples).

Captulo10OrientaoObjetosInterfacesPgina111

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

11

11

Excees Controlando os erros


Quem pensa pouco, erra muito
LeonardodaVinci

Aotrminodessecaptulo,vocsercapazde:
controlarerrosetomardecisesbaseadasnosmesmos;
criarnovostiposdeerrosparasuamelhorarotratamentodosmesmosemsuaaplicaoou
biblioteca;
assegurarqueummtodofuncionoucomodizemseu"contrato".

11.1 - Motivao
VoltandosContasquecriamosnocaptulo6,oqueiriaaconteceraotentarchamaro
mtodosacacomumvalorforadolimite?Osistemairiamostrarumamensagemdeerro,mas
quemchamouomtodosacanoirsaberqueissoaconteceu.
Como avisar aquele que chamou o mtodo que ele no conseguiu fazer aquilo que
deveria?
EmJava,osmtodosdizemqualocontratoqueelesdevemseguir,seaotentarsacar
elenoconseguefazeraquiloquedeveria,eleprecisaaomenosavisarousurioquetentou
sacarqueissonofoifeito.
Vejanoexemploabaixo,estamosforandouma Conta aterumvalornegativo,isto,
estarnumestadoinconsistentedeacordocomanossamodelagem.
ContaminhaConta=newConta();
minhaConta.deposita(100);
minhaConta.setLimite(100);
minhaConta.saca(1000);
//
osaldo900?100?0?Achamadaaomtodosacafuncionou?
Emsistemas deverdade, muito comumque quemsaiba tratar oerro aquele que
chamouomtodoenoaprpriaclasse!Portanto,nadamaisnaturalqueaclassesinalizarque
umerroocorreu.
Asoluomaissimplesutilizadaantigamenteade marcaroretornodeummtodo
comobooleaneretornartruesetudoocorreudamaneiraplanejadaoufalsecasocontrrio:
booleansaca(doublequantidade){
if(quantidade>this.saldo+this.limite){//possosacarat
saldo+limite
System.out.println("Nopossosacarforadolimite!");
returnfalse;
}else{
this.saldo=this.saldoquantidade;
returntrue;
}
Captulo11ExceesControlandooserrosPgina112

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
Umnovoexemplodechamadaaomtodoacima:

ContaminhaConta=newConta();
minhaConta.setSaldo(100);
minhaConta.setLimite(100);
if(!minhaConta.saca(1000)){
System.out.println("Nosaquei");
}
Masesefossenecessriosinalizarquandoousuriopassouumvalornegativocomo
quantidade?Umasoluoalteraroretornodebooleanparaint,eretornarocdigodo
erroqueocorreu.Istoconsideradoumamprtica(conhecidatambmcomousodemagic
numbers).
Alm de voc perder o retorno do mtodo, o valor retornado mgico, e s legvel
peranteextensadocumentao,almdequenoobrigaoprogramadoratrataresseretorno,e
nocasodeesquecerissoseuprogramacontinuarrodando.
Repare o que iria acontecer se fosse necessrio retornar um outro valor. O exemplo
abaixomostraumcasoondeatravsdoretornonoserpossveldescobrirseocorreuumerro
ounopoisomtodoretornaumcliente.
publicClienteprocuraCliente(intid){
if(idInvalido){
//avisaomtodoquechamouestequeocorreuumerro
}else{
Clientecliente=newClient();
cliente.setId(id);
//cliente.setNome();
returncliente;
}
}
PoresseeoutrosmotivosutilizamosumcdigodiferenteemJavaparatrataraquiloque
chamamosdeexcees:oscasosondeacontecealgoquenormalmentenoiriaacontecer.O
exemplodoargumentodosaqueinvlidooudo id invlidodeumclienteuma exceo a
regra.

Exceo
Umaexceorepresentaumasituaoquenormalmentenoocorreerepresentaalgodeestranho
ouerradonosistema.

11.2 - Exerccio para comear com os conceitos


1)Testeoseguintecdigovocmesmo:
classTeste{
publicstaticvoidmain(String[]args){
System.out.println("iniciodomain");
metodo1();
System.out.println("fimdomain");
}

Captulo11ExceesControlandooserrosPgina113

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

publicstaticvoidmetodo1(){
System.out.println("iniciodometodo1");
metodo2();
System.out.println("fimdometodo1");
}
publicstaticvoidmetodo2(){
System.out.println("iniciodometodo2");
int[]array=newint[10];
for(inti=0;i<=15;i++){
array[i]=i;
System.out.println(i);
}
System.out.println("fimdometodo2");
}
}
Repareomtodomainchamandometodo1,eesseporsuavezchamandoometodo2.
Cadaumdessesmtodospodetersuasprpriasvariveislocais,sendoque,porexemplo,o
metodo1noenxergaasvariveisdeclaradasdentrodomain.
ComooJava(emuitasdasoutraslinguagens)fazisso?Todainvocaodemtodo
empilhada...emumaestruturadedadosqueisolaareadememriadecadaum.Quandoum
mtodotermina(retorna),elevoltaparaomtodoqueoinvocou.Eledescobreissoatravsda
pilhadeexecuo(stack).Bastajogarforaumgomodapilha(stackframe):

Pormonosso metodo2 possuiumenormeproblema:estacessandoumaposiode


arrayindevidaparaessecaso.
EXCEPTION

Rodeocdigo.Qualasada?Oqueissorepresenta?Oqueelaindica?

Captulo11ExceesControlandooserrosPgina114

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

STACKTRACE

Essao conhecido rastrodapilha (stacktrace).umasadaimportantssimaparao


programador,tantoqueemqualquerfrumumlistadediscusso,comumosprogramadores
semprevoenviar,juntamentecomadescriodoproblema,essastacktrace.
Porqueissoaconteceu?OsistemadeexceesdoJavafuncionadaseguintemaneira.
Quandouma exceo lanada (thrown) aJVM entraem estadode alerta, e vai ver se o
mtodoatualtomaalgumaprecauoaotentarexecutaressetrechodecdigo.Comopodemos
ver,ometodo2notomanenhumamedidadiferentedoquevimosatagora.
Como o metodo2 no est tratando esse problema, a JVM para a execuo dele
anormalmente,semesperareleterminar,evoltaumstackframeprabaixo,ondeserfeitanova
verificao: o metodo1 est se precavendo de um problema chamando
ArrayIndexOutOfBoundsException? No... volta para o main, onde tambm no h
proteo, ento a JVM morre (na verdade quem morre apenas uma Thread, a corrente,
veremosmaisparafrente).
Obviamenteaquiestamosforandooerro,oquenofariasentidotomarmoscuidadocom
ele.Seriafcilarrumarumproblemadesses,bastanavegarmosnaarraynomximoatoseu
length.
Porm,apenasparaentenderocontroledefluxodeuma Exception,vamoscolocaro
cdigo que vai tentar (try) executar o bloco perigoso, e caso o problema seja do tipo
ArrayIndexOutOfBoundsException,eleser pego (catched).Repare queinteressante
quecadaexceonoJavatemumtipo...elepodeteratributosemtodos.
2) Adicione um
try/catch
em volta do
ArrayIndexOutOfBoundsException.Oqueocdigoimprimeagora?

for, pegando

try{
for(inti=0;i<=15;i++){
array[i]=i;
System.out.println(i);
Captulo11ExceesControlandooserrosPgina115

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("erro:"+e);
}

Emvezdefazerotryemtornodoforinteiro,tenteapenascomoblocodedentrodofor:
for(inti=0;i<=15;i++){
try{
array[i]=i;
System.out.println(i);
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("erro:"+e);
}
}
Qualadiferena?

Captulo11ExceesControlandooserrosPgina116

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Agoraretireotry/catchecoloqueeleemvoltadachamadadometodo2.
System.out.println("iniciodometodo1");
try{
metodo2();
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("erro:"+e);
}
System.out.println("fimdometodo1");

Faa a mesma coisa, retirando o try/catch novamente e colocando em volta da


chamadadometodo1.Rodeoscdigos,oqueacontece?
System.out.println("iniciodomain");
try{
metodo1();
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("Erro:"+e);
}
System.out.println("fimdomain");

Captulo11ExceesControlandooserrosPgina117

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Reparequeapartirdomomentoqueumaexceptionfoicatched(tratada, handled),a
execuovoltaaonormalapartirdaqueleponto.

11.3 - Excees de Runtime mais comuns


Quetaltentardividirumnmeroporzero?Serqueocomputadorconseguefazeraquilo
quensdefinimosquenoexiste?
publicclassTestandoADivisao{
publicstaticvoidmain(Stringargs[]){
inti=5571;
i=i/0;
System.out.println("Oresultado"+i);
}
}
Tenteexecutaroprogramaacima.Oqueacontece?

publicclassTestandoReferenciaNula{
publicstaticvoidmain(Stringargs[]){
Contac=null;
System.out.println("Saldoatual"+c.getSaldo());
}
}
Tenteexecutaroprogramaacima.Oqueacontece?

Captulo11ExceesControlandooserrosPgina118

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Repare que um
ArrayIndexOutOfBoundsException
ou um
NullPointerException poderiaserfacilmenteevitadocomo for corretamenteescrito,ou
comifsquechecariamoslimitesdaarray.
Outro caso que tambm ocorre tal tipo de exceo quando um cast errado feito
(veremosmaisprafrente).Emtodososcasostaiserrosprovavelmentepoderiamserevitados
pelo programador. por esse motivo que o java no te obriga a dar o try/catch nessas
exceptions,echamamosessasexceesdeunchecked(emoutraspalavras,ocompiladorno
checasevocesttratandoessasexcees).

Erros
OserrosemJavasoumtipodeexceoquetambmpodemsertratados.Elesrepresentam
problemasnamquinavirtualenodevemsertratadosem99%doscasos,jqueprovavelmente
omelhorasefazerdeixaraJVMencerrar(ouapenasaThreademquesto).

11.4 - Outro tipo de exceo: Checked Exceptions


Ficaclarocomosexemplosdecdigoacimaquenonecessriodeclararquevocest
tentandofazeralgoondeumerropossaocorrer.Osdoisexemplos,comousemotry/catch,
compilaramerodaram.Emum,oerroterminouoprogramaenooutrofoipossveltratlo.
MasnosessetipodeexceoqueexisteemJava,umoutrotipoobrigaosusurios
quechamamomtodoouconstrutoratrataroerro.Umexemploquepodemosmostraragora
odeabrirumarquivoparaleitura,quandopodeocorreroerrodoarquivonoexistir(veremos
comotrabalharcomarquivosemoutrocaptulo,nosepreocupecomistoagora):
publicstaticvoidmetodo(){
newjava.io.FileReader(arquivo.txt);
}
O cdigo acima no compila e o compilador avisa que necessrio tratar o
FileNotFoundExceptionquepodeocorrer:

Paracompilarefazeroprogramafuncionar,precisamostrataroerrodeumdedoisjeitos.
Oprimeirotratlocomotryecatchdomesmojeitoqueusamosnoexemploanteriorcom
umaarray:
publicstaticvoidmetodo(){
try{
Captulo11ExceesControlandooserrosPgina119

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

newjava.io.FileReader(arquivo.txt);
}catch(java.io.FileNotFoundExceptione){
System.out.println(Naofoipossivelabriroarquivopara
leitura);
}
}
THROWS

A segunda forma de tratar esse erro a de delegar ele para quem chamou o nosso
mtodo,isto,passarparaafrente.

publicstaticvoidmetodo()throwsjava.io.FileNotFoundException{
newjava.io.FileReader(arquivo.txt);
}
NoEclipsebemsimplesfazertantoumtry/catchassimcomoumthrows:
Tentedigitaressecdigonoeclipse:
publicclassTestaException{
publicstaticvoidmain(String[]args){
newjava.io.FileReader("arquivo.txt");
}
}
OEclipsevaireclamar:

Evoctemduasopes:
1)Addthrowsdeclaration,quevaigerar:
publicclassTestaException{
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
newjava.io.FileReader("arquivo.txt");
}
}
2)Surroundwithtry/catch,quevaigerar:
publicclassTestaException{

Captulo11ExceesControlandooserrosPgina120

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

publicstaticvoidmain(String[]args){
try{
newjava.io.FileReader("arquivo.txt");
}catch(FileNotFoundExceptione){
//TODOAutogeneratedcatchblock
e.printStackTrace();
}
}
}
Noincioexiste umagrandetentaodesemprepassaroerro prafrenteparaoutros
trataremdele.Podeserquefaasentidodependendodocasomasnoatomain,porexemplo.
Acontecequequemtentaabrirumarquivosabecomolidarcomumproblemanaleitura.Quem
chamouummtodonocomeodoprogramapodenosaberou,piorainda,tentarabrircinco
arquivosdiferentesenosaberqualdelesteveumproblema!
No h uma regra para decidir em que momento do seu programa voc vai tratar
determinar exceo.Isso vaidependerdeem quepontovoctemcondiesdetomaruma
decisoemrelaoaaqueleerro.Enquantonoforomomento,vocprovavelmentevaipreferir
delegararesponsabilidadeparaomtodoqueteinvocou.

11.5 - Um pouco da grande famla Throwable

11.6 - Mais de um erro


possveltratarmaisdeumerroquasequeaomesmotempo:
1. Comotryecatch:
try{
objeto.metodoQuePodeLancarIOeSQLException();
}catch(IOExceptione){
//..
}catch(SQLExceptione){
Captulo11ExceesControlandooserrosPgina121

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

//..
}
2. Comothrows:
publicvoidabre(Stringarquivo)throwsIOException,SQLException{
//..
}
Vocpodetambmescolhertrataralgumasexceesedeclararasoutrasnothrows:

3. Comothrowsecomotryecatch:
publicvoidabre(Stringarquivo)throwsIOException{
try{
objeto.metodoQuePodeLancarIOeSQLException();
}catch(SQLExceptione){
//..
}
}
desnecessriodeclararnothrowsasexceptionsquesounchecked,pormpermitido
e,svezes,facilitaaleituraeadocumentaodoseucdigo.

11.7 - Lanando excees


LembresedomtodosacadanossaclasseConta,eledevolveumbooleancasoconsiga
ounosacar:
booleansaca(doublevalor){
if(this.saldo<valor){
returnfalse;
}else{
this.saldo=valor;
returntrue;
}
}
Podemostambmlanaruma Exception,oqueextremamentetil.Dessamaneira
resolvemosoproblemadealgumpoderesquecerdefazerumifnoretornodeummtodo.
ApalavrachavethrowlanaumaException(diferentedethrows,queapenasavisada
possibilidadedaquelemtodolanla).
voidsaca(doublevalor){
if(this.saldo<valor){
thrownewRuntimeException();
}else{
this.saldo=valor;
}
}
Nonosso,casolanaumadotipounchecked.RuntimeExceptionaexceptionmede
todasasexceptionsunchecked.Adesvantagemaquiqueelamuitogenrica,quemreceber
esseerronosabedizerexatamentequalfoioproblema.PodemosentousarumaException
maisespecfica:
voidsaca(doublevalor){
Captulo11ExceesControlandooserrosPgina122

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

if(this.saldo<valor){
thrownewIllegalArgumentException();
}else{
this.saldo=valor;
}
}
IllegalArgumentExceptiondizumpoucomais:algofoipassadocomoargumentoe
seumtodonogostou.ElaumaExceptionuncheckedpoisestendedeRuntimeException
e jfazparteda bibliotecadojava.(IllegalArgumentException melhordeserusado
quando umargumentosempreinvlido,comoporexemplo nmerosnegativos,referncias
nulas,etc).
Eagoraparapegaresseerro,nousaremosumif/elseesimumtry/catch,porquefaz
maissentidopoisumaexceoafaltadesaldo:
Contacc=newContaCorrente();
cc.deposita(100);
try{
cc.saca(100);
}catch(IllegalArgumentExceptione){
System.out.println("SaldoInsuficiente");
}
Podamos melhorar ainda mais e passar para o construtor da
IllegalArgumentExceptionomotivodaexcecao:
voidsaca(doublevalor){
if(this.saldo<valor){
thrownewIllegalArgumentException("Saldoinsuficiente");
}else{
this.saldo=valor;
}
}
OmtodogetMessage()definidonaclasseThrowable(medetodosostiposdeerros
e exceptions) vai retonar a mensagem que passamos ao construtor da
IllegalArgumentException.
try{
cc.saca(100);
}catch(IllegalArgumentExceptione){
System.out.println(e.getMessage());
}

11.8 - Criando seu prprio tipo de exceo


bemcomumcriarumaprpriaclassedeexceoparacontrolarmelhorousodesuas
excees,dessamaneirapodemospassarvaloresespecficosparaelacarregar,equesejam
teisdealgumaforma.Vamoscriaranossa:
Voltamos para o exemplo das Contas, vamos criar a nossa Exceo de
SaldoInsuficienteException:
publicclassSaldoInsuficienteExceptionextendsRuntimeException{
SaldoInsuficienteException(Stringmessage){
super(message);
}
Captulo11ExceesControlandooserrosPgina123

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

}
EagoraaoinvslanarumIllegalArgumentException,vamoslanarnossaprpria
exception,comumamensagemquedirSaldoInsuficiente:
voidsaca(doublevalor){
if(this.saldo<valor){
thrownewSaldoInsuficienteException("SaldoInsuficiente,tente
umvalor
menor");
}else{
this.saldo=valor;
}
}
Eparatestar,crieumaclassequedepositeumvaloretentesacarumvalormaior:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
cc.deposita(10);
try{
cc.saca(100);
}catch(SaldoInsuficienteExceptione){
System.out.println(e.getMessage());
}
}
Podemos transformar essa Exception de unchecked para checked, obrigando assim
quemchamaessemtodoadartrycatch,outhrows:
publicclassSaldoInsuficienteExceptionextendsException{
SaldoInsuficienteException(Stringmessage){
super(message);
}
}

catchethrows
Existeumapssimaprticadeprogramaoemjavaqueadeescrevero catch eothrows
comException.
Existemcdigosquesempreusam Exception poisissocuidadetodosospossveiserros.O
maiorproblemadissogeneralizaroerro.SealgumjogaalgodotipoExceptionparaquemo
chamou,quemrecebenosabequalotipoespecficodeerroocorreuenovaisabercomotratar
omesmo.

11.9 - Para saber mais: finally


FINALLY

Os blocos try e catch podem conter uma terceira clusula chamada finally que
indicaoquedeveserfeitoapsotrminodoblocotryoudeumcatchqualquer.
interessante colocar algo que imprescindvel de ser executado, caso o que voc
queriafazertenhadadocerto,ouno.Ocasomaiscomumodeliberarumrecurso,comoum
arquivoouconexocombancodedados,nofinally,paraqueagentepossateracertezadeque
aquelearquivo(ou conexo)v serfechado, mesmoquealgotenha falhadonodecorrerdo
cdigo.

Captulo11ExceesControlandooserrosPgina124

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Noexemploaseguir,oblocofinallyserexecutadonoimportasetudoocorrerokou
comalgumproblema:

try{
//blocotry
}catch(IOExceptionex){
//blococatch1
}catch(SQLExceptionsqlex){
//blococatch2
}finally{
//blocofinally

11.10 - Um pouco mais...


1)possvelcriarumbloco try e finally,semcatch.Issosignificasenoocorrer
erroalgum,oblocodo finally irserexecutado.Seocorreralgumerro,eletambmser
executado,eoerroirserjogadoparaquemchamouomtodo.
2)Procureinformaessobreapalavrachaveassertetenteutilizarocdigoabaixo:
inti=1;
//tenhocertezaqueivale1
asserti==1;
i=2;
//tenhocertezaqueivale2
asserti==2;
i++;
//vaigerarumerropoisinovale4
asserti==4;

11.11 - Exerccios
1)Naclasse Conta,modifiqueomtodo deposita(doublex) paraqueeleagora
retornevoid.EledevelanarumaexceptionchamadaIllegalArgumentException,quej
fazpartedabibliotecadojava,semprequeovalorpassadocomoargumentoforinvlido(por
exemplo,quandofornegativo).
voiddeposita(doublevalor){
if(valor<0){
thrownewIllegalArgumentException();
}else{
this.saldo+=valor;
}
}
2)CrieumaclasseTestaDepositacomomtodomain.CrieumaContaCorrentee
tentedepositarvaloresinvlidos:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
cc.deposita(100);
}
O que acontece? Uma IllegalArgumentException lanada j que tentamos
depositarumvalorinvido.Adicioneotry/catchparatrataroerro:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();

Captulo11ExceesControlandooserrosPgina125

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

try{
cc.deposita(100);
}catch(IllegalArgumentExceptione){
System.out.println("Voctentoudepositarumvalorinvlido");
}
}
3)Aolanara IllegalArgumentException,passeviaconstrutorumamensagema
serexibida.Lembrequea String recebidacomoparmetroacessveldepoisviaomtodo
getMessage()herdadoportodasasExceptions.
voiddeposita(doublevalor){
if(valor<0){
thrownewIllegalArgumentException("Voctentoudepositar
umvalornegativo");
}else{
this.saldo+=valor;
}
}
AgoraalteresuaclasseTestaDepositaparaexibiramensagemdaexceoatravsda
chamadadogetMessage():
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
try{

cc.deposita(100);
}catch(IllegalArgumentExceptione){
System.out.println(e.getMessage());
}
5)Criesuaprpria Exception, ValorInvalidoException.Paraissovocprecisa
criarumaclassecomessenomequeextendade RuntimeException.Lancea emvez de
IllegalArgumentException.

classValorInvalidoExceptionextendsValorInvalidoException{
}
Ateno:nemsempreinteressantecriarmosumnovotipodeexception!Dependedo
caso.EsteaquiseriamelhoraindautilizarmosIllegalArgumentException.
6)(opcional)ColoqueumconstrutornaclasseValorInvalidoExceptionquereceba
o quanto ele tentou sacar. Dessa maneira, na hora de dar o throw new
ValorInvalidoExceptionvocvaiprecisarpassarovalordosaqueilegalcomoargumento.
7) (opcional) A classe Exception (na verdade Throwable) tem definida nela um
mtodo getMessage quepodeserreescritonassuassubclassesparafalarumpoucomais
sobreoerro.ReescrevaonasuaclasseValorInvalidoExceptionparaalgocomo:
publicStringgetMessage(){
return"Nopossoretirarvalornegativo:"+valor;
}
Agoraaoimprimiraexception,reparequeessamensagemquevaiaparecer.
8)(opcional)Declareaclasse ValorInvalidoException comofilhade Exception
Captulo11ExceesControlandooserrosPgina126

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

emvezdeRuntimeException.Oqueacontece?
Voc vai precisar avisar que o seu mtodo saca() throws
ValorInvalidoException,poiselaumacheckedexception.Almdisso,quemchamaesse
mtodovaiprecisartomarumadecisoentretrycatchouthrows.

11.12 - Desafios
1)Oqueaconteceseacabaramemriadojava?Comoforarisso?

Captulo11ExceesControlandooserrosPgina127

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

12

Pacotes Organizando suas classes e


bibliotecas

12

Uma discusso prolongada significa que ambas as partes esto


erradas
Voltaire

Aotrminodessecaptulo,vocsercapazde:
separarsuasclassesempacotese
preparararquivossimplesparadistribuio.

12.1 - Organizao
Quandoumprogramadorutilizaasclassesfeitasporoutrosurgeumproblemaclssico:
comoescreverduasclassescomomesmonome?
Porexemplo,podeserqueaminhaclassedeDatafuncionedeumcertojeitoeaclasse
de Data deumcolegadeoutrojeito.Podeserqueaclassede Data deuma biblioteca
funcioneaindadeterceiramaneira.
Comopermitirquetudoissorealmentefuncione?Comocontrolarquemquerusarqual
classedeData?Asoluosimples:criardiretriosparaorganizarasclasses.
Os diretrios esto diretamente relacionados aos chamados pacotes e costumam
agruparclassesdefuncionalidadeparecida.

PACOTE

No pacote java.util, por exemplo, temos as classes Date, SimpleDateFormat e


GregorianCalendar;todaselastrabalhamcomdatasdeformasdiferentes.
SeaclasseClienteestnopacotebanco,eladeverestarnodiretriobanco.Seela
se localiza no pacote br.com.caelum.banco, significa que est no diretrio
br/com/caelum/banco.
AclasseClientequeselocalizanesseltimodiretriomencionadodeveserescritada
seguinteforma:

packagebr.com.caelum.banco;
classCliente{
//...
}
PACKAGE

Fica fcil notar que a palavra chave package indica qual o pacote que contm esta
classe.

Captulo12PacotesOrganizandosuasclassesebibliotecasPgina128

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Umpacotepodeconternenhum,umoumaissubpacotese/ounenhuma,umaoumais
classesdentrodele.

Padrodanomenclaturadospacotes
Opadrodasunparadarnomeaospacotesrelativoaonomedaempresaquedesenvolveua
classe:
br.com.nomedaempresa.nomedoprojeto.subpacote
br.com.nomedaempresa.nomedoprojeto.subpacote2
br.com.nomedaempresa.nomedoprojeto.subpacote2.subpacote3
Ospacotesspossuemletrasminsculas,noimportaquantaspalavrasestejamcontidasnele.
Essepadroexisteparaevitaraomximooconflitodepacotesdeempresasdiferentes.
Asclassesdopacotepadrodebibliotecasnoseguemessanomenclatura,quefoidadapara
bibliotecasdeterceiros.

12.2 - Import
Parausarumaclassedomesmopacote,bastafazerrefernciaaelacomofoifeitoat
agora,simplesmenteescrevendooprprionomedaclasse.SeexisteumaclasseBancodentro
dopacotebr.com.caelum.banco,eladeveserescritaassim:
packagebr.com.caelum.banco;
classBanco{
Stringnome;
Clienteclientes[];
}
AclasseClientedeveficarnomesmopacotedaseguintemaneira:
packagebr.com.caelum.banco;
classCliente{
Stringnome;
Stringendereco;
}
Anovidadechegaaotentarutilizaraclasse Banco (ou Cliente)emumaoutraclasse
queestejaemoutropacote,porexemplonopacotebr.com.caelum.util:
packagebr.com.caelum.banco.util;
classTesteDoBanco{
publicstaticvoidmain(Stringargs[]){
br.com.caelum.banco.BancomeuBanco=new
br.com.caelum.banco.Banco();
meuBanco.nome="BancodoBrasil";
System.out.println(meuBanco.nome);
}
}
Reparequeprecisamosreferenciaraclasse Banco comtodoonomedopacotenasua
frente.(esseoconhecido FullQualifiedName deumaclasse,emoutraspalavras,esseo
verdadeiro nome de uma classe, por isso que duas classes X em pacotes diferentes no
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina129

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

conflitam).
Mesmoassim,aotentarcompilaraclasseanteriorocompiladorirreclamarqueaclasse
Banconoestvisvel.
Acontecequeasclassesssovisveisparaoutrasnomesmo pacoteeparapermitir
queaclasseTesteDoBancovejaeacesseaclasseBancoemoutropacoteprecisamosalterar
essaltimaetransformlaempblica:
packagebr.com.caelum.banco;
publicclassBanco{
Stringnome;
Clienteclientes[]=newCliente[2];
}
Apalavrachavepublicliberaoacessoparaclassesdeoutrospacotes.Domesmojeito
que ocompiladorreclamou quea classe no estava visvel, agora ele reclama que o nome
tambmnoest.fcildeduzircomoresolveroproblema,algoquejfoivistoanteriormente:
packagebr.com.caelum.banco;
publicclassBanco{
publicStringnome;
publicClienteclientes[]=newCliente[2];
}
Agorajpodemostestarnossoexemploanterior.
Voltando ao cdigo do TesteDoBanco, necessrio escrever todo o pacote para
identificarqualclassequeremosusar?Oexemploqueusamosficoubemcomplicadodeler:
br.com.caelum.banco.BancomeuBanco=newbr.com.caelum.banco.Banco();
ExisteumamaneiramaissimplesdesereferenciaraclasseBanco:bastaimport-la
dopacotebr.com.caelum.banco:

IMPORT

packagebr.com.caelum.banco.util;
importbr.com.caelum.banco.Banco;//agorapodemosnosreferenciar
//aBancodiretamente
classTesteDoBanco{
publicstaticvoidmain(Stringargs[]){
BancomeuBanco=newBanco();
meuBanco.nome=BancodoBrasil;
}
}

package,import,class
muitoimportantemanteraordem!Primeiroapareceuma(ounenhuma)vezopackage,depois
podeaparecerumoumaisimporteporltimoasdeclaraesdeclasses.

importx.y.z.*;
possvelimportarumpacoteinteiro(todasasclassesdopacote, exceto os subpacotes)
atravsdo*:

Captulo12PacotesOrganizandosuasclassesebibliotecasPgina130

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

importjava.util.*;
Importar todas as classes de um pacote no implica em perda de performance em tempo de
execuomaspodetrazerproblemascomclassesdemesmonome!Almdisso,importardeum
emumconsideradoboaprticapoisfacilitaaleituraparaoutrosprogramadores

12.3 - Acesso aos atributos, construtores e mtodos


OsmodificadoresdeacessoexistentesemJavasoquatrosendoqueatomomentoj
vimostrs,massexplicamosdois.
Adiferenaentreelesdescritaaseguir:
public Todas as classes podem acessar aquilo que for definido como public.
Classes,atributos,construtoresemtodospodemserpublic.
protected Aquilo que protected pode ser acessado por todas as classes do
mesmo pacote e por todas as classes que a estendam. Somente atributos, construtores e
mtodospodemserprotected.
padro (sem nenhum modificador)Senenhummodificadorforutilizado,todas
asclassesdomesmopacotetmacessoaoatributo,construtor,mtodoouclasse.
private A nica classe capaz de acessar os atributos, construtores e mtodos
privadosaprpriaclasse.Classesnopodemser private,masatributos,construtorese
mtodossim.

Classespblicas
Paramelhororganizarseucdigo,oJavanopermitemaisdeumaclassepblicaporarquivoeo
arquivodeveserNomeDaClasse.java.
Umavezqueoutrosprogramadoresiroutilizaressaclasse,quandoprecisaremolharocdigoda
mesma,ficamaisfcilencontrlasabendoqueelaestnoarquivodemesmonome.

12.4 - Usando o Eclipse com pacotes


VocpodeagorausaraperspectivaJavadoeclipse.Aviewprincipaldenavegaoo
packageexplorer,queagrupaclassespelospacotesemvezdediretrios(vocpodeuslaem
conjuntocomaNavigator,bastatambmabrlapeloWindow/ShowView/Navigator)

Captulo12PacotesOrganizandosuasclassesebibliotecasPgina131

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Antes de movermos nossas classes, declareas como pblicas e coloqueas em seus


respectivosarquivos.Umarquivoparacadaclasse.
Vocpodemoverumaclassedepacotearrastandoaparaodestinodesejado,repareque
oEclipsejdeclaraopackageeimportsnecessrios:

Captulo12PacotesOrganizandosuasclassesebibliotecasPgina132

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

NoEclipsenuncaprecisamosdeclararumimportouumpackage,poiselesemprevai
sugerirescreveressescomandosquandousarmosoControlEspacononomedeumaclasse,ou
casoadeclaraodepacoteestejaemconflitocomodiretriodoarquivofonte.

12.5 - Exerccios
Ateno: utilize os recursos do Eclipse para reailizar essas mudanas. Use a view
packageexplorer. Tambm utilize os quick fixes quando o Eclipse reclamar dos diversos
problemasdecompilao.
1)PasseoseusistemadeContasparautilizarpacotes.Respeiteaconveodecdigo
dasun,porexemplo:
br.com.empresa.banco:colocarclassecomomainaqui
br.com.empresa.banco.contas:colocarConta,suasfilhaseexceptionsaqui
br.com.empresa.banco.sistema:colocarAtualizadorDeContasaqui
2) Coloque cada classe em seu respectivo arquivo .java. Independente se ela ser
publica(boaprtica).
3) O cdigo novai compilarprontamente, pois muitos mtodosque declaramos so
packagefriendly,quandonaverdadeprecisaramosqueelesfossempublic.Omesmovalepara
asclasses,algumasdelasprecisaroserpublicas.UseorecursodequickfixdoEclipseaqui,
elemesmovaisugerirqueomodificadordeacessodeveserpblico.

Captulo12PacotesOrganizandosuasclassesebibliotecasPgina133

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

13

13

Ferramentas: jar e javadoc


Uma discusso prolongada significa que ambas as partes esto
erradas
[acharcitacaopraessecapitulo!!!!!!!]Voltaire

Aotrminodessecaptulo,vocsercapazde:
criaroJARdoseuaplicativo;
colocarumJARnobuildpathdoseuprojeto;
lerumjavadoc
criarojavadocdoseuaplicativo;

13.1 - Arquivos, bibliotecas e verses


Assimqueumprogramaficapronto,meiocomplicadoenviardezenasoucentenasde
classesparacadaclientequequerutilizlo.
JAR

Ojeitomaissimplesdetrabalharcomumconjuntodeclassescompactlosemum
arquivo s. O formato de compactao padro o ZIP, porm a extenso do arquivo
compactadoserJAR.

Oarquivo.jar
O arquivo jar ou Java ARchive, possui uma srie de classes (e arquivos de configuraes)
compactados, no estilo de um arquivo zip. O arquivo jar pode ser criado com qualquer
compactadorzipdisponvelnomercado,inclusiveoprogramajarquevemjuntocomosdk.
Paracriarumarquivojardonossoprogramadebanco,bastairaodiretrioondeesto
contidasasclasseseusarcomandoaseguirparacriaroarquivo banco.jar comtodasas
classesdospacotesbr.com.caelum.utilebr.com.caelum.banco.
jarcvfbanco.jarbr/com/caelum/util/*.classbr/com/caelum/banco/*.class
Parausaressearquivobanco.jarpararodaroTesteDoBancobastarodarojavacom
oarquivojarcomoargumento:
javaclasspathbanco.jarbr.com.caelum.util.TesteDoBanco

Paraadicionarmaisarquivos.jar,quepodemserbibliotecas,aoprogramabastarodaro
javadaseguintemaneira:
javaclasspathbiblioteca1.jar;biblioteca2.jarNomeDaClasse
Valelembrarqueopontoevrgulautilizadosvlidoemambientewindowsedepende
decadasistemaoperacional(nolinuxodoispontos).
H tambm um arquivo de manifesto, que contm informaes do seu jar, como por
exemploqualclasseelevairodarquandoojarforchamado.Masnosepreocupe,poiscomo
Captulo13Ferramentas:jarejavadocPgina134

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

eclipse,essearquivogeradoautomaticamente.

Bibliotecas
Diversas bibliotecas podem ser controladas de acordo com a verso por estarem sempre
compactadas em um arquivo .jar. Basta verificar o nome da biblioteca (por exemplo log4j
1.2.13.jar)paradescobriraversodela.
Ento possvel rodar dois programas ao mesmo tempo, cada um utilizando uma verso da
bibliotecaatravsdoparmetroclasspathdojava.

Criandoum.jarautomaticamente
Existemdiversasferramentasqueservemparaautomatizaroprocessodedeploy,queconsisteem
compilar,gerardocumentao,bibliotecasetc.Asduasmaisfamosassoo ANT eo MAVEN,
ambossoprojetosdogrupoApache.
OEclipsepodegerarfacilmenteumjar,pormseoseubuildcomplexoeprecisapreparare
copiarumasriederecursos,asferramentasindicadasacimapossuemsofisticadasmaneirasde
rodarumscriptbatch.

13.2 - Gerando o jar pelo Eclipse


NesteexemplovamosgeraroarquivoJARdonossoprojeto,apartirdoeclipse.
1)Cliquecomobotodireitoemcimadonomedoseuprojeto,eselecioneaopo
Export.

Captulo13Ferramentas:jarejavadocPgina135

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

2)NatelaExport(comomostraafiguraabaixo),selecioneaopoJARfile,eaperteo
botoNext.

3)NaopoJARfile:,selecioneolocalquevocdesejasalvaroarquivoJAR.Eaperte
Next

Captulo13Ferramentas:jarejavadocPgina136

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

4)Naprximatela,simplesmentecliqueemnext,poisnohnenhumaconfiguraoa
serfeita.
5)Natelaabaixo,naopo selecttheclassoftheapllicationentrypoint,vocdeve
escolherqualclasseseraclassequevairodarautomaticamentequandovocexecutaroJAR.

13.3 - Javadoc
ComovamossaberoquecadaclassetemnoJava?Quaissoseusmtodos,oqueeles
fazem?
AquinaCaelumvocpodeacessaratravsdigitandonabarradeendereodoBrowser:
/caelum/docs/api/index.html
EapartirdaInternetvocpodeacessaratravsdolink:
http://java.sun.com/j2se/1.5.0/docs/api/

Captulo13Ferramentas:jarejavadocPgina137

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

JAVADOC

No site da Sun, voc pode (e deve) baixar a documentao das bibliotecas do Java,
freqentementereferenciadacomojavadocouAPI(sendonaverdadeadocumentaoda
API).

Nestadocumentao,noquadrosuperioresquerdovocencontraospacotes,eoinferior
esquerdo est a listagem das classes e interfaces do respectivo pacote (ou de todos caso
nenhumtenhasidoespecificado).Clicandoseemumaclasseouinterface,oquadrodadireita
passaadetalhartodosatributosemtodos.

Reparequemtodoseatributosprivadosnoestoa.Oimportantedocumentaroque
sua classe faz, e no como ela faz: detalhes de implementao, como atributos e mtodos
privados, no interessam ao desenvolvedor que usar a sua biblioteca (ou ao menos no
deveriaminteressar).
Voc tambm consegue gerar esse javadoc apartir da linha de comando, com o
comando:javadoc.

13.4 - Gerando o Javadoc


ParageraroJavadocapartirdoEclipsemuitosimples,sigaospassosabaixo:
1)Nabarrademenu,selecioneomenuProject,depoisaopoGenerateJavadoc....
(apenasdisponvelseestivernaperspectivaJava,masvocpodeacessaromesmowizardpelo
exportdoprojeto).

Captulo13Ferramentas:jarejavadocPgina138

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

2) Em seguida aparecero as opes para gerar a documentao do seu sistema,


selecionetodasasclassesdoseusistema,edeixeasoutrasopescomoestonoesquea
demarcarocaminhodaopoDestination,poislqueestarsuadocumentao.

3) Abra a documentao atravs do caminho que voc marcou e abra o arquivo


index.html,quevaiabrirumapginasemelhanteessadafiguraabaixo.

Captulo13Ferramentas:jarejavadocPgina139

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Paracolocarmoscomentriosnadocumentao,devemosadicionaraocdigosobforma
decomentrio,abrindootextocom/**efechandocom*/easoutraslinhasapenasprecisamde
um*.Tambmpodemosdefiniralgumascoisasnestetexto,como:autor,verso,parmetros,
retorno,etc.
AgoraadicionealgunscomentriosaoseuProjetocomoabaixo:
/**
*ClasseresponsavelpormoldarasContasdoBanco
*@authorGuilhermeMoreira
*
*/
publicabstractclassConta{

Ouadicionealgunscomentriosemalgummtodoseu:
/**
*Metodoqueincrementaosaldo.
*@paramvalor
*/
publicvoiddeposita(doublevalor){

Vejacomoficou:

Captulo13Ferramentas:jarejavadocPgina140

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

13.5 - Classpath
Quandocompilamosumprogramajava,comoelesabeondeprocurarassuasclasses?
NabibliotecapadroeemalgunsdiretrioespecficosemqueaJVMfoiinstalada!
Masenosprojetosqueusamclassesdiferentesdaspadres?aquiqueoClasspath
entra histria, nele que definimos qual o caminho das nossas classes. Por isso o nome
Classpath(class=classe,path=caminho).
Halgumasformasdeconfigurarmosoclasspath
Configurandoumavariveldeambiente(desaconselhado);
Passandocomoargumentoemlinhadecomando(trabalhoso);
utilizandoferramentascomoAnteMaven
Deixandooeclipseconfigurarporvoc.
Noeclipsemuitosimples:
1)Cliquecomobotodireitoemcimadonomedoseuprojeto.
2)EscolhaaopoProperties.
3)Naparteesquerdadatelaabaixo,selecioneaopoJavaBuildPath.

Captulo13Ferramentas:jarejavadocPgina141

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Deacordocomafigura:

1.JavaBuildPath,ondevocconfiguraoclasspathdoseuprojeto.
2.Listadelocaisdefinidos,queporpadrosvemcomamquinavirtualconfigurada.
3.Opesparaadicionarmaiscaminhos,AddJARs...adicionaJar'squeestejamnoseu
projeto, Add External JARs que adiciona Jar's que estejam em qualquer outro lugar da
mquina,pormguardarumarefernciaparaaquelecaminho(entoseuprojetopoderno
funcionarcorretamentequandocolocadoemoutromicro,masexistecomoutilizarvariveispara
isso).

13.6 - Exerccios
1)Gereumjardoseusistema,comoarquivodemanifesto.Executeocomjavajar:
javajarProjeto.jar
Seowindowsoulinuxfoiconfiguradoparatrabalharcomaextenso.jar,bastavocdar
umduplocliquenoarquivo,queeleserexecutado(oarquivodemanifestoserlidoparaque
elepossadescobrirqualaclassecommainqueojavadeveprocessar).
2)Gereojavadocdoseusistema.

Captulo13Ferramentas:jarejavadocPgina142

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

14

14

O pacote java.lang

Nossas cabeas so redondas para que os pensamentos possam


mudar de direo.
FrancisPiacaba

Aotrminodessecaptulovocsercapazde:
utilizarasprincipaisclassesdopacotejava.langeleradocumentaopadrodeprojetosjava;
usaraclasseSystemparaobterinformaesdosistema;
utilizaraclasseStringdeumamaneiraeficienteeconhecerseusdetalhes;
usarasclasseswrappers(comoInteger)eboxinge
utilizarosmtodosherdadosdeObjectparageneralizarseuconceitodeobjetos.

14.1 - Pacote java.lang


JAVA.LANG

JusamospordiversasvezesasclassesStringeSystem.Vimososistemadepacotes
dojava,enuncaprecisamosdarum import nessasclasses.Issoocorreporqueelasesto
dentrodopacotejava.lang,queautomaticamente importadoparavoc.onico
pacotecomestacaracterstica.
Vamosverumpoucodesuasprincipaisclasses.

14.2 - Um pouco sobre a classe System e Runtime


AclasseSystempossuiumasriedeatributosemtodosestticos.Jusamosoatributo
System.out,paraimprimir.Elatambmpossuioatributoin,queldaentradapadroalguns
bytes.
inti=System.in.read();
Ocdigoacimadeveestardentrodeumblocode try e catch,poispodelanaruma
exceoIOException.Sertilficarlendodebyteembyte?
O System contatambmcomummtodoquesimplesmentedesligaavirtualmachine,
retornandoumcdigodeerroparaosistemaoperacional,oexit.
System.exit(0);
AclasseRuntimepossuiummtodoparafazerumachamadaaosistemaoperacionale
rodaralgumprograma:
Runtimert=Runtime.getRuntime();
Processp=rt.exec("dir");
desnecessriodizerqueistodeveserevitadoaomximo,jquegeraumadependncia
dasuaaplicaocomosistemaoperacionalemquesto,pedendoaportabilidade.Emmuitos
casosissopodesersubstitudoporchamadasasbibliotecasdojava,essecasoporexemplo
voc tem um mtodo list na classe File do pacote de entrada e sada, que veremos
Captulo14Opacotejava.langPgina143

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

posteriormente.OmtodoexecteretornaumProcessondevoccapazdepegarasadado
programa,enviardadosparaaentrada,entreoutros.
Veremostambmaclasse System noprximocaptuloenode Threads.Consultea
documentaodoJavaevejaoutrosmtodosteisdaSystem.

14.3 - java.lang.Object
Semprequandodeclaramosumaclasse,essaclasseobrigadaaherdardeoutra.Isto
,paratodaclassequedeclararmos,existeumasuperclasse.Pormcriamosdiversasclasses
semherdardeningum:
classMinhaClasse{
}
QuandooJavanoencontraapalavrachave extends,eleentoconsideraquevoc
estherdandodaclasseObject,quetambmseencontradentrodopacotejava.lang.Voc
atmesmopodeescreveressaherana,queamesmacoisa:

OBJECT

classMinhaClasseextendsObject{
}
Todas as classes, sem exceo, herdam de Object, seja direta ou
indiretamente.
Podemos tambm afirmar que qualquer objeto em Java um Object, podendo ser
referenciado comotal.Entoqualquerobjetopossuitodososmtodosdeclaradosnaclasse
Object,everemosalgunsdeleslogoapsocasting.

14.4 - Casting de referncias


Ahabilidadedepodersereferenciaraqualquerobjetocomo Object nostrazmuitas
vantagens.PodemoscriarummtodoquerecebeumObjectcomoargumento,isto,qualquer
coisa!Melhor,podemosarmazenarqualquerobjeto:
publicclassGuardadorDeObjetos{
privateObject[]arrayDeObjetos=newObject[100];
privateintposicao=0;
publicvoidadicionaObjeto(Objectobject){
this.arrayDeObjetos[this.posicao]=object;
this.posicao++;
}
publicObjectpegaObjeto(intindice){
returnthis.arrayDeObjetos[indice];
}
}
Masenomomentoqueretirarmosumarefernciaaesseobjeto,comovamosacessaros
mtodoseatributosdesseobjeto?Seestamosreferenciandoocomo Object,nopodemos
acesslocomosendoConta.Vejaoexemploaseguir:
GuardadorDeObjetosguardador=newGuardadorDeObjetos();
Contaconta=newConta();
guardador.adicionaObjeto(conta);
Captulo14Opacotejava.langPgina144

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

//...
Objectobject=guardador.pegaObjeto(0);//pegaacontareferenciadocomo
objeto
object.getSaldo();//classeObjectnaotemmtodogetSaldo!nocompila!
PoderamosentoatribuiressarefernciadeObjectparaConta?Tentemos:
ContacontaResgatada=object;
Nstemoscertezadequeesse Object sereferenciaauma Conta,jquefomosns
queoadicionamosnaclassequeguardaobjetos.MasoJavanotemgarantiassobreisso!
Essalinhaacimanocompila,poisnemtodoObjectumaConta.
Paraconseguirrealizaressaatribuio,devemosavisaroJavaquerealmentequeremos
isso, sabendo do risco que podemos estar correndo. Fazemos o casting de
referncias,parecidocomoquandofizemoscomostiposprimitivos:

CASTING DE
REFERNCIAS fazer

ContacontaResgatada=(Conta)object;
Agoraocdigopassaacompilar,masserqueroda?Essecdigorodasemnenhum
problema,poisemtempodeexecuoeleirverificarseessarefernciarealmenteestse
referindoauma Conta,eest!Senotivesse,umaexceodotipo ClassCastException
serialanada.
PoderamosfazeromesmocomFuncionarioeGerente.Tendoumarefernciapara
umFuncionario,quetemoscertezaserumGerente,podemosfazeraatribuio,desdeque
tenhaocasting,poisnemtodoFuncionarioumGerente.
Funcionariofuncionario=newGerente();
//

...edepois

Gerentegerente=funcionario;//nocompila!
//nemtodoFuncionarioumGerente
Ocorretoentoseria:
Gerentegerente=(Gerente)funcionario;
Ateno! O problema aqui poderia ser resolvido atravs da parametrizao da classe
GuardadorDeObjetos.Vejaoapndicedegenerics.
Eagoravamosmisturaralgumascoisas:
Objectobject=newConta();
//

...edepois

Gerentegerente=(Gerente)object;
Essecdigocompila?Roda?
Compila,pormnoroda,elevailanarumaException(ClassCastException)emtempo
de execuo. importante diferenciar tempo de compilao e tempo de execuo. Neste
exemponsgarantimosaojavaquenossoObjetoobjecteraumGerentecomoCasting,por

Captulo14Opacotejava.langPgina145

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

issocompilou,masnahoraderodar,quandoelefoireceberum Gerente, elerecebeuuma


Conta,daelereclamoulanandoClassCastException!
Ateno! O problema aqui poderia ser resolvido atravs da parametrizao da classe
GuardadorDeObjetos.Vejaoapndicedegenerics.

14.5 - Integer e classes wrappers (box)


Umaperguntabemsimplesquesurgenacabeadetodoprogramadoraoaprenderuma
novalinguagem:"ComotransformarumnmeroemStringeviceversa?".
Cuidado! Usamos aqui o termo transformar porm o que ocorre no uma
transformaoentreostipos,esimumaformadeconseguirmosumaStringdadoumint,evice
versa.OjeitomaissimplesdetransformarumnmeroemStringconcatenlodaseguinte
maneira:
inti=100;
Strings=""+i;
System.out.println(s);
doubled=1.2;
Strings2=""+d;
System.out.println(s2);
Para formatar o nmero de uma maneira diferente, com vrgula e nmero de casas
decimaisdevemosutilizaroutrasclassesdeajuda(NumberFormat,Formatter).
Paratransformaruma String emnmeroutilizamosasclassesdeajudaparaostipos
primitivoscorrespondentes.Porexemplo,paratransformara String s emumnmerointeiro
utilizamosomtodoestticodaclasseInteger:
Strings="101";
inti=Integer.parseInt(s);
Asclasses Double, Short, Long, Float etccontmomesmotipodemtodo,como
parseDoubleeparseFloatqueretornamumdoubleefloatrespectivamente.
WRAPPING

Essasclassestambmsomuitoutilizadasparafazero wrapping (embrulhar)tipos


primitivos como objetos, pois referncias e tipos primitivos so incompatveis. Imagine que
precisamospassarcomoargumentouminteiroparaonossoguardadordecarrosuminteiro.Um
inteironoumObject,comofazer?

inti=5;
Integerx=newInteger(i);
EdadoumInteger,podemospegarointqueestdentrodele(desembrulhlo):
inti=5;
Integerx=newInteger(i);
intnumeroDeVolta=x.intValue();

14.6 - Autoboxing no Java 5.0


AUTOBOXING

Esse processo de wrapping e unwrapping entediante. O Java 5.0 traz um recurso


chamadodeautoboxing,quefazissosozinhoparavoc,custandolegibilidade:

Integerx=5;

Captulo14Opacotejava.langPgina146

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

inty=x;
NoJava1.4essecdigoinvlido.NoJava5.0elecompilaperfeitamente.importante
ressaltarqueissonoquerdizerquetiposprimitivoserefernciasagorasoamesmacoisa,
issosimplesmenteumadocicamentosintticoparafacilitaracodificao.
Vocpodefazertodosostiposdeoperaesmatemticascomoswrappersagora,porm
correoriscodetomarumNullPointerException.
Vocpodefazeroautoboxingdiretamentepara Object tambm,possibilitandopassar
umtipoprimitivoparaummtodoquereceberObjectcomoargumento:
Objecto=5;

14.7 - Mtodos do java.lang.Object equals e toString


TOSTRING

O primeiro mtodo interessante o toString. As classes podem reescrever esse


mtodoparamostrarumamensagem,umaString,queorepresente.Vocpodeusloassim:

Contac=newConta();
System.out.println(c.toString());
OmtodotoStringdoObjectretornaonomedaclasse@umnmerodeidentidade:
Conta@34f5d74a
Masissonointeressanteparans.Entopodemosreescrevlo:
classConta{
privatedoublesaldo;
//outrosatributos...
publicConta(doublesaldo){
this.saldo=saldo;
}
publicStringtoString(){
return"Umacontacomvalor:"+this.saldo;
}
}
ChamandootoStringagora:
Contac=newConta(100);
System.out.println(c.toString());//imprime:Umacontacomvalor:100.
Eomelhor,seforapenasparajogarnatela,vocnemprecisachamarotoString!Ele
jchamadoparavoc:
Contac=newConta(100);
System.out.println(c);//OtoStringchamadopelaclassePrintStream
Geraomesmoresultado!
VocaindapodeconcatenarStringsemJavacomooperador+.SeoJavaencontraum
objetonomeiodaconcatenao,eletambmchamaotoStringdele.
Contac=newConta(100);
Captulo14Opacotejava.langPgina147

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

System.out.println("descrio:"+c);
O outro mtodo muito importante o equals. Quando comparamos duas variveis
referncianoJava,o==verificaseasduasreferemseaomesmoobjeto:
Contac1=newConta(100);
Contac2=newConta(100);
if(c1!=c2){
System.out.println("objetosreferenciadossodiferentes!"");
}
Mas,esefosseprecisocompararosatributos?Quaisatributoseledeveriacomparar?O
Javaporsisnofazisso,masexisteummtodonaclasse Object quepodeserreescrito
paracriarmosessecritriodecomparao.Essemtodooequals.

EQUALS

OequalsrecebeumObjectcomoargumento,edeveverificarseelemesmoigualao
Object recebido para retornar um boolean. Se voc no reescrever esse mtodo, o
comportamentoherdadofazerum==comoobjetorecebidocomoargumento.
publicclassConta{
privatedoublesaldo;
//outrosatributos...
publicConta(doublesaldo){
this.saldo=saldo;
}
publicbooleanequals(Objectobject){
ContaoutraConta=(Conta)object;
if(this.saldo==outraConta.saldo){
returntrue;
}
returnfalse;
}
publicStringtoString(){
return"Umacontacomvalor:"+this.saldo;
}
}
Umexemploclssicodousodoequalsparadatas.Sevoccriarduasdatas,isto,dois
objetos diferentes, contendo 31/10/1979, ao comparar com o == receber false, pois so
referncias para objetos diferentes. Seria correto ento reescrever este mtodo, fazendo as
comparaesdosatributos,eousuriopassariaainvocarequalsemvezdecompararcom==.
Vocpoderiacriarummtodocomoutronomeemvezdereescreverequalsquerecebe
Object,maseleimportantepoismuitasbibliotecasochamamatravsdopolimorfismo,como
veremosnocaptulodojava.util.
OmtodohashCode()andademodadacomomtodoequals()edefundamental
entendimentonocasodevocutilizarsuasclassescomestruturasdedadosqueusamtabelas
deespalhamento.Tambmfalamosdelenocaptulodejava.util.

14.8 - java.lang.String
StringumaclasseemJava.VariveisdotipoStringguardamrefernciasobjetos,
enoumvalor,comoacontececomostiposprimitivos.
Alis,podemoscriarumaStringutilizandosedonew:
Captulo14Opacotejava.langPgina148

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Stringx=newString("fj11");
Stringy=newString("fj11");

Criamosaqui,doisobjetosdiferentes.Oqueacontecequandocomparamosessasduas
refernciasutilizandoo==?
if(x==y){
System.out.println("mesmoobjeto");
}
else{
System.out.println("objetosdiferentes!");
}

Temosaquidoisobjetosdiferentes!Eentocomofaramosparaverificarseocontedodo
objetoomesmo?Utilizamosomtodo equals,quefoireescritopela String,parafazera
comparaodecharachar.
if(x.equals(y)){
System.out.println("consideramosiguaisnocritriodeigualdade");
}
else{
System.out.println("consideramosdiferentesnocritriodeigualdade");
}

Aqui a comparao retorna verdadeiro. Por qu? Pois quem implementou a classe
Stringdecidiuqueesteseriaomelhorcritriodecomparao.Vocpodedescobriroscritrios
deigualdadedecadaclassepeladocumentao.
PodemostambmconcatenarStringsusandoo+.PodemosconcatenarStringscom
qualqueroutracoisa,atmesmoobjetosenmeros:
inttotal=5;
System.out.println("ototalgasto:"+total);

Aclasse String contatambmcomummtodo split,quedividea String emuma


arraydeStrings,dadodeterminadocritrio.

SPLIT

Stringfrase="javademais";
Stringpalavras[]=frase.split("");
COMPARETO

Se quisermos comparar duas Strings, utilizamos o mtodo compareTo, que recebe


umaStringcomoargumentoedevolveuminteiroindicandoseaStringvemantes,igualou
vemdepoisda String recebida.Seforemiguais,devolvido0;seforanterior String do
argumento,devolveuminteironegativo;e,seforposterior,uminteiropositivo.
Fatoimportante:umaStringimutvel.OjavacriaumpooldeStringsparausarcomo
cache,seelanofosseimutvel,mudandoovalordeumaStringafetarianasStringsqueoutras
classesestosereferindoetemomesmovalor.
Repareocdigoabaixo:

Stringpalavra="fj11";
palavra.toUpperCase();
System.out.println(palavra);

Podeparecerestranho,maseleimprimefj11emminsculo.Todomtodoqueparece
alterarovalordeumaStringnaverdadecriaumanovaStringcomasmudanassolicitadasea
retorna.Ocdigorealmentetilficariaassim:
Stringpalavra="fj11";
Captulo14Opacotejava.langPgina149

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos


Stringoutra=palavra.toUpperCase();
System.out.println(outra);

Ouvocpodeeliminaracriaodeoutravariveltemporriaseacharconveniente:
Stringpalavra="fj11";
palavra=palavra.toUpperCase();
System.out.println(palavra);

IssofuncionaparatodososmtodosdaclasseString,sejareplace,trim,toLowerCasee
outros.
OfuncionamentodopoolinternodeStringsdojavatemumasriededetalhes,evoc
podeencontrarmaisinformaessobreistonadocumentaodaclasseString,etambmno
seumtodointern().

charAt,lengthesubstring
ExistemdiversosmtodosdaclasseStringquesoextremamenteimportantes.Recomendamos
sempreconsultarojavadocrelativoaessaclasseparaaprendercadavezmaissobreamesma.
PorexemploomtodocharAt(i)retornaocaractereexistentenaposioidastring,omtodo
length retornaonmerodecaracteresnamesmaeomtodo substring querecebeuminte
devolveaSubStringapartirdaposiopassadaporaqueleint.

14.9 - java.lang.Math
Na classe Math, existe uma srie de mtodos estticos que fazem operaes com
nmero, como por exemplo arredondar(round), tirar o valor absoluto (abs), tirar a raiz(sqrt),
calcularoseno(sin)eoutros.
doubled=4.6;
longi=Math.round(d);
intx=4;
inty=Math.abs(x);

Consulteadocumentaoparaveragrandequantidadedemtodosdiferentes.
NoJava5.0,podemostirarproveitodoimportstaticaqui:
importstaticjava.lang.Math.*;

Issoeliminaanecessidadedeusaronomedaclasse,sobocustodelegibilidade:
doubled=4.6;
longi=round(d);
intx=4;
inty=abs(x);

14.10 - Exerccios
1)Testeosexemplosdessecaptulo,paraverqueumaStringimutvel.Porexemplo:
publicclassTestaString{
publicstaticvoidmain(String[]args){
Captulo14Opacotejava.langPgina150

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Strings="fj11";
s.replaceAll("1","1");
System.out.println(s);
}
}
Comofazerparaeleimprimirfj22?
2)UtilizesedadocumentaodoJavaedescubradequeclasseoobjetoreferenciado
peloatributooutdaSystem.

3)ReescrevaomtodotoStringdasuaclasseContafazendocomqueosaldoseja
devolvido:

abstractclassConta{
privatedoublesaldo;
publicStringtoString(){
return"esseobjetoumacontacomsaldoR$"+saldo;
}
//restante
}

CrieeimprimaumarefernciaparaConta(ContaCorrente ou ContaPoupanca no
casodesuaContaserabstrata).Removaessemtodo,sevoctentarimprimirumareferncia
aContaoqueaparece?
4)ReescrevaomtodoequalsdaclasseContaparaqueduascontascomomesmo
nmerodecontasejamconsideradasiguais.Esboo:

abstractclassConta{
privateintnumero;
publicbooleanequals(Objectobj){
ContaoutraConta=(Conta)obj;
returnthis.numero==outraConta.numero;
}
//restante
}

Compare duas instncias de Conta com ==, depois com equals, sendo que as
instnciassodiferentesmaspossuemomesmonmero.
5) Um double no est sendo suficiente para eu guardar a quantidade de casas
necessrias em uma aplicao. Preciso guardar um nmero decimal muito grande! O que
poderiausar?(consulteadocumentao,tenteadivinharondevocpodeencontraralgodesse
tipopelosnomesdospacotes,vejacomointuitivo).
Captulo14Opacotejava.langPgina151

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

6) (opcional) Agora faa com que o equals da sua classe Conta tambm leve em
consideraoaStringdonomedoclienteaqualelapertence.Testea.
7) (opcional) Escreva um mtodo que usa os mtodos charAt e length de uma
Stringparaimprimiramesmacaractereacaractere,sendoquecadacaracteredeveestarem
umalinhadiferente.
8) (opcional) Reescrevaomtododoexerccioanteriormasagoraimprimaastringde
trsparaafrente.
9)(opcional)Crieaclasse GuardadorDeObjetos dessecaptulo.Testeaadicionando
umaStringedepoisretirnandocomocastingparaumaoutraclasse,comoConta.Reparea
exception que lanada. Teste tambm o autoboxing do java 5.0 passando um inteiro para
nossoguardador.
10)(opcional)PesquiseaclasseStringBuilder(ouStringBuffernojava1.4).Ela
mutvel.PorqueuslaemvezdaString?Quandousla?

14.11 - Desafio
ConvertaumaStringparaumnmero,semusarasbibliotecasdojavaquejafazemisso.
Isso,umaStringx=767devegeraruminti=767.

Captulo14Opacotejava.langPgina152

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

15

Pacote java.io

15

A beneficncia sobretudo um vcio do orgulho e no uma


virtude da alma.
DoantienAlphonseFranois(MarqusdeSade)

Aotrminodessecaptulo,vocsercapazde:
lereescreverbytes,caractereseStringsde/paraaentradaesadapadro;
lereescreverbytes,caractereseStringsde/paraarquivose
utilizarbuffersparaagilizaraleituraeescritaatravsdefluxos.
UtilizarScannerePrintStream

15.1 - Conhecendo uma API


VamospassaragoraaconhecerAPIsdoJava.java.ioejava.utilpossuemasclassesque
vocvaimaiscomumenteusar,noimportandoseseuaplicativodesktop,web,oumesmo
paracelulares.
Apesar de ser importante conhecer nomes e mtodos das classes mais utilizadas, o
interessante aqui que voc enxergue que todos os conceitos previamente estudados so
aplicadosatodahoranasclassescriadaspelaSun.
Nosepreocupeemdecorarnomes,preocupeseementendercomoessasclassesesto
relacionadasecomoelasestotirandoproveitodousodeinterfaces,polimorfismos,classes
abstrataseencapsulamento.Lembresedeestarcomadocumentao(javadoc)abertadurante
ocontatocomessespacotes.
Veremostambmthreadsesocketsemcaptulosposteriores,queajudaroacondensar
nossoconhecimento,tendoemvistaquenoexercciodesocketsutilizaremostodosconceitos
aprendidos,juntamentecomasvriasAPIs.

15.2 - Orientao a objeto


JAVA.IO

ARQUIVOS
SOCKETS
ENTRADA E
SADA

AssimcomotodoorestodasbibliotecasemJava,apartedecontroledeentradaesada
dedados(conhecidocomoio)orientadaaobjetoseusaosprincipaisconceitosmostradosat
agora:interface,classesabstratasepolimorfismo.
A idia atrs do polimorfismo no pacote java.io de utilizar fluxos de entrada
(InputStream)edesada(OutputStream)paratodaequalqueroperao,sejaelarelativaa
um arquivo, a uma conexo remota via sockets ou at mesmo a entrada e sada
padrodeumprograma(normalmenteotecladoeoconsole).
As classes abstratas InputStream e OutputStream definem respectivamente o
comportamentopadrodosfluxosemJava:emumfluxodeentradapossvellerbyteseno
fluxodesadaescreverbytes.
Agrandevantagemdessaabstraopodesermostradaemummtodoqualquerque
Captulo15Pacotejava.ioPgina153

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

utilizaumOutputStreamrecebidocomoargumentoparaescreveremumfluxodesada.Para
onde o mtodo est escrevendo? No se sabe e no importa: quando o sistema precisar
escreveremumarquivoouemumasocketbastachamaromesmomtodo!

15.3 - InputStream: lendo bytes


Vamoslerumbytedeumarquivo:
1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=newFileInputStream("arquivo.txt");
4.
intb=is.read();
5.
}
6.}
AclasseInputStreamabstrata,eFileInputStreamumadesuasfilhas.Elarecebe
uma String que o nome do arquivo como argumento peloconstrutor. Ela vai procurar o
arquivonodiretrioemqueojavafoiinvocado(nocasodoEclipsevaiserdentrododiretriodo
projeto).Vocpodeusarumcaminhoabsoluto.
Quandotrabalhamoscomjava.io,diversosmtodoslanam IOException,queuma
exceptiondotipochecked,oquenosobrigaatratalaoudeclarala.Estamosaquideclarando
IOException atravsdothrowsdomainapenasparafacilitaroexemplo,casoaexception
ocorraaJVMvaipararmostrandoastacktrace.
InputStream tem diversas filhas, como ObjectInputStream, AudioInputStream,
ByteArrayInputStream,entreoutras.

15.4 - InputStreamReader: lendo chars


Pararecuperarumcaractereprecisamostraduzirosbytescomoencodingdadoparao
respectivo cdigo unicode, isso pode usar 1 ou mais bytes. Escrever esse decoder muito
complicado,quemjfazissooInputStreamReader.
1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=newFileInputStream("arquivo.txt");
4.
InputStreamReaderisr=newInputStreamReader(is);
5.
intc=isr.read();
6.
}
7.}
O construtor de InputStreamReader pode receber o encoding a ser utilizado como
parmetro,sedesejado,taiscomoUTF8ouISO88591.
InputStreamReader filhadaclasseabstrata Reader.Existemdiversasfilhas,so
classesquemanipulamchars.

15.5 - BufferedReader: lendo Strings


ApesardaclasseabstrataReaderjajudarnotrabalhocomcaracteresaindaficadifcil
parapegaruma String.Aclasse BufferedReader um Reader querecebe Reader no
construtoreconcatenaosdiversoscharsparaformarumaStringatravsdoreadLine:

1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=newFileInputStream("arquivo.txt");
Captulo15Pacotejava.ioPgina154

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

4.
5.
6.
7.
8.}

InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
Strings=br.readLine();
}
Comooprprionomediz,essaclasseldo Reader porpedaos(chunk)paraevitar
realizarmuitaschamadasaosistemaoperacional.Vocpodeatconfigurarotamanhodobuffer
peloconstrutor.
essaacomposiodeclassesqueestacontecendo:

Aquilemosapenasaprimeiralinhadoarquivo.OmtodoreadLinedevolvealinhaque
foilidaemudaocursorparaaprximalinha.CasoelechegueaofimdoReader(nonossocaso
fimdoarquivo),elevaidevolver null.Entocomumsimpleslaopodemosleroarquivopor
inteiro:

1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=newFileInputStream("arquivo.txt");
4.
InputStreamReaderisr=newInputStreamReader(is);
5.
BufferedReaderbr=newBufferedReader(isr);
6.
Strings=br.readLine();//primeiralinha
7.
8.
while(s!=null){
9.
System.out.println(s);
10.
s=br.readLine();
11.
}
12.
}
13.}

15.6 - Lendo Strings do teclado


Comumpassedemgica,passamosalerdotecladoemvezdeumarquivo,utilizandoo
System.inqueumarefernciaaumInputStreamqueldaentradapadro.
1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=System.in;
4.
InputStreamReaderisr=newInputStreamReader(is);
5.
BufferedReaderbr=newBufferedReader(isr);
6.
Strings=br.readLine();
7.
8.
while(s!=null){
9.
System.out.println(s);
10.
s=br.readLine();
11.
}
12.
}
13.}

Captulo15Pacotejava.ioPgina155

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Apenasmodificamosaquemisestsereferindo.Podemosreceberargumentosdotipo
InputStream eteressetipodeabstrao:noimportaexatamentedeondeestamoslendo
essepunhadodebytesdesdequeagenterecebaainformaoqueestamosquerendo.Como
nafigura:

Repare que a ponta da direita poderia ser qualquer como InputStream, seja
ObjectInputStream, AudioInputStream, ByteArrayInputStream, ou a nossa
FileInputStream.Polimorfismo!OuvocmesmopodecriarumafilhadeInputStreamse
desejar.

Porisso muitocomummtodosreceberemeretornarem InputStream,emvezde


suasfilhasespecficas.Comissoelasdesacoplamasinformaes,escondemaimplementao,
facilitandoamudanaemanutenodocdigo. Reparequeissovaiaoencontrocomtudoo
que aprendemos durante os captulos que apresentaram classes abstratas, interfaces,
polimorfismoeencapsulamento.

15.7 - A analogia na sada


Comovocpodeimaginar,escreveromesmoprocesso:

1.classTestaSaida{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
OutputStreamos=newFileOutputStream("saida.txt");
4.
OutputStreamWriterosw=newOutputStreamWriter(os);
5.
BufferedWriterbw=newBufferedWriter(osw);
6.
7.
bw.write("caelum");
8.
9.
bw.close();
10.
}
Captulo15Pacotejava.ioPgina156

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

11.}
LembresededarrefreshnoseuprojetodoEclipseparaqueoarquivocriadoaparea.O
FileOutputStreampodereceberumbooleanocomosegundoparmetroparaindicarsevoc
querreescreveroarquivooumanteroquejestavaescrito(append).
Omtodowritedo BufferedWriter noinsereo(s)caractere(s)dequebradelinha,
paraissovocpodechamaromtodonewLine.

Fechandooarquivo
importantssimosemprelembrardefecharoarquivo,ouaclasseaqualvocestutilizandopara
facilitaraleitura/escrita(elesemprevaifecharostreamdoqualeleestlendoquandovocinvocar
oclosedeste).
Eledeveserinvocadodequalquermaneira,porissocomumqueocloseestejadentrodeum
blocofinally.Seumarquivo foresquecidoaberto,earefernciaparaeleforperdida,eleser
fechadopelogarbagecollector,queveremosmaisafrente,porcausadofinalize.Masnobom
vocseprenderaisso.Sevocesquecerdefecharoarquivonocasodeumprogramaminsculo
comoesse,oprogramavaiterminarantesqueotaldogarbagecollectorteajude,resultandoem
umarquivonoescrito(osbytesficaramnobufferdoBufferedWriter).
Problemassimilarespodemacontecercomleitoresdeixadosemaberto)

15.8 - Uma maneira mais fcil: Scanner e PrintStream


Nojava1.5temosaclassejava.util.Scannerquefacilitabastanteotrabalhodeler
deum InputStream.Almdisso,aclasse PrintStream possuiagoraumconstrutorqueja
recebeonomedeumarquivocomoargumento.Dessaformaaleituradotecladocomsadapara
umarquivoficoumuitosimples:
Scanners=newScanner(System.in);
PrintStreamps=newPrintStream("arquivo.txt");
while(s.hasNextLine()){
ps.println(s.nextLine());
}
Ambos os mtodos no lanam IOException (PrintStream lana
FileNotFoundException se voc o construir passando uma String, que filha de
IOExceptioneindicaqueoarquivonofoiencontrado),sendoqueoScannerconsiderar
quechegouaofimseumaIOforlanada,eoPrintStreamsimplesmenteengoleexceptions
dessetipo.Ambospossuemmtodosparavocverificarsealgumproblemaocorreu.
A classe Scanner do pacote java.util. Ela possui mtodos muito teis para
trabalhar com Strings, em especial diversos mtodos j preparados para pegar nmeros e
palavrasjformatadasatravsdeexpressesregulares.

15.9 - Um pouco mais...


1)Existemduasclasseschamadas java.io.FileReader e java.io.FileWriter.
Elassoatalhosparaaleituraeescritadearquivos.

Captulo15Pacotejava.ioPgina157

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

15.10 - Exerccios
1) Crie um programa (simplesmente uma classe com um main) que leia da entrada
padro. Para isso voc vai precisar de um BufferedReader que leia do System.in da
mesmaformacomofizemos::
1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=System.in;
4.
InputStreamReaderisr=newInputStreamReader(is);
5.
BufferedReaderbr=newBufferedReader(isr);
6.
Strings=br.readLine();//primeiralinha
7.
8.
while(s!=null){
9.
System.out.println(s);
10.
s=br.readLine();
11.
}
12.
}
13.}
O compilador vai reclamar que voc no est tratando algumas excees (como
java.io.IOException).Utilizeaclausulathrowsparadeixarescaparaexceopeloseu
main, ou use os devidos try catch. Utilize o quick fix do Eclipse para isso. Deixar todas as
exceptionspassaremdesapercebidasnoumaboaprtica!Vocpodeusaraquipoisestamos
focandonautilizaodejava.io.
Quandorodarsuaaplicao,paraencerraraentradadedadosdoteclado,necessrio
enviarmosumsinaldefimdestream.NoLinuxvocfazissocomoCONTROL+D.
2)Vamoslerdeumarquivoemvezdoteclado.Antesvamoscriaroarquivooqualser
lidopeloprograma:
a)CliquecomobotodireitoemcimadoseuprojetoeselecioneNew>File:

b)Nestateladigiteonomedoarquivonolugarindicado:

Captulo15Pacotejava.ioPgina158

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

c)TroqueoSystem.inporumFileInputStream:
InputStreamis=newFileInputStream("arquivo.txt");
3)(conceitual)Seuprogramaagoraletodasaslinhasdessearquivo.Repareautilizao
do polimorfismo. Como ambos so InputStream, isso faz com que eles se encaixem no
InputStreamReader.
4)UtilizeaclasseScannerparalerdeumarquivoecolocarnatela.Ocdigovaificar
incrivelmentepequeno.
5)(opcional)Altereseuprogramaparaqueeleleiadoarquivo,eemvezdejogarnatela,
jogueemumarquivo.Vocvaiprecisar,almdocdigoanteriorparalerdeumarquivo,do
cdigoparaescrevernumarquivo.ParaissovocpodeusaroBufferedWriter:
OutputStreamos=newFileOutputStream("saida.txt");
OutputStreamWriterosw=newOutputStreamWriter(os);
BufferedWriterbw=newBufferedWriter(osw);
Agora,dentrodoloopdeleituradoteclado,vocdeveusar bw.write(x),ondexa
linhaquevocleu.Usabw.newLine()parapulardelinha.Noseesqueadenotrminodo
loopdarumbw.close(),vocpodeseguiromodelo:
Strings=br.readLine();
while(s!=null){
bw.write(s);
bw.newLine();
//leiaaproximalinhadobufferedreader:
s=br.readLine():
}
bw.close();
Captulo15Pacotejava.ioPgina159

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Apsrodarseuprograma,deumrefreshnoseuprojeto(cliquedadireitanonomedo
projeto,refresh),evejaqueelecriouumarquivosaida.txtnodiretrio.
6)(opcional)Alterenovamenteoprogramaparaelevirarumpequenoeditor:ldoteclado
eescreveemarquivo.Reparequeamudanamnima!

Captulo15Pacotejava.ioPgina160

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

16

Collections framework

16

A amizade um contrato segundo o qual nos comprometemos a


prestar pequenos favores para que no-los retribuam com
grandes.
BarondelaBredeetdeMontesquieu

Aotrminodessecaptulovocsercapazde:
utilizararrays,lists,setsoumapsdependendodanecessidadedoprograma;
iterareordenarlistasecoleese
usarmapasparainseroebuscadeobjetos.

16.1 - Motivao: arrays so trabalhosas, precisamos de estruturas


de dados
ARRAYS
VETOR

Autilizaodearrayscomplicadaemmuitospontos:
nopodemosredimensionarumaarrayemJava;
impossvelbuscardiretamenteporumdeterminadoelementoparaoqualnosesabe
ondice;
noconseguimossaberquantasposiesdaarrayjforampopuladassemcriar,para
isso,mtodosauxiliares.

RetireaquartaConta

conta[3]=null;

Nafiguraacima,vocpodeverumarrayqueantesestavasendocompletamenteutilizado,
equedepoisteveumdeseuselementosremovidos.
Supondo que os dados armazenados representem contas, o que acontece quando
precisarmosinserirumanovacontanobanco?
Precisaremosprocurarporumespaovazio?
Iremosguardaremalgumaestruturadedadosexternaasposiesvazias?
Esenohouverespaovazio?Teramosdecriarumarraymaiorecopiarosdadosdo
antigoparaele?
Hmaisquestes:comoseiquantasposiesestosendousadasnoarray?Vouprecisar
semprepercorreroarrayinteiroparaconseguiressainformao?
Captulo16CollectionsframeworkPgina161

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Almdessasdificuldadesqueasarraysapresentavam,faltavaumconjuntorobustode
classesparasupriranecessidadedeestruturasdedadosbsicas,comolistasligadasetabelas
deespalhamento.
COLLECTIONS

Comesseseoutrosobjetivosemmente,aSuncriouumconjuntodeclasseseinterfaces
conhecidocomoCollections Frameworkqueresidenopacotejava.util.

Collections
AAPIdoCollectionsrobustaepossuidiversasclassesquerepresentamestruturasdedados
avanadas.
Porexemplo,nonecessrioreinventararodaecriarumalistaligadamassimutilizaraquelaque
aSundisponibilizou.

16.2 - Listas: java.util.List


UmprimeirorecursoqueaAPIdeCollectionstrazso listas.Umalistaumacoleo
quepermiteelementosduplicadosemantendoumaordenaoespecficaentreoselementos.
Emoutraspalavras,voctemagarantiadeque,quandopercorreralista,oselementos
seroencontradosemumaordemprdeterminada,definidanahoradainserodosmesmos.
Elaresolve todosos problemas quelevantamosemrelao a array (busca, remoo,
tamanhoinfinito,...).Essecdigojestpronto!
AAPIdeCollectionstrazainterfacejava.util.Listqueespecificaoqueumaclasse
devesercapazdefazerparaserumalista.Hdiversasimplementaesdisponveis,cadauma
comumaformadiferentederepresentarumalista.

LIST

AimplementaomaisutilizadadainterfaceListaArrayListquetrabalhacomuma
arrayinternaparagerarumalistaportantoelamaisrpidanapesquisaquesuaconcorrente,a
LinkedList,quemaisrpidanainseroeremoodeitensnaspontas.

ArrayListnoumaarray!
comumconfundiremumaArrayListcomumaarray,pormelanoumaarray,oqueocorre
que internamente ela usa uma array como estrutura para armazenar os dados, porm este
atributoestpropriamenteencapsuladoevocnotemcomoacessalo.Reparetambmquevoc
nopodeusar[]comumaArrayList,nemacessaratributolength.Nohrelao!

ParacriarumArrayListbastachamaroconstrutor:
ArrayListlista=newArrayList();
semprepossvelabstrairalistaapartirdainterfaceList:
Listlista=newArrayList();
Paracriarumalistadenomes(String),podemosfazer:
Listlista=newArrayList();
lista.add("Guilherme");
lista.add("Paulo");
Captulo16CollectionsframeworkPgina162

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

lista.add("Srgio");
Ainterface List possuidoismtodos add,umquerecebeoobjetoaserinseridoeo
colocanofinaldalistaeumsegundoquepermiteadicionaroelementoemqualquerposioda
mesma.
Notequeemmomentoalgumdizemosqualotamanhodalista;podemosacrescentar
quantoselementosquisermosquealistacresceconformefornecessrio.
Todalista(naverdade,todaCollection)trabalhadomodomaisgenricopossvel.Isto
,nohumaArrayListespecficaparaStrings,outraparaNmeros,outraparaDatasetc.
TodososmtodostrabalhamcomObject.
Assim,possvelcriar,porexemplo,umalistadeContasCorrentes:
ContaCorrentec1=newContaCorrente();
c1.deposita(100);
ContaCorrentec2=newContaCorrente();
c2.deposita(200);
ContaCorrentec3=newContaCorrente();
c3.deposita(300);
Listcontas=newArrayList();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Parasaberquantoselementoshnalista,podemosusaromtodosize():
System.out.println(contas.size());
Haindaummtodoget(int)querecebecomoargumentoondicedoelementoque
sequerrecuperar.Atravsdelepodemosfazerumforparaiterarnalistadecontas:
for(inti=0;i<contas.size();i++){
contas.get(i);//cdigonomuitotil....
}
Mascomofazerparaimprimirosaldodessascontas?Podemosacessaro getSaldo()
diretamente aps fazer contas.get(i)? No podemos; lembrese que toda lista trabalha
semprecomObject.Assimarefernciaretornadapeloget(i)dotipoObject,sendonecessrio
ocastparaContaCorrentesequisermosacessarogetSaldo():
for(inti=0;i<contas.size();i++){
ContaCorrentecc=(ContaCorrente)contas.get(i);
System.out.println(cc.getSaldo());
}
//notequeaordemdoselementosnoalterada
Haindaoutrosmtodoscomoremove()querecebeumobjetoquesedesejaremoverda
lista;econtains()querecebeumobjetocomoargumentoedevolvetrueorfalseindicando
seoelementoestounonalista.
Ainterface List ealgumasclassesqueaimplementampodemservistasnodiagrama
UMLaseguir:

Captulo16CollectionsframeworkPgina163

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Acessoaleatrioepercorrendolistascomget
Algumaslistas,comoa ArrayList,temacessoaleatrioaosseuselementos:abuscaporum
elementoemumadeterminadaposiofeitademaneiraimediata,semquealistainteiraseja
percorrida.
Neste caso o acesso feito atravs do mtodo get(int) e muito rpido. Caso contrrio,
percorrer uma lista usando um for como esse que acabos de ver, pode ser desastroso. Ao
percorrermosumalistas,devemosusarsempreumIteratorouenhancedfor,comoveremos.
Umalistaumaexcelentealternativaaumarraycomumjquetemostodososbenefcios
dearrays,semanecessidadedetomarcuidadocomremoes,faltadeespaoetc.
A outra implementao muito usada (LinkedList), fornece mtodos adicionais para
obtereremoveroprimeiroeltimoelementodalista.

Vector
OutraimplementaoatradicionalclasseVector,presentedesdeoJava1.0,quefoiadaptada
parausocomoframeworkdecollections,comainclusodenovosmtodos.
Eladevesertratadacomcuidadopoislidadeumamaneiradiferentecomprocessoscorrendoem
paraleloesermaislentoqueumaArrayListquandonohouveracessosimultneoaosdados.

16.3 - Listas no Java 5.0 com Generics


Em qualquer lista possvel colocar qualquer Object. Com isso possvel misturar
objetos:
Listlista=newArrayList();
lista.add("Umastring");
lista.add(newContaCorrente());
...
Masedepois, nahoraderecuperaressesobjetos? Comoomtodo get devolveum
Object,precisamosfazerocast.Mascomumalistacomvriosobjetosdetiposdiferentes,isso
podenosertosimples...

Captulo16CollectionsframeworkPgina164

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Geralmentenonosinteressaumalistacomvriostiposdeobjetosmisturados;nodiaa
dia,usamoslistascomoaqueladecontascorrentes.NoJava5.0,podemosusarorecursode
Genericspararestringiraslistasaumdeterminadotipodeobjetos(enoqualquerObject):
List<ContaCorrente>contas=newArrayList<ContaCorrente>();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Reparenousodeumparmetroaoladode List e ArrayList:eleindicaquenossa
listafoicriadaparatrabalharexclusivamentecomobjetosdotipoContaCorrente.Issonostraz
umaseguranaemtempodecompilao:
contas.add("umastring");//issonocompilamais!!

OusodeGenericstambmeliminaanecessidadedecasting,jqueseguramentetodos
osobjetosinseridosnalistaserodotipoContaCorrente:
for(inti=0;i<contas.size();i++){
ContaCorrentecc=contas.get(i);//semcasting!
System.out.println(cc.getSaldo());
}

16.4 - Ordenao: Collections.sort


Vimosanteriormentequeaslistassopercorridasdemaneiraprdeterminadadeacordo
com a incluso dos itens. Mas muitas vezes queremos percorrer a nossa lista de maneira
ordenada.
AclasseCollectionstrazummtodoestticosortquerecebeumListcomoargumento
eoordenaporordemcrescente.Porexemplo:
Listlista=newArrayList();
lista.add("Srgio");
lista.add("Paulo");
lista.add("Guilherme");
System.out.println(lista);//reparequeotoStringdeArrayListfoi
sobrescrito!
Collections.sort(lista);
System.out.println(lista);
Aotestaroexemploacima,vocobservarqueprimeiroalistaimpressanaordemde
inseroe,depoisdechamarosort,elaimpressaemordemalfabtica.
Mas toda lista em Java pode ser de qualquer tipo de objeto, por exemplo,
ContaCorrente.Esequisermosordenarumalistade ContaCorrente?Emqueordema
classeCollectionsordenar?Pelosaldo?Pelonomedocorrentista?
ContaCorrentec1=newContaCorrente();
c1.deposita(500);
ContaCorrentec2=newContaCorrente();
c2.deposita(200);
ContaCorrentec3=newContaCorrente();
c3.deposita(150);
List<ContaCorrente>contas=newArrayList<ContaCorrente>();
contas.add(c1);
Captulo16CollectionsframeworkPgina165

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

contas.add(c3);
contas.add(c2);
Collections.sort(contas);//qualocritriodeordenao?
Semprequefalamosemordenao,precisamospensaremum critriodeordenao,
umaformadedeterminarqualelementovemantesdequal.necessrioinstruiroJavasobre
comocompararnossasContaCorrenteafimdedeterminarumaordemnalista.

COMPARABLE

Vamos fazer com que os elementos da nossa coleo implementem a interface


java.lang.Comparable, que define o mtodo int compareTo(Object). Este mtodo
deveretornarzeroseoobjetocomparadoforigualaesteobjeto,umnmero negativose
esteobjetoformenorqueoobjetodado,eumnmeropositivoseesteobjetoformaiorque
oobjetodado.
ParaordenarasContaCorrenteporsaldo,bastaimplementaroComparable:

publicclassContaCorrenteextendsContaimplementsComparable<ContaCorrente>
{
//...todoocodigoanteriorficaaqui
publicintcompareTo(ContaCorrenteoutra){
if(this.saldo<outra.saldo){
return1;
}
if(this.saldo>outra.saldo){
return1;
}
return0;
}
}
Comocdigoanterior,nossaclassetornousecomparvel:dadosdoisobjetosda
classe,conseguimosdizerseumobjetomaior,menorouigualaooutro,segundoalgumcritrio
pornsdefinido.Nonossocaso,acomparaoserfeitabaseandosenosaldodaconta.
Reparequeocritriodeordenaototalmenteaberto,definidopeloprogramador.Se
quisermosordenarporoutroatributo(ouatporumacombinaodeatributos),bastamodificar
aimplementaodomtodocompareTonaclasse.
Agorasim,quandochamarmosomtodosortdeCollectionselesabercomofazera
ordenaodalista;eleusarocritrioquedefinimosnomtodocompareTo.
Mas e o exemplo anterior, com uma lista de Strings? Porque a ordenao funcionou
naquelecasosemprecisarmosfazernada?Simples:quemescreveuaclasseString(lembre
que ela uma classe normal do Java) implementou a interface Comparable e o mtodo
compareToparaStrings,fazendocomparaoemordemalfabtica.(Consulteadocumentao
daclasseStringevejaomtodocompareTol).

Definindooutroscritriosdeordenao
possveldefiniroutroscritriosdeordenaousandoumobjetodotipoComparator.Existeum
mtodosort emCollectionsquerecebe,almdaList, umComparatordefinindoumcritriode
ordenaoespecfico.
Captulo16CollectionsframeworkPgina166

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

possveltervriosComparatorcomcritriosdiferentesparausarquandofornecessrio.

OutrosmtodosdaclasseCollections
A classe Collections traz uma srie de mtodos estticos teis na manipulao de colees
(veremosoutrostiposalmdeListmaisadiante).
binarySearch(List,Object):Realizaumabuscabinriapordeterminadoelementonalistaordenada,
eretornasuaposio,ouumnmeronegativocasonoencontrado.
max(Collection):Retornaomaiorelementodacoleo.
min(Collection):Retornaomenorelementodacoleo.
emuitosoutros.Consulteadocumentaoparaveroutrosmetdos.
Existeumaclasseanloga,Arrays,quefazoperaessimilarescomarray.

16.5 - Exerccios
1) Faa sua classe
ContaPoupanca
implementar a interface
Comparable<ContaPoupanca>.Utilizeocritriodeordenarpelonmerodacontaoupeloseu
saldo(comovistonocdigodestecaptulo).

publicclassContaPoupancaextendsContaimplements
Comparable<ContaPoupanca>
Repare queoEclipseprontamentelheoferecerumquickfix,oferecendoacriaodo
esqueletodosmtodosdefinidosnainterfaceComparable:

2)CrieumaclasseTestaOrdenacaoelainstanciediversascontaseadicioneasnuma
List<ContaPoupanca>.UseoCollections.sort()nessalista:
List<ContaPoupanca>contas=newArrayList<ContaPoupanca>();
ContaPoupancac1=newContaPoupanca();
c1.deposita(150);
contas.add(c1);
ContaPoupancac2=newContaPoupanca();
c2.deposita(100);
contas.add(c2);
ContaPoupancac3=newContaPoupanca();
c3.deposita(200);
Captulo16CollectionsframeworkPgina167

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

contas.add(c3);
Collections.sort(contas);
Faaumlaoparaimprimirtodosossaldosdascontasnalistajordenada:
for(inti=0;i<contas.size();i++){
System.out.println(saldo:+contas.get(i).getSaldo());
}
Atenoespecial:reparequeescrevemosummtodocompareToemnossaclasse,e
nosso cdigo nunca o invoca!! Isto muito comum, reescrevemos (ou implementamos) um
mtodoequemoinvocarserumoutroconjuntodeclasses(nessecasoquemestchamando
ocompareTooCollections.sort,queousacomobaseparaoalgoritmodeordenao).
Issocriaumsistemaextremamentecoesa,eaomesmotempocombaixoacoplamento:aclasse
CollectionsnuncaimaginouqueordenariaobjetosdotipoContaPoupanca,masjqueeles
soComparable,oseumtodosortestsatisfeito.
(opcional)Sepreferirinsiranovascontasatravsdeumlao(for).Paracolocarsaldos
aleatrios,adivinheonomedaclasseparaisso?Random.Dopacotejava.util.Consultesua
documentaoparausla.
3) O que teria acontecido se a classe ContaPoupanca no implementasse
Comparable<ContaPoupanca>?
4)(opcional)Imprima arefernciaparaessalista. Reparequeo toString deuma
Array/LinkedListreescrito:
System.out.println(contas);

5) (opcional) Mude o critrio de comparao da sua ContaPoupanca. Adicione um


atributonomeDoClientenasuaclasse(casoaindanoexistaalgosemelhante),etentemudar
o compareTo para que uma lista de ContaPoupanca seja ordenada alfabeticamente pelo
atributonomeDoCliente.

16.6 - Conjunto: java.util.Set


SET

Umconjunto(Set)funcionadeformaanlogaaosconjuntosdamatemtica,eleuma
coleoquenopermiteelementosduplicados.
Possveisaesemumconjunto:

AcamisetaAzulestnoconjunto?
RemovaacamisetaAzul.
AdicioneacamisetaVermelha.
Limpeoconjunto.

Noexistemelementosduplicados!
Ao percorrer um conjunto, sua ordem
noconhecida!

Captulo16CollectionsframeworkPgina168

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Outracaractersticafundamentaldeleofato
de que a ordem em que os elementos so
armazenados pode no ser a ordem na qual eles
foraminseridosnoconjunto.
Tal ordem varia de implementao para
implementao.
Um conjunto representado pela interface
Set etemcomosuasprincipaisimplementaesas
classesHashSeteTreeSet.

Ocdigoaseguircriaumconjuntoeadiciona
trsitens,apesardetentaradicionarquatro:
Setconjunto=newHashSet();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
conjunto.add("item3");
//imprimeasequncianatela
System.out.println(conjunto);

Oresultadosooselementosdoconjunto,aordemnaqualelesaparecempodemouno
seraordemnaqualelesforaminseridoseincorretosuporquesersempreamesmaordem!

Ordenandoumset
Seria possvel usar uma outra implementao de conjuntos, como um TreeSet, que insere os
elementos,detalforma,quequandoforempercorridos,aparecememumaordemdefinidapelo
mtodo de comparao entre seus elementos. Esse mtodo definido pela interface
java.lang.Comparable.OuaindapodesepassarumComparatorparaseuconstrutor.
No Java 5.0, assim como as listas, um conjunto tambm pode ser parametrizado
utilizandoGenerics,eliminandoanecessidadedecastings.

16.7 - Principais interfaces: java.util.Collection


AscoleestmcomobaseainterfaceCollection,quedefinemtodosparaadicionar
eremoverumelemento,verificarseeleestnacoleoentreoutrasoperaes,comomostraa
tabelaaseguir:
booleanadd(Object)

Adicionaumelementonacoleo.Comoalgumascoleesno
suportam elementos duplicados, este mtodo retorna true ou
falseindicandoseaadiofoiefetuadacomsucesso.

booleanremove(Object)

Removedeterminado elementodacoleo.Seelenoexistia,
retornafalse.

intsize()

Retornaaquantidadedeelementosexistentesnacoleo.

booleancontains(Object)

Procura por determinado elemento na coleo, e retorna


verdadeirocasoeleexista.Estacomparaofeitabaseandose

Captulo16CollectionsframeworkPgina169

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

nomtodoequals()doobjeto,enoatravsdooperador==.
Iteratoriterator()

Retornaumobjetoquepossibilitapercorreroselementosdaquela
coleo.

Uma coleo pode implementar


diretamente a interface Collection,
porm normalmente se usa uma das
duas subinterfaces mais famosas:
justamenteSeteList.
A interface Set, como vimos
defineumconjuntodeelementosnicos
enquanto a interface List permite a
rplicadeelementos.
A busca em um Set pode ser
mais rpida que em um objeto do tipo
List , pois diversas implementaes
utilizamse de tabelas de espalhamento
(hashtables), trazendo a busca para
tempolinear.

MAP

Ainterface Map fazpartedoframeworkmasnoestende Collection.(veremos Map


maisadiante).
NoJava5temosoutrainterfacefilhadeCollection:aQueue,quedefinemtodosde
entradaedesada,equeestecritrioseradefinidopelasuaimplementao(porexemplolifo,
fifoouaindaumheapondecadaelementopossuisuachavedeprioridade).

16.8 - Iterando sobre colees: java.util.Iterator


Comopercorreroselementosdeumacoleo?Seforumalista,podemossempreutilizar
umlao for,chamandoomtodo get paracadaelemento.Maseseacoleonopermitir
indexao?
Porexemplo,um Set nopossuiumafunoparapegaroprimeiro,osegundoouo
quintoelementodoconjunto...
Toda coleo fornece acesso a um iterator, um objeto que implementa a interface
Iterator,queconheceinternamenteacoleoedacessoatodososseuselementos,como
afiguraabaixomostra.

Captulo16CollectionsframeworkPgina170

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Possveisaesemumiterador:
Existe um prximo elemento na
coleo?.
Pegueoprximoelemento.
Removaoelementoatualdacoleo.

ContaCorrentec=
(ContaCorrente)iterator.next();

PrimeirocriamosumIteratorqueentranacoleo.
Acadachamadadomtodonext,oIteratorretornao
prximoobjetodoconjunto.
Umiteratorpodeserobtidocomomtodo iterator()
deCollection,porexemplo:
Iteratori=lista.iterator();
A interface Iterator possui dois mtodos principais:
hasNext() (comretornobooleano)indicaseaindaexisteum
elementoaserpercorrido;next()retornaoprximoobjeto.

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.

Voltando ao exemplo do conjunto de strings, vamos


percorreroconjunto:

//populaoconjunto
Setconjunto=newHashSet();
conjunto.add(item1);
conjunto.add(item2);
conjunto.add(item3);
//retornaoiterator
Iteratori=conjunto.iterator();
while(i.hasNext()){
//recebeapalavra
Objectelemento=i.next();
Stringpalavra=(String)elemento;

//mostraapalavra
System.out.println(palavra);

O while anteriorsterminaquandotodososelementosdoconjuntoforempercorridos,
isto,quandoomtodohasNextmencionarquenoexistemmaisitens.
Emqueordemseroacessadososelementos?
Numalista,oselementosiroaparecerdeacordocomondiceemqueforaminseridos,
isto , de acordo com o que foi prdeterminado. Em um conjunto, a ordem depende da
Captulo16CollectionsframeworkPgina171

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

implementaodainterfaceSet.
PorqueoSetentotoimportanteeusado?
ParaperceberseumitemjexisteemumalistamuitomaisrpidousarumSetdoque
umList,eosTreeSetsjvemordenadosdeacordocomascaractersticasquedesejarmos!

ListIterator
Umalistafornece,almdeacessoaumIterator,umListIterator,queoferecerecursosadicionais,
especficosparalistas.
UsandooListIteratorvocpode,porexemplo,adicionarumelementonalistaouvoltarparao
elementoquefoi"iterado"anteriormente.

16.9 - Iterando colees no java 5.0: enhanced for


PodemosutilizaramesmasintaxedoenhancedforparapercorrerqualquerCollection.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Setconjunto=newHashSet();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
//retornaoiterator
for(Objectelemento:conjunto){
Stringpalavra=(String)elemento;
System.out.println(palavra);
}
OJavavaiusaroiteratorda Collection dadaparapercorreracoleo.Sevocj
estiver usando uma coleo parametrizada, o for pode ser feito utilizando um tipo mais
especfico:

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

Set<String>conjunto=newHashSet<String>();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
//retornaoiterator
for(Stringpalavra:conjunto){
System.out.println(palavra);
}
Issopossvelporcausaqueomtodo iterator() da Collection<Tipo> devolve
umIterator<Tipo>.

16.10 - Mapas - java.util.Map


Um mapa composto de uma associao de um objeto chave a um objeto valor.
equivalenteaoconceitodedicionriousadoemvriaslinguagens.Algumaslinguagens,como
Perl ou PHP, possuem suporte nativo a mapas, onde so conhecidos como matrizes
associativas.
Eleummapapoispossvelusloparamapearumachave,porexemplo:mapeieo
valorCaelumchaveescola,oumapeieRuaVergueirochaverua.

Captulo16CollectionsframeworkPgina172

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

chaves

valores
Possveisaesemummapa:

Mapeieumachaveaumvalor
OqueestmapeadonachaveX?
Remapeieumacertachave
Querooconjuntodechaves.
Querooconjuntodevalores.
DesmapeieachaveX.

Omtodo put(Object,Object) dainterface Map recebeachaveeovalordeuma


novaassociao.Parasaberoqueestassociadoaumdeterminadoobjetochave,passase
esseobjetonomtodoget(Object).
Observe o exemplo: criamos duas contas correntes e as colocamos em um mapa
associandoasaoseudonorespectivamente.
ContaCorrentec1=newContaCorrente();
c1.deposita(10000);
ContaCorrentec2=newContaCorrente();
c2.deposita(3000);
//criaomapa
MapmapaDeContas=newHashMap();
//adicionaduaschaveseseusvalores
mapaDeContas.put("diretor",c1);
mapaDeContas.put("gerente",c2);
//qualacontadodiretor?
Objectelemento=mapaDeContas.get("diretor");
ContaCorrentecontaDoDiretor=(ContaCorrente)elemento;
Ummapa,assimcomoascolees,trabalhadiretamentecomObjects(tantonachave
quantonovalor),oquetornanecessrioocastingnomomentoquerecuperarelementos.

Captulo16CollectionsframeworkPgina173

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Suas principais implementaes so o HashMap e o


Hashtable.
Apesardomapafazerpartedoframework,elenoimplementa
a interface Collection, por ter um comportamento bem diferente.
Porm,ascoleesinternasdeummapa(adechaveseadevalores,
verFigura7)soacessveispormtodosdefinidosnainterfaceMap.
Omtodo keySet() retornaum Set comaschavesdaquele
mapa,eomtodo values() retornaa Collection comtodosos
valoresqueforamassociadosaalgumadaschaves.
Ummapaimportanteatradicionalclasse Properties,que
mapeiastringsemuitoutilizadaparaaconfiguraodeaplicaes.
Propertiesconfig=newProperties();

config.setProperty("database.login","scott");
config.setProperty("database.password","tiger");
config.setProperty("database.url","jdbc:mysql:/localhost/teste");
//muitaslinhasdepois
Stringlogin=config.getProperty("database.login");
Stringpassword=config.getProperty("database.password");
Stringurl=config.getProperty("database.url");
DriverManager.getConnection(url,login,password);
ReparequenohouveanecessidadedocastingparaStringnomomentoderecuperar
osobjetosassociados.Istoporqueaclasse Properties foidesenhadacomopropsitode
trabalharcomaassociaoentreStrings.
AProperties possuitambmmtodosparaleregravaromapeamentocombaseem
umarquivotexto,facilitandomuitoasuapersistncia.

16.11 - Mapas no Java 5.0


Assimcomoascolees,ummapanoJava5.0parametrizado.Ointeressantequeele
recebedoisparmetros:achaveeovalor:
1.ContaCorrentec1=newContaCorrente();
2.c1.deposita(10000);
3.
4.ContaCorrentec2=newContaCorrente();
5.c2.deposita(3000);
6.
7.//criaomapa
8.Map<String,ContaCorrente>mapaDeContas=new
HashMap<String,ContaCorrente>();
9.
10.//adicionaduaschaveseseusvalores
11.mapaDeContas.put("diretor",c1);
12.mapaDeContas.put("gerente",c2);
13.//qualacontadodiretor?(semcasting!)
14.ContaCorrentecontaDoDiretor=mapaDeContas.get("diretor");
Aqui,comonocasodaLista,sevoctentarcolocaralgodiferentedeStringnachavee
ContaCorrentenovalor,vaiterumerrodecompilao.
Captulo16CollectionsframeworkPgina174

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

JakartaCommonsCollections
OprojetoJakartapossuiumasriedeAPIsmenores,conhecidascomojakartacommons.
Dentreelas,existealgumasclassesdecoleesdiferentesdasencontradasnojava.util,assim
comoalgumasclassesauxiliares.
AscoleesdojakartaincluemainteressanteinterfacePredicate,ondevocpodedefiniruma
queryparaexecutarsobreumacoleo,trazendoum Iterator queiteraapenassobreos
objetosqueobedecemaopredicadodado.
Porexemplo,comumacoleodecarros,necessrioumiteratorapenasparaoscarrosverdes.
Entre outras, as Jakarta Collections possuem colees para tipos primitivos, eliminando a
necessidadedeutilizarasclasseswrapperdoJava.Tambmexisteumheapbinrio,noquala
coleo est ordenada de tal maneira que possvel obter o valor mximo (ou mnimo)
rapidamente,emtempoconstante(ouO(1)).

EqualseHashCode
Muitasdascoleesdojavaguardamosobjetosdentrodetabelasdehash.Essastabelasso
utilizadasparaqueapesquisadeumobjetosejafeirademaneirarpida.
Como funciona? Cada objeto classificado pelo seu hashCode, e com isso conseguimos
espalharcadaobjetoagrupandoospelo hashCode.Quandovoubuscardeterminadoobjeto,s
vamosprocurarentreoselementosqueestonogrupodaquelehashCode.Dentrodessegrupo
vamostestandooobjetoprocuradocomocandidatousandoequals().
Paraqueissofuncionedireito,omtodohashCodedecadaobjetodeveretornaromesmovalor
paradoisobjetosseelessoconsideradosequals.Emoutraspalavras:
a.equals(b)implicaa.hashCode()==b.hashCode()
Implementar hashCode de tal maneira que ele retorne valores diferentes para dois objetos
considerados equals quebra o contrato de Object, e resultar em collections que usam
espalhamento(como HashSet, HashMap e Hashtable)noachandoobjetosiguaisdentrode
umamesmacoleo.

Boasprticas
AscoleesdoJavaoferecemgrandeflexibilidadeaousurio.Aperdadeperformanceemrelao
autilizaodearraysirrelevante,masdevesetomaralgumasprecaues:
Grande parte das colees usam internamente uma array para armazenar os seus dados.
Quandoessaarraynomaissuficiente,criadaumamaioreocontedodaantigacopiado.
Esteprocessopodeacontecermuitasvezesnocasodevocterumacoleoquecrescemuito.
Vocdeveentocriarumacoleojcomumacapacidadegrande,paraevitaroexcesso de
redimensionamento.
Eviteusarcoleesqueguardamoselementospelasuaordemdecomparaoquandonoh
necessidade. Um TreeSet gasta computacionalmente O(log(n)) para inserir (ele utiliza uma
rvorerubronegracomoimplementao),enquantooHashSetgastaapenasO(1).

NoiteresobreumaListutilizandoumforde0atlist.size(),eusandoget(int)para
receberosobjetos.Enquantoissopareceatraente,algumasimplementaesdaListnoso
deacessoaleatriocomoaLinkedList,fazendoessecdigoterumapssimaperformance
computacional.(useIterator)
Captulo16CollectionsframeworkPgina175

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

16.12 - Exerccios
1)Crieumcdigoqueinsira100milnmerosnumaArrayListepesquiseos.Vamos
usarummtododeSystemparacronometrarotempogasto:

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.

publicclassTestaPerformance{
publicstaticvoidmain(String[]args){
System.out.println("Iniciando...");
longinicio=System.currentTimeMillis();
Collection<Integer>teste=newArrayList<Integer>();
for(inti=0;i<30000;i++){
teste.add(i);
}
for(inti=0;i<30000;i++){
teste.contains(i);
}
longfim=System.currentTimeMillis();
doubletempo=(fiminicio)/1000.0;
System.out.println("Tempogasto:"+tempo);
}
}

TroqueaArrayListporumHashSeteverifiqueotempoquevaidemorar:
Collection<Integer>teste=newHashSet<Integer>();
Adiferenamaisquegritante.Sevocpassarde30milparaumnmeromaior,como
50ou100mil,verqueissoinviabilizaportotalousodeumaListanocasoemquequeremos
pesquisarmuito.
2)(conceitual)Reparequesevocdeclararacoleoedernewassim:
Collection<Integer>teste=newArrayList<Integer>();
emvezde
ArrayList<Integer>teste=newArrayList<Integer>();
garantido que vai ter de alterar s essa linha para substituir a implementao por
HashSet. Estamos aqui usando o polimorfismo para nos proteger que mudanas de
implementaovenhamnosobrigaraalterarmuitocdigo.Maisumavez: programevoltadoa
interface,enoaimplementao!Esseum excelente exemplodebomusodeinterfaces,
afinal,dequeimportacomoalistafunciona?Oquequeremosumalista,issonossuficiente!
Esse um cdigo extremamente elegante e flexvel. Obviamente algumas vezes no
conseguimostrabalhardessaforma,eprecisamosusarumainterfacemaisespecficaoumesmo
nosreferiraoobjetopelasuaimplementaoparapoderchamarmtodosmaisespecficos(por
exemplo, TreeSet temmaismtodosqueem Set,assimcomo LinkedList emrelaoa
List).

3)(opcional)Faatestescomo Map<String,ContaCorrente>,comovistonesse
captulo.
Captulo16CollectionsframeworkPgina176

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

4) (opcional) Assim como no exerccio 1, crie uma comparao entre ArrayList e


LinkedList,paraverqualamaisrpidaparaseadicionarelementosnaprimeiraposio
(list.add(0,elemento))equalamaisrpidaparasepercorrerusandooget(indice)
(sabemosqueocorretoseriautilizaroenhancedforouoiterator).
4)(opcional)CrieumaclasseBancoquepossuilistadeConta.Reparequenumalista
deContavocpodecolocartantoContaCorrentequantoContaPoupanca.Crieummetodo
void adiciona(Conta c), um mtodo Conta pega(int x) e outro int
pegaTotalDeContas(),muitosimilararelaoanteriordeEmpresaFuncionario.
5)(opcional)CrieummtodonaclasseBancoquebuscaporumadeterminadaContae
informarseelaseencontral.
6)(opcional,avanado)Crieomtodo hashCode paraasuaconta,deformaqueele
respeitooequalsdequeduascontassaoequalsquandotemomesmonumero.Verifiquesesua
classe funciona corretamente num HashSet. Remova o mtodo hashCode. Continua
funcionando?
DominarousoeofuncionamentodohashCodefundamentalparaobomprogramador.

16.13 - Desafios
1)Geretodososnmerosentre1e1000eordeneemordemdecrescenteutilizandoum
TreeSet.
2)Geretodososnmerosentre1e1000eordeneemordemdecrescenteutilizandoum
ArrayList.

Captulo16CollectionsframeworkPgina177

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

17

17

Threads

O nico lugar onde o sucesso vem antes do trabalho no


dicionrio.
AlbertEinstein

Aotrminodessecaptulo,vocsercapazde:
executartarefassimultaneamente;
colocartarefasparaaguardarumsinal;
esperaralgunssegundosparacontinuaraexecuodeumprograma.

17.1 - Linhas de execuo


EXECUO
CONCORRENTE
RUNNABLE

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

Podemos, em Java, facilmente criar uma classe que tem um mtodo que vai ser
executadoconcorrentementecomoseumain.Paraisso,vocprecisaimplementarainterface
Runnable,quedefineomtodorun.
packagebr.com.caelum.threads;
classProgramaimplementsRunnable{
privateintid;

//colocargetteresetterproatributoid
publicvoidrun(){
for(inti=0;i<10000;i++){
System.out.println("Programa"+id+"valor:"+

i);
12.
13.
14.

}
}
}
Paravoccriaressanovalinhadeexecuo(Thread),muitosimples.

THREAD

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

packagebr.com.caelum.threads;
classTeste{
publicstaticvoidmain(String[]args){
Programap=newPrograma();
p.setId(1);
Threadt=newThread(p);
t.start();
}
}
Mas,esetivermososeguintecaso:

1.
2.
3.

packagebr.com.caelum.threads;
classTeste{
Captulo17ThreadsPgina178

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

publicstaticvoidmain(String[]args){
Programap1=newPrograma();

p1.setId(1);
Programap2=newPrograma();
p2.setId(2);
Threadt1=newThread(p1);
Threadt2=newThread(p2);
t1.start();
t2.start();
}
}
Oquevaiaparecer?Duasvezesde0a9999?Intercalado0,0,1,1....?Vocnosabe!
Vocnotemocontrole,enemsabe,quemexecutaemcadamomento.Aidiadecriar
uma Thread exatamente estar pedindo que as execues desses dois cdigos seja
concorrente,isto,noimportaaordemparavoc.Seaordemdeexecuoimportasse,voc
deveriatercolocadotudonumanicalinhadeexecuo!
Quandovocchamaavirtualmachine,elacriaumaThreadpararodaroseumain.
Evocpodeestarcriando(disparando)outras.

Dormindo
SLEEP

Para que a thread atual durma basta chamar o mtodo a seguir, por exemplo, para dormir 3
segundos:
Thread.sleep(3*1000);

17.2 - Criando uma subclasse da classe Thread


A classe Thread implementa Runnable. Ento, voc pode criar uma subclasse dela e
reescreverorun,quenaclasseThreadnofaznada.
classMinhaThreadextendsThread{
publicvoidrun(){
//cdigoaserexecutadopelaThread
}
}
Enoseumain:
MinhaThreadt=newMinhaThread();
t.start();
Apesardeserumcdigomaissimples,vocestusandoheranaapenasporfacilidade,
enoporpolimorfismo,queseriaagrandevantagem.PrefiraimplementarRunnableaherdar
deThread.

17.3 - Garbage Collector


GARBAGE
COLLECTOR

OGarbage Collector(coletordelixo,lixeiro)umaThreadresponsvelporjogarfora
todososobjetosquenoestosendoreferenciadospornenhumaoutraThread,sejadiretaou
indiretamente!

Contaconta1=newContaCorrente();
Contaconta2=newContaCorrente();
Captulo17ThreadsPgina179

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Atestemomento,sabemosquetemos2objetosemmemria.Esefizermososeguinte:
conta2=conta1;
Quantosobjetostemosemmemria?Perdemosumadasrefernciaparaumdoscarros
queforamcriados.Esseobjetojnomaisacessvel.Temosentoapenasumobjetoem
memria?
Vocnosabe!ComooGarbageCollectoruma Thread,vocnotemgarantiade
quandoelevairodar.Vocssabequealgumdiaaquelamemriavaiserliberada.

System.gc();
VocnoconseguenuncaforarqueoGarbageCollectorrode,maschamandoomtodoesttico
gcdaclasseSystem,vocestasugerindoparaqueaVirtualMachinerodeoGarbageCollector
naquelemomento.Sesuasugestovaiseraceitaouno,istodependeevocnotemgarantias.
Eviteousodestemtodo.

Finalizer
AclasseObjectdefinetambmummtodofinalize,quevocpodereescrever.Essemtodo
ser chamado no instante antes do Garbage Collector coletar este objeto. No um
destrutor! Ele nem sempre ser chamado!

17.4 - Exerccios
1) Gere diversas threads simultneas contando de 1 at 1000. Veja o interleaving
(entrelaamentodosprocessos):

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

classProgramaimplementsRunnable{

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

classTeste{
publicstaticvoidmain(String[]args){
Programap1=newPrograma();
Threadt1=newThread(p1);
t1.start();

publicvoidrun(){
for(inti=0;i<1000;i++){
System.out.println(i);
}
}
}

Programap2=newPrograma();
Threadt2=newThread(p1);
t2.start();
}
}
Aumente o nmero de ciclos caso necessrio.
2-) (Opcional) Crie cada uma das threads da seguinte maneira:

1.

classTeste{
Captulo17ThreadsPgina180

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

2.
3.
4.
5.
6.

publicstaticvoidmain(String[]args){
newThread(newPrograma()).start();
newThread(newPrograma()).start();
}
}
Como explicar o funcionamento dessa estranha sintaxe? Porque compila?

17.5 - Para saber mais: Compartilhando objetos entre Threads


O uso de Threads comea a ficar interessante e complicado quando precisamos
compartilharobjetosentrevriasThreads.
Imagineaseguintesituao:temosumBancocommilhesdeContasBancrias.Clientes
sacamedepositamdinheirocontinuamente,24horaspordia.Noprimeirodiadecadams,o
BancoprecisaatualizarosaldodetodasasContasdeacordocomumataxaespecfica.Para
issoeleutilizaoAtualizadorDeContasquevimosanteriormente.
OAtualizadorDeContas,basicamente,pegaumaaumacadaumadasmilhesdeContas
echamaseumtodoatualiza.AatualizaodemilhesdeContasumprocessodemorado,
que dura horas; invivel parar o banco por tanto tempo at que as atualizaes tenham
completado.precisoexecutarasatualizaesparalelamentesatividadesnormaisdobanco,
dedepsitosesaques.
Ouseja,teremosvriasthreadsrodandoparalelamente.Emumathread,pegamostodas
as contas e vamos chamando o mtodo atualiza de cada uma. Em outra, podemos estar
sacandooudepositandodinheiro.Estamoscompartilhandoobjetosentremltiplasthreads(as
contas,nonossocaso).
Agoraimagineaseguintepossibilidade(mesmoquemuitoremota):noexatoinstanteem
queoatualizadorestatualizandoumaContaX,oclientedonodestaContaresolveefetuarum
saque.Comosabemos,aotrabalharcomThreads,oescalonadorpodepararumacertaThread
aqualquerinstanteparaexecutaroutra,evocnotemcontrolesobreisso.
VejaessaclasseConta:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

publicclassConta{
privatedoublesaldo;
//outrosmetodoseatributos...
publicvoidatualiza(doubletaxa){
doublesaldoAtualizado=this.saldo*(1+taxa);
this.saldo=saldoAtualizado;
}
publicvoiddeposita(doublevalor){
doublenovoSaldo=this.saldo+valor;
this.saldo=novoSaldo;
}
}
Imagine uma Conta com saldo de 100 reais. Um cliente entra na agncia e faz um
depsitode1000reais.IssodisparaumaThreadnobancoquechamaomtododeposita();ele
comeacalculandoonovoSaldoquepassaaser1100(linha13).Squeporalgummotivoque
desconhecemos,oescalonadorpraessathread.
Captulo17ThreadsPgina181

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Neste exato instante ele comea a executar uma outra Thread que chama o mtodo
atualizadamesmaConta,porexemplo,comtaxade1%.IssoquerdizerqueonovoSaldopassa
avaler101reais(linha8).E,nesseinstanteoescalonadortrocadeThreadsnovamente.Agora
eleexecutaalinha14naThreadquefaziaodepsito;osaldopassaavaler1100.Acabandoo
deposita,oescalonadorvoltapraThreaddoatualizaeexecutaalinha9,fazendoosaldovaler
101reais.
Resultado:odepsitodemilreaisfoitotalmenteignoradoeseuClienteficarpoucofeliz
comisso.Percebaquenopossveldetectaresseerro,jquetodoocdigofoiexecutado
perfeitamente,semproblemas.OproblemaaquifoioacessosimultneodeduasThreadsao
mesmoobjeto.

THREAD
SAFE

EoerrosocorreuporqueoescalonadorparounossasThreadsnaquelesexatoslugares.
Podeserquenossocdigofiquerodando1anosemdarproblemaalgumeemumbelodiao
escalonadorresolvealternarnossasThreadsdaquelaforma.Nosabemoscomooescalonador
secomporta!Temosqueprotegernossocdigocontraessetipodeproblema.Dizemosqueessa
classenothreadsafe,isso,noestprontaparaterumainstnciautilizadaentrevrias
threadsconcorrentemente.
OquequeramoseraquenofossepossvelalgumatualizaraContaenquantooutra
pessoaestdepositandoumdinheiro.QueramosqueumaThreadnopudessemexeremuma
Conta enquanto outra Thread est mexendo nela. Queramos que a execuo dos mtodos
fosse atmica;quesuaexecuonopudesseserinterrompidaporoutraThreadquefosse
acessarumoutromtodoquemexecomosmesmosrecursosqueestes.Nohcomoimpediro
escalonadordenossubstituir,entooquefazer?
Umaidiaseriacriarumatrava,enomomentoemqueuma Thread entrasseemum
dessesmtodos,trancassecomumachaveaentradaparaeles,dessamaneira,mesmoque
sendocolocadadelado,nenhumaoutraThreadpoderiaentrarnessesmtodos,poisachave
estariacomaoutraThread.

LOCK

Podemos fazer isso em Java. Podemos usar qualquer objeto como um lock (trava,
chave),parapodersincronizaremcimadesseobjeto,isto,seumaThreadentraremumbloco
quefoidefinidocomosincronizadoporesselock,apenasumaThreadpoderestarldentroao
mesmotempo,poisachaveestarcomela.
Apalavrachave synchronized dessacaractersticaaumblocodecdigo,erecebe
qualoobjetoqueserusadocomochave.Achavesdevolvidanomomentoemquea
Thread quetinhaessachavesairdobloco,sejaporreturn oudisparodeumaexceo(ou
aindanautilizaodomtodowait())..

SYNCHRONIZED

QueremosentobloquearoacessosimultneoaumamesmaConta:
1.public class Conta {
2.
3.
private double saldo;
4.
5.
// outros metodos e atributos...
6.
7.
public void atualiza(double taxa) {
8.
synchronized (this) {
9.
double saldoAtualizado = this.saldo * (1 + taxa);
10.
this.saldo = saldoAtualizado;
11.
}
12.
}
13.
Captulo17ThreadsPgina182

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

14.
15.
16.
17.
18.
19.
20.
21.}

public void deposita(double valor) {


synchronized (this) {
double novoSaldo = this.saldo + valor;
this.saldo = novoSaldo;
}
}

Observeousodosblocossynchronizeddentrodosdoismtodos.Elesbloqueiamuma
ThreadutilizandoomesmoobjetoConta,othis.
Esses mtodos agora so mutuamente exclusivos, e s executam de maneira
atmica.Threadstentandopegarumlockquejestpego,ficaroemumconjuntoespecial
esperandopelaliberaodolock(nonecessariamentenumafila).

Sincronizandooblocointeiro
comumsempresincronizarmosummtodointeiro,enormalmenteemcimadothis.
publicvoidmetodo(){
synchronized(this){
//conteudodometodo
}
}
Paraisto,existeumasintaxemaissimples:
publicsynchronizedvoidmetodo(){
//conteudodometodo
}
Detalhe: se o mtodo for esttico, ser sincronizado usando o lock do objeto da classes
(NomeDaClasse.class).

17.6 - Para saber mais: Vector e Hashtable


DuascollectionsmuitofamosassoVectoreHashtable,adiferenadelascomsuas
irmsArrayListeHashMapqueasprimeirassothreadsafe.
Vocpodeseperguntarporquenousamossempreessasclassesthreadsafe.Adquirir
umlocktemumcusto,ecasoumobjetonovaserusadoentrediferentesthreads,noh
porqueusaressasclassesqueconsomemmaisrecursos.Masnemsemprefcilenxergarse
devemossincronizarumbloco,ousedevemosutilizarblocossincronizados.
Antigamenteocustodeseusarlockseraaltssimo,hojeemdiaissocustapoucoparaa
JVM,masnomotivoparavocsincronizartudosemnecessidade.

17.7 - Um pouco mais...


1)Vocpodemudaraprioridadedecadaumadesuas Threads,masistotambm
apenasumasugesto.
2)ExisteummtodostopnasThreads,porquenoboaprticachamlo?
3)Umtpicomaisavanadoautilizaodewait,notifiyenotifyAllparaque
asThreadscomuniquemsedeeventosocorridos,indicandoquepodemounopodemavanar
deacordocomcondies
Captulo17ThreadsPgina183

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Captulo17ThreadsPgina184

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

18

E agora?

18

A primeira coisa a entender que voc no entende.


SorenAabyeKierkegaard

Ondecontinuaraoterminaro'JavaeOrientaoaObjetos'.

18.1 - Exerccio prtico


Amelhormaneiraparafixartudooquefoivisto noscaptulosanterioresplanejare
montarpequenossistemas.
Um exerccio simples terminar o sistema do Pet Shop permitindo aos usurios
compraremitensapartirdalinhadecomando.
Outro sistema que pode ser atualizado o de controle de trens, cidades e malha
rodoviria.

18.2 - Certificao
Entraremdetalhesnosassuntoscontidosatagorairiamnomnimotornarcadacaptulo
quatrovezesmaiordoquej.
Ostpicosabordados(comaadioeremoodealguns)constituemboapartedoque
cobradonacertificaooficialparaprogramadoresdaSun.
ParamaioresinformaessobrecertificaesconsulteaprpriaSun,ojavaranch.comou
oguj.com.brquepossuidiversasinformaessobreoassunto.ACaelumofereceumcursode
preparaoparaaprovadecertificaocomoprogramadoremJavadaSun.

18.3 - Web
UmdosprincipaisfocosdeJavahojeemdiaondeamaiorpartedasvagasexistem:
programandoparaaweb.
Umcursodeservletsejspbasta,enquantoiradianteeverDesignPatterns,XML,acesso
controladoabancodedadoseoutrostornaumaprendizemmestre.

18.4 - J2EE
Apsfocaroconhecimentoetreinartudooquefoiaprendidopodeserumaboaidia
partirparaopadroJ2EE...J2EEusatudoquevimosaqui,eapenasumgrandeconjuntode
especificaes.

18.5 - Frameworks
Captulo18Eagora?Pgina185

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Diversos frameworks foram desenvolvidos para facilitar o trabalho de equipes de


desenvolvimento.
Aqueles que pretendem trabalhar com Java devem a qualquer custo analisar as
vantagensedesvantagensdamaiorpartedessesframeworksquediminuemonmerodelinha
decdigonecessriasefacilitamocontroleeorganizaodeumaaplicao.
Porexemplo,ovRaptorumexemplodecontroladorsimplesebomparainiciantes.O
Hibernateumtimopasso,assimcomooprevayler,parapersistncia/prevalnciadeobjetos.

18.6 - Revistas
Diversasrevistas,noBrasilenoexterior,estudamomundojavacomoningumepodem
ajudaroinicianteaconhecermuitodoqueestacontecendolforanasaplicaescomerciais.

18.7 - Grupo de Usurios


Diversosprogramadorescomomnimooumximodeconhecimentoserenemonline
paraatrocadedvidas,informaeseidiassobreprojetos,bibliotecasemuitomais.Umdos
maisimportantesefamososnoBrasiloGUJwww.guj.com.br

18.8 - Falando em Java


O'FalandoemJava'noparaporaqui,continuacomocursodeJavaDistribudoincluindo
web,sockets,rmi,ejb,jmsemuitomais...
Consulteositeoficialdo'FJ'emwww.caelum.com.brpararecebermaisinformaes.
Os autores dessa edio, Paulo Eduardo Azevedo Silveira e Guilherme de Azevedo
Silveira agradecem ao leitor pelo tempo investido e esperam ter ajudado a converter mais
algumparaomundodaorientaoaobjetos.

Captulo18Eagora?Pgina186

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

19

19

Apndice A - Sockets
Olho por olho, e o mundo acabar cego.
MohandasGandhi

Conectandoseamquinasremotas.

19.1 - Motivao: uma API que usa os concetios aprendidos


NestecaptulovocvaiconheceraAPIdeSocketsdojava,pelopacotejava.net.
Mais til que conhecer a API, voc perceber que estamos usando aqui todos os
conceitos e bibliotecas aprendidas durantes os outros captulos. Repare tambm que
relativamente simples aprender a utilizar uma API, agora que temos todos os conceitos
necessriosparatal.
Lembresedefazeresseapndicecomojavadocabertoaoseulado.

19.2 - Protocolo
TCP

Danecessidadededoiscomputadoressecomunicarem,surgiramdiversosprotocolosque
permitissemtaltrocadeinformao:oprotocoloqueiremosusaraquio TCP (Transmission
ControlProtocol).
AtravsdoTCPpossvelcriarumfluxoentredoiscomputadorescomomostradono
diagramaabaixo:
Servidor
Aplicao
Cliente

Fluxo

Aplicao
Cliente

Fluxo

Aplicao
Cliente

Fluxo

Exemplos:
Bancode
dados
Webserver
Servidorde
icq
Central
bancria

Captulo19ApndiceASocketsPgina187

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

possvelconectarmaisdeumclienteaomesmoservidor,comoocasodediversos
bancodedados,webserversetc.
Ao escrever um programa em Java que se comunique com outra aplicao, no
necessriosepreocuparcomumnveltobaixoquantooprotocolo.Asclassesquetrabalham
comelesjforamdisponibilizadasparaseremusadaspornsnopacotejava.net.
AvantagemdeseusarTCPemvezdecriarnossoprprioprotocolosdebytesqueo
TCPvaigarantiraentregadospacotesquetransferirmos,ecriarumprotocolobaseparaisto
algobemcomplicado.

19.3 - Porta
Acabamosdemencionarquediversoscomputadorespodemseconectaraums,masna
realidademuitocomumencontrarmquinasclientescomumasconexofsica.Entocomo
possvelseconectaradoispontos?Comopossvelserconectadopordiversospontos?
Todos as aplicaes que esto enviando e recebendo dados fazem isso atravs da
mesmaconexofsicamasocomputadorconseguediscernirduranteachegadadenovosdados
quaisinformaespertencemaqualaplicao,mascomo?

Cliente
Firefox1.0

Fluxo

Cliente
Opera7.54

Fluxo

ServidorWeb
ip10.0.0.1
porta80

PORTA

Assim como existe o IP para indentificar uma mquina, a porta a soluo para
indentificardiversasaplicaesemumamquina.Estaportaumnmerode2bytes,varia de
0 a 65535. Se todas as portas de uma mquina estiverem ocupadas no possvel se
conectaraelaenquantonenhumaforliberada.
Aoconfigurarumservidorpararodarnaporta80(padrohttp),possvelseconectara
esseservidoratravsdessaporta,quejuntocomoipvaiformaroendereodaaplicao.Por
exemplo,oservidorwebdacaelum.com.brpodeserrepresentadopor:
caelum.com.br:80

19.4 - Socket
Mas se um cliente se conecta a um programa rodando na porta 80 de um servidor,
enquantoelenosedesconectardessaportaserimpossvelqueoutrapessoaseconecte?
Acontecequeaoefetuaraconexo,aoaceitaraconexo,oservidorredirecionaocliente
deumaportaparaoutra,liberandonovamentesuaportainicialepermitindoqueoutrosclientes
seconectemnovamente.

Captulo19ApndiceASocketsPgina188

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Cliente
Firefox
1.0

Cliente
Opera
7.54

Iniciandona
porta80

ServidorWeb
ip10.0.0.1
porta80

Continua
emoutra

EmJava,issodeveserfeitoatravsdethreadseoprocessodeaceitaraconexodeve
serrodadoomaisrpidopossvel.

19.5 - Servidor
Iniciandoagoraummodelodeservidordechat,oserviodocomputadorquefunciona
comobasedeveprimeiroabrirumaportaeficarouvindoatalgumtentarseconectar.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.

importjava.net.*;
publicclassServidor{
publicstaticvoidmain(Stringargs[]){
try{
ServerSocketservidor=newServerSocket(10001);
System.out.println("Porta10001aberta!");
//acontinuaodoservidordeveserescritaaqui
}catch(IOExceptione){
System.out.println("Ocorreuumerronaconexo");
e.printStackTrace();
}
}
}
Seoobjetoforrealmentecriadosignificaqueaporta10001estavafechadaefoiaberta.
Seoutroprogramapossuiocontroledestaportanesteinstante,normalqueonossoexemplo
nofuncionepoiselenoconsegueutilizarumaportaquejestemuso.
Apsabrira porta, precisamos esperar porumcliente atravs domtodo accept da
ServerSocket.Assimqueumclienteseconectaroprogramaircontinuar,porissodizemos
queessemtodoblocante,seguraathreadatquealgoonotifique.

Socketcliente=servidor.accept();
System.out.println("Novaconexocomocliente"+
cliente.getInetAddress().getHostAddress()
);
Porfim,bastalertodasasinformaesqueoclientenosenviar:
BufferedReaderin=newBufferedReader(
newInputStreamReader(cliente.getInputStream()));
while(true){
Captulo19ApndiceASocketsPgina189

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Stringlinha=in.readLine();
if(linha==null){
break;
}
System.out.println(linha);
}
Agorafechamosasconexes,comeandopelofluxo:
in.close();
cliente.close();
servidor.close();
Oresultadoaclasseaseguir:
1.importjava.net.*;
2.
3.
publicclassServidor{
4.
5.
publicstaticvoidmain(Stringargs[]){
6.
try{
7.
//criaumservidor
8.
ServerSocketservidor=newServerSocket(10001);
9.
System.out.println(Porta10001aberta!);
10.
11.
//aceitaumaconexo
12.
Socketcliente=servidor.accept();
13.
System.out.println("Novaconexocomocliente"+
14.
cliente.getInetAddress().getHostAddress()
15.
);
16.
17.
//criaobufferdeleitura
18.
BufferedReaderin=newBufferedReader(
19.
new
InputStreamReader(cliente.getInputStream())
20.
);
21.
22.
//lateofim
23.
while(true){
24.
Stringlinha=in.readLine();
25.
if(linha==null){
26.
break;
27.
}
28.
System.out.println(linha);
29.
}
30.
31.
//fechatudo
32.
in.close();
33.
cliente.close();
34.
servidor.close();
35.
36.
}catch(IOExceptione){
37.
38.
//emcasodeerro
39.
System.out.println("Ocorreuumerronaconexo");
40.
e.printStackTrace();
41.
}
42.
}
43.
}
Captulo19ApndiceASocketsPgina190

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

19.6 - Cliente
Agoraanossatarefacriarumprogramaclientequeenviemensagensparaoservidor...
oclienteaindamaissimplesqueoservidor.
Ocdigoaseguiraparteprincipaletentaseconectaraumservidornoip127.0.0.1
(mquinalocal)eporta10001.
Oprimeiropassoqueabriraportaeprepararparalerosdadosdoclientepodeserfeito
atravsdoprogramaaseguir:
1.
importjava.net.*;
ClientedeChat
2.
3.
publicclassCliente{
Conecta
4.
Leescreve
5.
publicstaticvoidmain(Stringargs[]){
Fechaaconexo
6.
7.
try{
8.
//conectaaoservidor
9.
Socketcliente=newSocket("127.0.0.1",10001);
10.
System.out.println("Oclienteseconectouao
servidor!");
11.
12.
//preparaparaaleituradalinhadecomando
13.
BufferedReaderin=newBufferedReader(
14.
newInputStreamReader(System.in)
15.
);
16.
17.
/*inserirorestodoprogramaaqui*/
18.
19.
//fechatudo
20.
cliente.close();
21.
22.
}catch(Exceptione){
23.
24.
//emcasodeerro
25.
System.out.println("Ocorreuumerronaconexo");
26.
e.printStackTrace();
27.
28.
}
29.
}
30.
}
Agorabastaleraslinhasqueousuriodigitaratravsdobufferdeentrada(in)ejoglas
nobufferdesada:
PrintWriterout=newPrintWriter(cliente.getOutputStream,true);
while(true){
Stringlinha=in.readLine();
out.println(linha);
}
out.close();
Paratestarosistema,precisamosrodarprimeirooservidorelogodepoisocliente.Tudoo
quefordigitadonoclienteserenviadoparaoservidor.

Multithreading
Paraqueoservidorsejacapazdetrabalharcomdoisclientesaomesmotemponecessriocriar

Captulo19ApndiceASocketsPgina191

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

umathreadlogoapsexecutaromtodoaccept.
Athreadcriadaserresponsvelpelotratamentodessaconexo,enquantooloopdoservidorir
disponibilizaraportaparaumanovaconexo:
while(true){
Socketcliente=servidor.accept();
//criaumobjetoqueirtrataraconexo
TratamentoClasstratamento=newTratamentoClass(cliente);
//criaathreademcimadesteobjeto
Threadt=newThread(tratamento);
//iniciaathread
t.start();
}

19.7 - Imagem geral

AsocketdoclientetemumInputStreamquerecebedoOutputStreamdoservidor,etem
umOutputStreamquetransferetudoparaoInputStreamdoservidor.Muitoparecidocomum
telefone!
Reparequeclienteeservidorsortulosqueindicamumestado.Ummicro(oumelhor,
umaJVM)podeserservidornumcaso,maspodeserclienteemoutrocaso.

19.8 - Exerccios
1)Implementeosistemadechatentreumclienteeservidor

19.9 - Desafios
1)Altereosistemaparacriarumservidoreclientesdechatdeverdade,quemostreas
mensagensemtodososclientes.Dica:vocpodeutilizarumalistadeusuriosconectadosao
sistema,guardandoseusOutputStreams.

Captulo19ApndiceASocketsPgina192

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

19.10 - Soluo do sistema de chat


Umasoluoparaosistemadechatclienteservidor,semmltiplosclientes.Usamosa
prpriaThreadquerodaomainparaescrevertudoquefoidigitado,ecriamosumaoutrapra
ficarlendodasocketeimprimindonoconsole.
Reparequeasoluonoestnemumpoucoelegante:omainjfaztudo,almdeno
tratarmosasexceptions.OcdigovisaapenasamostrarousodeumaAPI.umapssima
prticacolocartodaafuncionalidadedoseuprogramanomainetambmdejogarexeespara
trs.
Nestalistagemfaltamosdevidosimports.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

publicclassLeitorimplementsRunnable{
privateScannerentrada;
publicLeitor(InputStreamstream){
this.entrada=newScanner(stream);
}
publicvoidrun(){
while(entrada.hasNextLine()){
System.out.println(entrada.nextLine());
}
}
}

1.
publicclassCliente{
2.
3.
publicstaticvoidmain(Stringargs[])throwsIOException{
4.
5.
Socketsocket=newSocket(127.0.0.1,10001);
6.
System.out.println(Oclienteseconectouaoservidor!);
7.
8.
//criandoleitorquevailerdasocketeimprimirno
console
9.
Leitorleitor=newLeitor(socket.getInputStream());
10.
newThread(leitor).start();
11.
12.
Scannerteclado=newScanner(System.in);
13.
PrintStreamsaida=new
PrintStream(socket.getOutputStream());
14.
15.
//lendodotecladoeescrevendonasocket
16.
while(teclado.hasNextLine(){
17.
saida.println(teclado.nextLine());
18.
}
19.
}
20.
21.}

1.publicclassServidor{
2.
//codigodoservidormuitoparecido!Samaneiradeobter
3.
//aSocketquemuda
4.
//Podemosatreaproveitalosemcopiarecolar.Comofazerisso?
5.
6.
publicstaticvoidmain(Stringargs[])throwsIOException{
7.
ServerSocketserverSocket=newServerSocket(10001);
Captulo19ApndiceASocketsPgina193

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.}

Socketsocket=serverSocket.accept();
System.out.println(Servidorrecebeuconexaodocliente);
//criandoleitorquevailerdasocketeimprimirnoconsole
Leitorleitor=newLeitor(socket.getInputStream());
newThread(leitor).start();
Scannerteclado=newScanner(System.in);
PrintStreamsaida=newPrintStream(socket.getOutputStream());
//lendodotecladoeescrevendonasocket
while(teclado.hasNextLine(){
saida.println(teclado.nextLine());
}
}

Captulo19ApndiceASocketsPgina194

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

20

Apndice B Swing bsico

20

Se eu enxerguei longe, foi por ter subido nos ombros de


gigantes.
IsaacNewton

UtilizandoaAPIdoSiwngparafazerintrefacesgrficasemJava

20.1 - Interfaces grficas em Java


AtualmenteoJavasuportaoficialmentedoistiposdebibliotecasgrficas:AWTeSwing.
AWTfoiaprimeiraAPIparainterfacesgrficasasurgirnoJava,tendosidosuperadadepois
peloSwing(apartirdoJava1.2),quepossuidiversosbenefciosemrelaoaseuantecessor.
Asbibliotecasgrficassobastantesimplesnoquedizrespeitoaconceitosnecessrios
parauslas:todoestecursodeJavaeOrientaoaObjetosjcapacitaoalunototalmentea
estudaressasbibliotecas(eoutras).
AcomplexidadenoaprendizadodeinterfacesgrficasemJavaresidenotamanhodas
bibliotecasenoenormemundodepossibilidades;issopodeassustarnumprimeiromomento.
AWTeSwingsobibliotecasgrficasoficiais,includasemqualquerJREouJDK.Alm
destas, existem algumas outras bibliotecas de terceiros, sendo a mais famosa o SWT,
desenvolvidopelaIBMeutilizadanoEclipseeemvriosprodutos.

20.2 - Portabilidade
AsAPIsdeinterfacegrficadoJavafavorecemaomximoolemadeportabilidadeda
plataforma Java. O lookandfeel do Swing nico em todas as plataformas onde roda
(Windows,Linux...);issoquerdizerqueaaplicaoterexatamenteamesmainterface(cores,
tamanhosetc).
GrandepartedacomplexidadedasclassesemtodosdoSwingestnofatodaAPIter
sido desenvolvida tendo em mente o mximo de portabilidade possvel. Favorecese, por
exemplo,oposicionamentorelativodecomponentesemdetrimentodousodeposicionamento
relativoquepoderiaprejudicarusurioscomresoluesdeteladiferentesdaprevista.
Com Swing, no importa qual sistema operacional, qual resoluo de tela ou qual
profundidadedecores:suaaplicaosecomportardamesmaformaemtodososambientes.

20.3 - Comeando com Swing


AbibliotecadoSwingesttodanopacotejavax.swing(excetoapartedeacessibilidade
queestemjavax.accessibility).
Um primeiro exemplo com Swing pode ser a exibio de uma janela de mensagem
contendo algum texto. Vamos usar para isso a classe JoptionPane, que possui um mtodo
Captulo20ApndiceBSwingbsicoPgina195

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

estticochamadoshowMessageDialog.
package br.com.caelum.fj11.swing;
import javax.swing.JOptionPane;
public class OlaSwing {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "Ola Swing!");
}
}
Issoexibiraseguintetela:

O primeiro argumento recebido pelo mtodo showMessageDialog indica qual o


componentepai(nonossocaso,nullporquenotemosmaiscomponentes);eosegundoindica
amensagemaserexibida.Houtromtodosobrecarregadoondesepodeconfigurarottuloda
janela,otipodemensagemouatoconeaserexibido.
NestaclasseJoptionPane,haindaoutrosmtodosparaexibirjanelasdeconfirmao
(Ok/Cancelar)ejanelasparaentradadedadospelousurio(input).

20.4 - Nosso primeiro formulrio


Amaioriadasaplicaesgrficasdomundotm,emalgummomento,algumformulrio
paraentradadedados.VamoscriarentoumformulriobemsimplesutilizandoSwing.
AAPIdoSwingtrazumasriedecomponentesvisuaisprontosparauso.Socamposde
texto, botes, checkboxes, labels, tabelas, rvores e muitos outros. Para comear nosso
formulrioiremosusardoiscomponentes:umcampodetexto(JTextField)eumaetiqueta/label
(JLabel):
// O JLabel recebe o texto a ser exibido
JLabel label = new JLabel("Seu nome:");
// O JTextField recebe o tamanho do campo
JTextField textField = new JTextField(20);
TodocomponenteSwingdeveseradicionadoaumcontiner(Container)queadministrar
oagrupamentoeexibiodosmesmos.Usaremosocontainermaiscomum,umJpanel(algo
comoumpaineldecomponentes).Atravsdeseumtodoaddconseguimosadicionarnossos
componentes:
// Cria um JPanel (container)
JPanel panel = new JPanel();
// adiciona os componentes
panel.add(label);
panel.add(textField);
Captulo20ApndiceBSwingbsicoPgina196

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Porltimo,paraexibirmosnossoformulriosimples,precisamoscolocarnossoJpanelem
umajanela.UsaremosaclasseJFrame,querepresentaumajanelasimples.
// Criamos um JFrame passando o ttulo da janela
JFrame frame = new JFrame("Meu primeiro formulrio");
// Adicionamos nosso JPanel
frame.add(panel);
// Preparamos o JFrame para exibio
frame.pack();
frame.setVisible(true);
Omtodopack()deJFrame,chamadoacima,servepararedimensionarnossoframepara
um tamanho adequado baseado nos componentes que ele tem. E o setVisible recebe um
booleanindicandosequeremosqueajanelasejavisvelouno.
Vamosapenasadicionarumltimocomandoqueindicaaonossoframequeaaplicao
deveserterminadaquandoousuriofecharajanela.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Noexemplocompletoabaixo,colocamostodasasvariveiscomoatributosecriamosum
mtodochamadomontaFormulariocomtodoocdigoexplicadoantes.Nomtodomain,criamos
umnovoFormularioechamamosomtodomontaFormulario():
package br.com.caelum.fj11.swing;
import javax.swing.*;
public class Formulario {
private JLabel label;
private JTextField textField;
private JPanel panel;
private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
panel = new JPanel();
panel.add(label);
panel.add(textField);
frame = new JFrame("Meu primeiro formulrio");
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {


new Formulario().montaFormulario();
}
Aorodaresteprograma,teremosaseguintetelaparadigitaodonome:
Captulo20ApndiceBSwingbsicoPgina197

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

20.5 - Adicionando eventos


OformulrioanterioratqueinteressanteparacomearaaprenderSwing,masele
totalmenteintil,nofaznada.Queremossercapazesderecuperarovalordigitadopelousurio
paraefetuaralgumaoperao(salvarnobancodedados,exibir,enviarviarede,mandarum
emailetc).
Parafazermosefetivamentealgumacoisa,trabalhamoscomeventosquesodisparados
pelousurio.OSwingpossuiumaformamuitoelegantedetrabalharcomeventos(atravsde
interfaces).Ousuriopodedisparareventosaodigitar,aoclicar,aopassaromouseemuitas
outrassituaes.
Nonossoformulrio,usaremosumboto(componente)que,quandoclicadopelousurio
(evento), disparar um mtodo (tratador/handler). Neste mtodo, vamos recuperar o texto
digitadopelousurioeefetuaralgumaao.
OcomponenteSwingquerepresentaumbotooJbutton.Precisamocriarumbotaoe
coloclononossocontainer(oJPanel):
// cria o JButton passando o texto do botao
JButton button = new JButton("Exibir");
// adiciona o botao ao JPanel
panel.add(button);
Issoacrescentarobotoaoformulrio,mascomodispararummtodoquandooboto
for clicado? O Swing nos traz o conceito de Listeners (ouvintes), que so interfaces que
implementamoscommtodosparaseremdisparadosporeventos.
Nonossocaso,parafazerummtododispararaocliquedoboto,usamosainterface
ActionListener.EssainterfacenosdummtodoactionPerformed:
public void actionPerformed(ActionEvent e) {
// implementao aqui...
}
Vamos fazer ento nossa prpria classe formulrio implementar essa interface e esse
mtodo.Queremos,quandoobotoforclicado,pegarotextodigitadopelousurioeexibirna
tela(vamosusaroJOptionPaneparaisso).NossomtodoactionPerformedficadestaforma:
public void actionPerformed(ActionEvent e) {
// pega o texto do JTextField
String texto = textField.getText();

// exibe usando o JOptionPane


JOptionPane.showMessageDialog(frame, texto);
// aqui usamos o frame como componente pai do messageDialog
O ltimo detalhe que falta indicar que essa ao (esse ActionListener) deve ser

Captulo20ApndiceBSwingbsicoPgina198

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

disparado quando o boto for clicado. Fazemos isso atravs do mtodo addActionListener
chamadonoboto.ElerecebecomoargumentoumobjetoqueimplementaActionListener(no
nossocaso,oprprioFormulario,othis):
button.addActionListener(this);
Ocdigofinaldenossoformulriodeveestarassim:
public class Formulario implements ActionListener {
private JLabel label;
private JTextField textField;
private JButton button;
private JPanel panel;
private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
button = new JButton("Exibir");
button.addActionListener(this);
panel = new JPanel();
panel.add(label);
panel.add(textField);
panel.add(button);
frame = new JFrame("Meu primeiro formulario");
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
String texto = textField.getText();
JOptionPane.showMessageDialog(frame, texto);
}
public static void main(String[] args) {
new Formulario().montaFormulario();
}
}
Aorodaresseprograma,vocvernossoformulriocomumlabel,umcampodetextoe
umboto.Depoisdedigitaralgo,aoclicarnoboto,vocverumamensagemcomotextodo
campodetexto:

Captulo20ApndiceBSwingbsicoPgina199

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

20.6 - Gerenciadores de Layout


Quando adicionamos novos componentes, como o Java saber onde posicionlos?
Porquesempresoadicionadosdoladodireito?Seredimensionamosatela(teste)oselementos
fluemparaalinhadebaixo,porque?
EssaseoutrasperguntassorespondidaspeloLayoutManager,ogerenciadordelayout
do Swing. O Java vem com uma srie de Layouts diferentes, que determinam como os
elementos sero dispostos na tela, seus tamanhos preferenciais, como eles se comportaro
quandoajanelaforredimensionadaemuitosoutrosaspectos.
AoescreverumaaplicaoSwingvocdeveindicarqualoLayoutManagerquedeseja
utilizar.Porpadro,utilizadooFlowLayoutqueespecificajustamentequeoselementosdevem
serjustapostos,queelesdevemfluirumparabaixodooutroquandoatelaforredimensionada
eetc.
Poderamos usar um outro Layout Manager como o GridLayout, por exemplo. Nossa
aplicaoficariadaseguinteforma:

Note como os elementos parecem estar dispostos em uma grade (um grid). Ao
redimensionar essa tela, por exemplo, os elementos no fluem como antes; eles so
redimensionadosparaseadaptaremaonovotamanhodogrid.
Ouainda,usandooBoxLayoutpeloeixoy:

HumasriedeLayoutManagersdisponveisnoJava,cadaumcomseucomportamento
especfico. H inclusive Layout Managers de terceiros (nooficiais do Java) que voc pode
baixar; o projeto Jgoodies, por exemplo, tem um excelente Layout Manager otimizado para
trabalharcomformulrios,oFormLayout.
ParasabermaissobreLayoutManagers,quaissoecomousarcadaumdeles,consulte
adocumentaodoSwing.

20.7 - Look And Feel


LookandFeel(ouLaF)onomequesedcaradaaplicao(suascores,formatos
Captulo20ApndiceBSwingbsicoPgina200

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

eetc).Porpadro,oJavavemcomumlookandfeelprprioquesecomportaexatamenteda
mesmaformaemtodasasplataformassuportadas.
Massvezesessenooresultadodesejado.Quandorodamosnossaaplicaono
Windoews,porexemplo,bastantegritanteadiferenaemrelaoaovisualdasaplicaes
nativas.Porissopossvelalterarqualolookandfeelaserusadoemnossaaplicao.
AlmdopadrodoJava,oJRE5daSunaindatrazLaFnativosparaWindowseMacOS,
almdoMotifeGTK.E,foraesses,vocaindapodebaixardiversosLaFnaInternetouat
desenvolveroseuprprio.
Veja esses screenshots da documentao do Swing mostrando a mesma aplicao
rodandocom4LaFdiferentes:

20.8 - Para saber mais


1)ConsultarojavadocdoSwingpodenosermuitosimples.PorissoaSundisponibiliza
umtimotutorialonlinesobreSwingemseuSite:
http://java.sun.com/docs/books/tutorial/uiswing/
2)Existemalgunsbonseditoresvisuais(DragandDrop)parasetrabalharcomSwing,
entreprodutoscomerciaiselivres.Destaquepara:
Matisse,quevemembutidonoNetbeanseconsideradohojeomelhoreditor
VEP(VisualEditorPlugin),umpluginquepodeserinstaladonoEclipse
3)AplicaesgrandescomSwingpodemganharumacomplexidadeenormeeficarem
difceis de manter. Alguns projetos tentam minimizar esses problemas; h, por exemplo, o
famosoprojetoThinletondevocpodeutilizarSwingescrevendosuasinterfacesgrficasem
XML.

Captulo20ApndiceBSwingbsicoPgina201

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

21

21

Apndice C - Mais java


Se eu enxerguei longe, foi por ter subido nos ombros de
gigantes.
IsaacNewton

Diversosdepequenosdetalhesquenovimosnodecorrerdocurso,masquesoimportantes
nodiaadia.

21.1 - Import Esttico


Algumasvezes, escrevemosclassesquecontmmuitosmtodoseatributosestticos
(finais,comoconstantes).Essasclassessoclassesutilitrias,eprecisamossemprenosreferir
aelasantesdechamarummtodoouutilizarumatributo:
importpacote.ClasseComMetodosEstaticos;
classUsandoMetodosEstaticos{
voidmetodo(){
ClasseComMetodosEstaticos.metodo1();
ClasseComMetodosEstaticos.metodo2();
}
}
STATIC
IMPORT

Comeaaficarmuitochatodeescrevertodahoraonomedaclasse.Pararesolveresse
problema, no Java 5.0 foi introduzido o static import, que importa mtodos e atributos
estticosdequalquerclasse.Usandoessanovatcnica,vocpodeimportarosmtodosdo
exemploanterioreuslosdiretamente:
importstaticpacote.ClasseComMetodosEstaticos.*;
classUsandoMetodosEstaticos{
voidmetodo(){
metodo1();
metodo2();
}
}
Apesar de voc ter importado todos os mtodos e atributos estticos da classe
ClasseComMetodosEstaticos,aclasseemsinofoiimportada,esevoctentassedernew,
porexemplo,elenoiaconseguirencontrla,precisandodeumimportnormalaparte.
Umbomexemplodeusosoosmtodoseatributosestticosdaclassedematemtica
doJava.
importstaticjava.lang.Math.*;
classTesteMatematico{
doubleareaDaCircunferencia(doubleraio){
returnPI*raio*raio;//usamosPIaoinvsdeMath.PI!!
}
}
Captulo21ApndiceCMaisjavaPgina202

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

21.2 - final
Apalavrachavefinaltemvriasutilidades.Naclasseeladefinequeestanuncapoder
terumafilha,isso,nopodeserestendida.AclasseString,porexemplo,final.
Comomodificadordemtodofinalindicaqueaquelemtodonopodeserreescrito.
Ao usarmos como modificador de declarao de varivel indica que o valor daquela
varivel nunca poder ser alterado. No caso da varivel ser um atributo, voc tem at a
construodaqueleobjetoparainicializarovalor(casocontrrioocorreumerrodecompilao,
poisatributosfinalnosoinicializadoscomvaloresdefault).
Imagine que quando criamos um objeto Cliente no queremos que seu rg seja
modificado:
classCliente{
privatefinalintrg;
publicCliente(intrg){
this.rg=rg;
}
}
Uma varivel static final tem uma cara de constante daquela classe, e se for
public static final a parece uma constante global! Por exemplo, na classe
Collectionsdojava.utilvoctemumavarivelpublicstaticfinalchamadaEMPTY_LIST.
convenoessasvariveisteremletrasmaisculaseseparadasporunderscoreemvezde
subiredescer.
Isso muito utilizado, mas hoje no java 5 para criarmos constantes muito mais
interessanteutilizarmosorecursodeenumeraes,quealmdetipadasjpossuemdiversos
mtodosauxiliares.

21.3 - Calendar
A classe abstrata Calendar encapsula um momento no tempo representado em
milissegundos.Tambmprovmtodosparamanipulaodessemomento.
A subclasse concreta de Calendar mais usada a GregorianCalendar que
representaocalendriousadopelamaiorpartedospases.(outrasimplementaesexistem,
como a do calendrio budista BuddhistCalendar, mas que so internas e devolvidas de
acordocomseuLocale)
ParaobterumCalendarqueencapsulaoinstanteatual(dataehora),usamosomtodo
estticogetInstance()deCalendar(vejaoprximoexemplo).
ApartirdeumCalendar,podemossaberovalordeseuscampos,comoano,mes,dia,
hora,minuto...Paraisso,usamosomtodogetquerecebeuminteirorepresentandoocampo;
osvalorespossveisestoemconstantesnaclasseCalendar.
Noexemploabaixo,imprimimosodiadehojeeodiadasemanacorrespondente.Note
que o dia da semana devolvido um inteiro que representa o dia da semana
(Calendar.MONDAYetc):

Captulo21ApndiceCMaisjavaPgina203

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Calendarc=Calendar.getInstance();
System.out.println("DiadoMs:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("DiadaSemana:"+c.get(Calendar.DAY_OF_WEEK));
Umpossvelresultado:
DiadoMs:4
DiadaSemana:5
Noexemploacima,odiadasemana5representaaquintafeira.
Damesmaformaquepodemospegarosvaloresdoscampos,podemosatribuirnovos
valoresaessescampospormeiodosmtodosset.
HdiversosmtodossetemCalendar.Omaisgeraloquerecebedoisargumentos:o
primeiroindicaqualocampo(usandoaquelasconstantesdeCalendar)eosegundo,onovo
valor.Almdessemtodoset,outrosmtodossetrecebemvaloresdedeterminadoscampos;o
setdetrsargumentos,porexemplo,recebeano,mesedia.Vejamosumexemplodecomo
alteraradatadehoje:
Calendarc=Calendar.getInstance();
c.set(Calendar.HOUR,10);//fazemoshoravaler10
c.set(Calendar.MINUTE,30);//fazemosminutovaler30
c.set(2005,11,25);//mudamosadataparaoNata,mscomeado0
Outro mtodo bastante usado add que adiciona uma certa quantidade a qualquer
campodoCalendar.Porexemplo,paraadicionarumanodatadehoje:

Calendarc=Calendar.getInstance();
c.add(Calendar.YEAR,1);//adiciona1aoano
Note que, embora o mtodo se chame add, voc pode uslo para subtrair valores
tambm;bastacolocarumaquantidadenegativanosegundoargumento!
OsmtodosafterebeforesousadosparacompararoobjetoCalendaremquesto
aoutroCalendar.OmtodoafterdevolvertruequandooCalendaremquestoestivernum
momentonotempomaiorqueodoCalendarpassadocomoargumento.Porexemplo,after
devolverfalsesecompararmosodiadascrianascomonatal,poisodiadascrianasno
vemdepoisdonatal:
Calendarc1=newGregorianCalendar(2005,Calendar.OCTOBER,12);
Calendarc2=newGregorianCalendar(2005,Calendar.DECEMBER,25);
System.out.println(c1.after(c2));
Analogamente, o mtodo before verifica se o momento em questo vem antes do
momento do Calendar passado como argumento. No exemplo acima, c1.before(c2)
devolvertrue,poisodiadascrianasvemantesdoNatal.
Note que Calendar implementa Comparable.Isso querdizer quevoc podeusar o
mtodo compareTo para comparar dois calendrios. No fundo, after e before usam o
compareToparadarsuasrespostas.
Por ltimo, um dos problemas mais comuns quando lidamos com datas verificar o
intervalo entre duas datas. O mtodo abaixo devolve o nmero de dias entre dois objetos
Calendar.Oclculofeitopegandoadiferenaentreasdatasemmilissegundosedividindo
Captulo21ApndiceCMaisjavaPgina204

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

essevalorpelonmerodemilissegundosemumdia:
publicintdiferencaEmDias(Calendarc1,Calendarc2){
longm1=c1.getTimeInMillis();
longm2=c2.getTimeInMillis();
return(int)((m2m1)/(24*60*60*1000));
}

21.4 - Date
A classe Date no recomendada porque a maior parte de seus mtodos esto
marcadoscomodeprecated,pormelatemamplousolegadonasbibliotecasdojava.Elafoi
substituda no java 1.1 pelo Calendar, para haver suporte correto a internacionalizao do
sistemadedatas.
VocpodepegarumDatedeumCalendareviceversaatravsdosgettersesettersde
time:
Calendarc=newGregorianCalendar(2005,Calendar.OCTOBER,12);
Dated=c.getTime();
c.setTime(d);
Issofazcomquevocpossaoperarcomdatasdamaneiranova,mesmoqueasAPIs
aindausemobjetosdotipoDate(comoocasodejava.sql).

21.5 - Outras classes muito teis


Naedio13darevistaMundoJavavimosdiversasclassesutilitrias,algumassomuito
importantesevocdeveconhecelas:

Randomparagerarnmerospseudoaleatrios
FormatterumformatadorquerecebeargumentosparecidoscomoprintfdoC,tanto
queagoraumo PrintStream (porexemploo System.out) possuiummtodocom
estenome.
Scannerjvimosumpoucodeleaqui,maselemuitomaispoderoso,possibilitando
autilizaodeexpressesregulares,facilitandomuitoaleitura
ResourceBundleparainternacionalizao
java.io.File manipula diretrios, nomes de arquivos, verifica tamanhos e
propriedadesdeles,deleta,move,etc.

21.6 - Anotaes
Anotaoamaneiradeseescrevermetadadosnojava5.0.Algumasanotaespodem
serretidas(retained)no.class,fazendocomqueporreflectionsnspossamosdescobriressas
informaes.
utilizada,porexemplo,paraindicarquedeterminadaclassedeveserprocessadaporum
framework de uma certa maneira, facilitando assim as clssicas configuraes atravs de
centenasdelinhasdeXML.
Captulo21ApndiceCMaisjavaPgina205

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Apesardessapropriedadeinteressante,algumasanotaesservemapenasparaindicar
algoaocompilador.@Overrideoexemplodisso.Casvocuseessaanotaoemummtodo
quenofoireescritovaihaverumerrodecompilao!Avantagemdeusalaapenaspara
facilitaralegibilidade.
@Deprecated indica queum mtodo no deve ser mais utilizado por algum motivo, e
decidiramnoretiralodaAPIparanoquebrarprogramasquejfuncionavamanteriormente.
@SurpressWarningsindicaparaocompiladornodarwarningarespeitodedeterminado
problema,indicandoqueoprogramadorsabeoqueestfazendo.Umexemploowarningque
ocompiladordoEclipsedaquandovocnousadeterminadavarivel.Vocvaiverqueumdos
quickfixesasugestodeusaro@SupressWarnings.
Anotaes podem receber parmetros. Existem muitas delas na api do java 5 mas
realmentemaisaindautilizadaemalgunsframeworks,comoohibernate3,oejb3eoJunit4.

Captulo21ApndiceCMaisjavaPgina206

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

captulo

22

Apndice D Instalao do JDK

22

Quem pouco pensa, engana-se muito.


LeonardodaVinci

InstalaodoJavaDevelopmentKit,emambienteWindowseLinux.

22.1 - O Link
ParavocbaixaroJDK(JavaDevelopmentKit),acesseolinknositedasun:
http://java.sun.com/javase/downloads/index.jsp
Nestapgina,voctemaopodebaixaroJDK,JRE,JDK+JEE,Documentao,CdigoFonte,
eoutrascoisa.

22.2 - Instalao do JDK em ambiente Windows


ParainstalaroJDKnoWindows,primeirobaixeonositedasun,umsimplesarquivo
executvel,quecontmoWizarddeinstalao.
1) D um clique duplo no arqui jdk<verso>windowsi586p.exe., e espere at ele
entrarnowizarddeinstalao.
2) Neste tela aceite o contrato da sun, marcando a opo I accept the terms inthe
licenseagreementecliqueemNext.

Captulo22ApndiceDInstalaodoJDKPgina207

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

3)Agoradevemosselecionarquaisrecursosinstalaremosjuntocomojava(Ferramentas
dedesenvolvimento,Demostraes,ocdigofonteeoprpriojava),eondeeleserinstalado
(marque esse caminho porque usaremosele mais pra frente), deixe como est eclique em
Next.

4)Pronto,agoraelecomearainstalaroJDK!

Captulo22ApndiceDInstalaodoJDKPgina208

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

5)(estepassosserexecutadocasovocaindanotenhainstaladooJREnasuamquina)
Agora ele comear a instalar o JRE(Java Runtime Environment). Assim como o JDK, ele
tambmtemalgumasopes.DeixecomoestecliqueemNext.

6)(estepassosserexecutadocasovocaindanotenhainstaladooJREnasuamquina)
Nestepasso,vocconfiguraosnavegadoresparautilizaramojava,porexemploprarodarum
applet.

Captulo22ApndiceDInstalaodoJDKPgina209

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

7)(estepassosserexecutadocasovocaindanotenhainstaladooJREnasuamquina)
ProntoagoraeleinstalaroJRE.

8)AgoraseuJDKestinstalado.CliqueemFinish.

Captulo22ApndiceDInstalaodoJDKPgina210

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

9)Agoravamoscriarasvariveisdeambiente.Cliquecomobotodireitoemcimadocone
MeuComputadoreselecioneaopoPropriedades.

10)AgoraescolhaaabaAvanadoedepoiscliquenobotoVariveisdeAmbiente

Captulo22ApndiceDInstalaodoJDKPgina211

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

11)Nestatelavocvernapartedecima,asvariveisdeambientedousuriocorrente,e
embaixo, as variveis de ambiente do computador(serve para todos os usurios). Clique no
botoNovadapartedebaixo

12)AgoraemNomedaVariveldigiteJAVA_HOME,eemvalordavaraveldigiteo
caminho que voc anotou no passo 3. Nesta mquina o caminho F:\Program
Files\Java\jdk1.5.0_07\,masnasuamquinaprovavelmentevaiseroutrocomoC:\Arquivosde
Captulo22ApndiceDInstalaodoJDKPgina212

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

Programas\Java\jdk1.5.0_07\.EdepoiscliqueemOK.

13)Crieumanovavariveldeambienterepetindoopasso11,pormagoradefinaonomeda
varivelcomoCLASSPATHeovalorcom.(ponto).
14)Agoranovamoscriaroutravarivelesimalterar,paraissoprocureavarivelPATH,ou
Path(dnomesmo)ecliquenobotodebaixoEditar.

15) No mexa no nome da varivel, deixe como est, e adicione no final do valor
;%JAVA_HOME%\bin,noesqueadopontoevrgula,assimvocestadicionandomaisum
caminhosuavarivelPath.
16)AgoraabraopromptedigitejavacversionsemostraraversodoJavaCompilerealgumas
opes,casonoaparearevejaospassoseconfirasenoesqueceuoupulounenhumdeles.

22.3 - Instalao do JDK em ambiente Linux


Captulo22ApndiceDInstalaodoJDKPgina213

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos

1)BaixeopacotedeinstalaoparaLinuxchamadoLinuxselfextractingfile,assimo
arquivoquevocbaixarteraextenso.bin.
2)Abraumterminaleloguesecomoroot(comandosu).
3)Crieumdiretriochamado/javanaraizdoseusistema(mkdir/java)
4)Copieoarquivoquevocbaixouparaodiretrio/java(cp/<caminhodoarquivo>/jdk
<verso>linux.bin/java)
5) Altere a permisso do arquivo para que ele possa ser executado(chmod +x
jdk<versao>linux.bin)
6)Executeoarquivo(./jdk<verso>linux.bin)
7)Aparecernasuatelaumacordodeinstalao,aperteateclaQparairatofinaldo
documento, e depois escreva yes para aceitar o contrato. Feito isso ele comear a
descompactaroJDKemumdiretrioqueelecria,chamadojdk<verso>.
8)Vamosagoracriarasvariveisdeambiente,editeoarquivo/etc/bash.bashrc
(vi/etc/bash.bashrc),nofinaldoarquivoadicioneasseguinteslinhas:
JAVA_HOME=/java/jdk<verso>
PATH=$PATH:/$JAVA_HOME/bin
CLASSPATH=.
exportJAVA_HOMEPATHCLASSPATH
9)Reinicieamquina
10)Loguesenormalmente,comseuusurio
11)AbraumterminaletesteoJavaCompiler(javacversion)
12)Asadadeverserparecidacomaapresentadaabaixo,pormsenofor,revejaos
passoseconfirasefoifeitotudocerto.
javac1.5.0_07
javac:nosourcefiles
Usage:javac<options><sourcefiles>
wherepossibleoptionsinclude:
gGeneratealldebugginginfo
g:noneGeneratenodebugginginfo
g:{lines,vars,source}Generateonlysomedebugginginfo
nowarnGeneratenowarnings
verboseOutputmessagesaboutwhatthecompilerisdoing
deprecation
Output source locations where deprecated APIs are
used
classpath<path>Specifywheretofinduserclassfiles
cp<path>Specifywheretofinduserclassfiles
sourcepath<path>Specifywheretofindinputsourcefiles
bootclasspath<path>Overridelocationofbootstrapclassfiles
extdirs<dirs>Overridelocationofinstalledextensions
endorseddirs<dirs>Overridelocationofendorsedstandardspath
d<directory>Specifywheretoplacegeneratedclassfiles
encoding<encoding>Specifycharacterencodingusedbysourcefiles
source <release> Provide source compatibility with specified release
target<release>GenerateclassfilesforspecificVMversion
versionVersioninformation
helpPrintasynopsisofstandardoptions
XPrintasynopsisofnonstandardoptions
Captulo22ApndiceDInstalaodoJDKPgina214

Caelumhttp://www.caelum.com.brJava e Orientao a Objetos


J<flag>Pass<flag>directlytotheruntimesystem

Captulo22ApndiceDInstalaodoJDKPgina215

CaelumJava e Orientao a Objetos

Termos importantes
Plataforma Java...............................3
Sun..................................................3
Mquina Virtual..............................5
Bytecode.........................................6
CLASSPATH....................................9
main..............................................12
Variveis........................................15
int..................................................15
Operadores Aritmticos................16
double...........................................17
boolean..........................................17
char...............................................17
Atribuio......................................17
Casting..........................................19
if....................................................21
Condio.......................................21
booleana........................................21
Else...............................................21
Operadores Lgicos......................21
Operador de Negao...................21
Lao...............................................22
While.............................................22
For.................................................22
Break.............................................23
Continue........................................24
Escopo...........................................24
Orientao Objetos....................28
Classe............................................30
Atributo.........................................31
New...............................................31
Mtodo..........................................32
Void...............................................32
Argumento....................................32
Parmetro.....................................32
This...............................................32
Invocao de Mtodo....................33
Return...........................................34
Referncia.....................................34
Valores default..............................39
NULL.............................................40
Matriz............................................48
Array.............................................48
Private...........................................56
Modificador de acesso..................56
Public............................................57
Encapsular....................................58

Getters..........................................59
Setters...........................................60
Construtor.....................................61
Static.............................................64
Herana........................................68
Extends.........................................68
Super e Sub Classes.....................69
Protected.......................................69
Reescrita de mtodo.....................69
Reescrita.......................................70
Polimorfismo.................................72
Composio...................................74
Classe Abstrata.............................93
Abstract.........................................93
Mtodo Abstrato...........................95
Sobrecarga..................................102
Interface......................................105
Implements.................................105
Exception....................................115
Throws........................................121
Finally.........................................125
Pacote.........................................129
Package.......................................129
Import.........................................131
JAR..............................................135
Javadoc........................................139
java.lang......................................144
Object..........................................145
Casting de Referncias...............146
Wrapping.....................................147
Autoboxing..................................148
toString.......................................148
equals..........................................149
split.............................................150
compareTo..................................150
java.io..........................................154
Arquivos......................................154
Sockets........................................154
Entrada e Sada..........................154
Arrays..........................................161
Vetor............................................161
Collections..................................162
List..............................................162
Comparable.................................166
Set...............................................168
Map.............................................170
i

CaelumJava e Orientao a Objetos

Execuo Concorrente................178
Runnable.....................................178
Thread.........................................178
Sleep...........................................179
Garbage Collector.......................179
THREAD SAFE...........................182

Lock............................................182
Synchronized..............................182
TCP.............................................187
Porta............................................188
Static Import...............................202

ii

Potrebbero piacerti anche