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 1
1 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 2
2 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?

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

Java tenta amenizar esses problemas. Alguns desses objetivos foram atingidos muito
PLATAFORMA
JAVA tempoatrs,porque,antesdoJava1.0sair,aidiaquealinguagemfosseusadaempequenos
dispositivos,comotvs,aspiradores,liquidificadoreseoutros.Apesardissoalinguagemteveseu
lanamentomirandoousodelanosclientesweb(browsers)pararodarpequenasaplicaes
(applets).Hojeemdiaessenomaisofocodalinguagem.

SUN 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!

Cdigobinriopara
CdigofonteemC
umdeterminadorSO
compila

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.

JoJavautilizasedoconceitode mquina virtual,ondeexisteumacamadaextra


MQUINA
VIRTUAL entreosistemaoperacionaleaaplicao,responsvelportraduzir(noapenasisso)oque
suaaplicaodesejafazerparaasrespectivaschamadasdosistemaoperacionalnoqualela
estrodandonomomento:

Bytecodejava Bytecodejava

MquinaVirtualJava MquinaVirtualJava
paraLinux 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.

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


BYTECODE 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

Avarivel PATH provavelmentejtemmuitacoisaevocsprecisaacrescentar.Ja


CLASSPATH 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.}

Omiolodoprogramaoqueserexecutadoquandochamamosamquinavirtual.Por
MAIN 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 3
Variveis primitivas e Controle de fluxo
3

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
DOUBLE nmerosinteiroseoutros?Outrotipodevarivelmuitoutilizadoodouble,quearmazenaum
nmerocompontoflutuante.

doubled=3.14;
doublex=5*10;

BOOLEAN Otipobooleanarmazenaumvalorverdadeirooufalso,es.

booleanverdade=true;

Otipo char guardaumeapenasumcaractere.Essecaracteredeveestarentreaspas


CHAR simples. No se esquea dessas duas caractersticas de uma varivel do tipo char! Por
exemplo,elanopodeguardarumcdigocomopoisovazionoumcaractere!

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

3.2 - Tipos primitivos e valores


EssestiposdevariveissotiposprimitivosdoJava:ovalorqueelasguardamsooreal
ATRIBUIO
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.

svezes,precisamosqueumnmeroquebradosejaarredondadoearmazenadonum
CASTING 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
DE:
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)

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

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

intidade=15;
if(idade<18){
System.out.println("Nopodeentrar");
}

ELSE Almdisso,vocpodeusaraclusulaelseparaindicarocomportamentoquedeveser
executadonocasodaexpressobooleanaserfalsa:

intidade=15;
if(idade<18){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}

OPERADORES Voc pode concatenar expresses booleanas atravs dos operadores lgicos E e
LGICOS OU.OErepresentadopelo&eoOUrepresentadopelo|.

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

OPERADOR Essecdigopoderiaaindaficarmaislegvel,utilizandoseooperadordenegao,o !.
DE NEGAO 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 Owhileumcomandousadoparafazerumlao(loop),isto,repetirumtrechode
cdigo algumas vezes. A idia que esse trecho de cdigo seja repetido enquanto uma
WHILE
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
Outrocomandodeloopextremamenteutilizadoofor.Aidiaamesmadowhile,
fazerumtrechodecdigoserrepetidoenquantoumacondiocontinuarverdadeira.Masalm
FOR 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 y");
break;
}
}

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 4
4 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 Orientaoobjetosumamaneiradeprogramarqueajudanaorganizaoeresolve
OBJETOS 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.

Porenquantodeclaramosoquetodacontadeveter.Estessoosatributos quetoda
conta,quandocriada,vaiter.Reparequeessasvariveisforamdeclaradasforadeumbloco,
ATRIBUTO 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
MTODO comportamentosquecadaclassetem,isto,oqueelafaz.Porexemplo,dequemaneiraque
umaContasacadinheiro?IremosespecificarissodentrodaprpriaclasseConta,enoemum
local desatrelado das informaes da prpria Conta.. por isso que essas funes so
chamadasdemtodoPoisamaneiradefazerumaoperaocomumobjeto.

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.

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

Dentrodomtodo,estamosdeclarandoumanovavarivel.Essavarivel,assimcomoo
argumento, vai morrer no fim do mtodo, pois este seu escopo. No momento que vamos
THIS
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.

Paramandarumamensagemaoobjeto,epedirqueeleexecuteummtodo,tambm
INVOCAO
usamosoponto.Otermousadoparaissoumainvocao de mtodo.
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;
}
}

Agoraadeclaraodomtodomudou!Omtodosacanotemvoidnafrente,istoquer
dizerque,quandoacessado,eledevolvealgumtipodeinformao.Nocaso,umboolean.A
RETURN
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


Quandodeclaramosumavarivelparaassociaraumobjeto,naverdade,essavarivel
REFERNCIA 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";

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


NULL
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(); //quandochamaremnewConta,
6. //haveraumnewClienteparaele.
7.}

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 5
Um pouco de arrays
5

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. System.out.println(x);
8. }
9.}

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 6
6 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 (tambm chamadode modificador de


DE ACESSO visibilidade).

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

Oquecomeamosavernessecaptuloaidiadeencapsular,isto,escondertodos
ENCAPSULAR 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 Opadroparaessesmtodosdecolocarapalavra get ou set antesdonomedo


SETTERS 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. returnthis.saldo;
9. }
10.
11. publicvoidsetSaldo(doublesaldo){
12. this.saldo=saldo;
13. }
14.
15. publicdoublegetLimite(){
16. returnthis.limite;
17. }
18.
19. publicvoidsetLimite(doublelimite){
20. this.limite=limite;
21. }
22.
23. publicClientegetDono(){
24. returnthis.dono;
25. }
26.
27. publicvoidsetDono(Clientedono){
28. this.dono=dono;
29. }
30.}

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 new chamado, executa o
construtor da classe. O construtor da classe um bloco
declaradocomomesmo nomequeaclasse:

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. Stringdono;
4. doublesaldo;
5. doublelimite;
6.
7. //construtor
8. Conta(Stringdono){
9. this.dono=dono;
10. }
11.
12. //..
13.}

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 7
7 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 Existeumamaneira,emJava,derelacionarmosumaclassedetalmaneiraqueumadelas
herdatudoqueaoutratem.Istoumarelaodeclassemeeclassefilha.Nonossocaso,
gostaramosdefazercomqueoGerentetivessetudoqueumFuncionariotem,gostaramos
EXTENDS 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.

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


PROTECTED 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 8
8Eclipse 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 9
9 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 Usamosapalavrachaveabstractparaimpedirqueelapossaserinstanciada.Esseo
ABSTRACT
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 Existe um recurso em Java que, em uma classe abstrata, podemos escrever que
ABSTRATO
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. privatedoublesaldo=0.0;
3.
4. publicvoidretira(doublevalor){
5. this.saldo=valor;
6. }
7.
8. publicvoiddeposita(doublevalor){
9. this.saldo+=valor;
10. }
11.
12. publicdoublegetSaldo(){
13. returnthis.saldo();
14. }
15.}

1.classContaCorrenteextendsConta{
2. privatedoublelimiteDoChequeEspecial=1000.0;
3. privatedoublegastosNoChequeEspecial=100.0;
4.
5. publicvoidatualiza(){
6. super.retira(this.gastosNoChequeEspecial*0.08);
7. }
8.}

1.classContaPoupancaextendsConta{
2. privatedoublecorrecaoMensal;
3.
4. publicvoidatualiza(){
5. super.deposita(this.saldo*this.correcaoMensal);
6. }
7.}

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:

oqueumaclassefaz(asassinaturasdosmtodos)
comoumaclassefazessastarefas(ocorpodosmtodoseatributosprivados)

CONTRATO 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

Chamase interface pois a maneira a qual poderemos conversar com um


INTERFACE
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.

EoGerentepodeassinarocontrato,ouseja,implementarainterface.Nomomento
IMPLEMENTS
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.

Rodeocdigo.Qualasada?Oqueissorepresenta?Oqueelaindica?
EXCEPTION

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 for, pegando


ArrayIndexOutOfBoundsException.Oqueocdigoimprimeagora?

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);
}

A segunda forma de tratar esse erro a de delegar ele para quem chamou o nosso
THROWS
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
12

bibliotecas
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


PACOTE
agruparclassesdefuncionalidadeparecida.

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
IMPORT
dopacotebr.com.caelum.banco:

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

No site da Sun, voc pode (e deve) baixar a documentao das bibliotecas do Java,
JAVADOC
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
OBJECT
estherdandodaclasseObject,quetambmseencontradentrodopacotejava.lang.Voc
atmesmopodeescreveressaherana,queamesmacoisa:

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
CASTING DE
REFERNCIAS fazer
isso, sabendo do risco que podemos estar correndo. Fazemos o casting de
referncias,parecidocomoquandofizemoscomostiposprimitivos:

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.

Essasclassestambmsomuitoutilizadasparafazero wrapping (embrulhar)tipos


WRAPPING
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
EQUALS
Javaporsisnofazisso,masexisteummtodonaclasse Object quepodeserreescrito
paracriarmosessecritriodecomparao.Essemtodooequals.

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


SPLIT
arraydeStrings,dadodeterminadocritrio.

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

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


COMPARETO
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
15Pacote java.io
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


AssimcomotodoorestodasbibliotecasemJava,apartedecontroledeentradaesada
JAVA.IO
dedados(conhecidocomoio)orientadaaobjetoseusaosprincipaisconceitosmostradosat
agora:interface,classesabstratasepolimorfismo.

A idia atrs do polimorfismo no pacote java.io de utilizar fluxos de entrada


ARQUIVOS
(InputStream)edesada(OutputStream)paratodaequalqueroperao,sejaelarelativaa
SOCKETS um arquivo, a uma conexo remota via sockets ou at mesmo a entrada e sada
ENTRADA E padrodeumprograma(normalmenteotecladoeoconsole).
SADA

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. InputStreamReaderisr=newInputStreamReader(is);
5. BufferedReaderbr=newBufferedReader(isr);
6. Strings=br.readLine();
7. }
8.}
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
16Collections framework
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 Autilizaodearrayscomplicadaemmuitospontos:
VETOR
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.

Comesseseoutrosobjetivosemmente,aSuncriouumconjuntodeclasseseinterfaces
COLLECTIONS
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.

AimplementaomaisutilizadadainterfaceListaArrayListquetrabalhacomuma
LIST 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.

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


java.lang.Comparable, que define o mtodo int compareTo(Object). Este mtodo
COMPARABLE
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


Umconjunto(Set)funcionadeformaanlogaaosconjuntosdamatemtica,eleuma
SET 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.

Ainterface Map fazpartedoframeworkmasnoestende Collection.(veremos Map


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.

Voltando ao exemplo do conjunto de strings, vamos


percorreroconjunto:

1. //populaoconjunto
2. Setconjunto=newHashSet();
3. conjunto.add(item1);
4. conjunto.add(item2);
5. conjunto.add(item3);
6.
7. //retornaoiterator
8. Iteratori=conjunto.iterator();
9. while(i.hasNext()){
10.
11. //recebeapalavra
12. Objectelemento=i.next();
13. Stringpalavra=(String)elemento;
14.
15. //mostraapalavra
16. System.out.println(palavra);
17. }

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. Setconjunto=newHashSet();
2. conjunto.add("item1");
3. conjunto.add("item2");
4. conjunto.add("item3");
5.
6. //retornaoiterator
7. for(Objectelemento:conjunto){
8. Stringpalavra=(String)elemento;
9. System.out.println(palavra);
10. }

OJavavaiusaroiteratorda Collection dadaparapercorreracoleo.Sevocj


estiver usando uma coleo parametrizada, o for pode ser feito utilizando um tipo mais
especfico:

1. Set<String>conjunto=newHashSet<String>();
2. conjunto.add("item1");
3. conjunto.add("item2");
4. conjunto.add("item3");
5.
6. //retornaoiterator
7. for(Stringpalavra:conjunto){
8. System.out.println(palavra);
9. }

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. publicclassTestaPerformance{
2.
3. publicstaticvoidmain(String[]args){
4. System.out.println("Iniciando...");
5. longinicio=System.currentTimeMillis();
6. Collection<Integer>teste=newArrayList<Integer>();
7.
8. for(inti=0;i<30000;i++){
9. teste.add(i);
10. }
11.
12. for(inti=0;i<30000;i++){
13. teste.contains(i);
14. }
15.
16. longfim=System.currentTimeMillis();
17. doubletempo=(fiminicio)/1000.0;
18. System.out.println("Tempogasto:"+tempo);
19. }
20. }

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 Podemos, em Java, facilmente criar uma classe que tem um mtodo que vai ser
executadoconcorrentementecomoseumain.Paraisso,vocprecisaimplementarainterface
RUNNABLE Runnable,quedefineomtodorun.

1. packagebr.com.caelum.threads;
2.
3. classProgramaimplementsRunnable{
4.
5. privateintid;
6.
7. //colocargetteresetterproatributoid
8.
9. publicvoidrun(){
10. for(inti=0;i<10000;i++){
11. System.out.println("Programa"+id+"valor:"+
i);
12. }
13. }
14. }

THREAD Paravoccriaressanovalinhadeexecuo(Thread),muitosimples.

1. packagebr.com.caelum.threads;
2.
3. classTeste{
4. publicstaticvoidmain(String[]args){
5. Programap=newPrograma();
6. p.setId(1);
7. Threadt=newThread(p);
8. t.start();
9. }
10. }

Mas,esetivermososeguintecaso:

1. packagebr.com.caelum.threads;
2.
3. classTeste{

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

4. publicstaticvoidmain(String[]args){
5. Programap1=newPrograma();
6. p1.setId(1);
7. Programap2=newPrograma();
8. p2.setId(2);
9.
10. Threadt1=newThread(p1);
11. Threadt2=newThread(p2);
12.
13. t1.start();
14. t2.start();
15. }
16. }

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
Para que a thread atual durma basta chamar o mtodo a seguir, por exemplo, para dormir 3
SLEEP
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


OGarbage Collector(coletordelixo,lixeiro)umaThreadresponsvelporjogarfora
GARBAGE todososobjetosquenoestosendoreferenciadospornenhumaoutraThread,sejadiretaou
COLLECTOR
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. classProgramaimplementsRunnable{
2.
3. publicvoidrun(){
4. for(inti=0;i<1000;i++){
5. System.out.println(i);
6. }
7. }
8.
9. }

1. classTeste{
2. publicstaticvoidmain(String[]args){
3. Programap1=newPrograma();
4. Threadt1=newThread(p1);
5. t1.start();
6.
7. Programap2=newPrograma();
8. Threadt2=newThread(p1);
9. t2.start();
10. }
11. }

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. publicstaticvoidmain(String[]args){
3. newThread(newPrograma()).start();
4. newThread(newPrograma()).start();
5. }
6. }

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. publicclassConta{
2.
3. privatedoublesaldo;
4.
5. //outrosmetodoseatributos...
6.
7. publicvoidatualiza(doubletaxa){
8. doublesaldoAtualizado=this.saldo*(1+taxa);
9. this.saldo=saldoAtualizado;
10. }
11. publicvoiddeposita(doublevalor){
12. doublenovoSaldo=this.saldo+valor;
13. this.saldo=novoSaldo;
14. }
15. }

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.

EoerrosocorreuporqueoescalonadorparounossasThreadsnaquelesexatoslugares.
Podeserquenossocdigofiquerodando1anosemdarproblemaalgumeemumbelodiao
escalonadorresolvealternarnossasThreadsdaquelaforma.Nosabemoscomooescalonador
THREAD secomporta!Temosqueprotegernossocdigocontraessetipodeproblema.Dizemosqueessa
SAFE
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.

Podemos fazer isso em Java. Podemos usar qualquer objeto como um lock (trava,
chave),parapodersincronizaremcimadesseobjeto,isto,seumaThreadentraremumbloco
LOCK
quefoidefinidocomosincronizadoporesselock,apenasumaThreadpoderestarldentroao
mesmotempo,poisachaveestarcomela.

SYNCHRONIZED Apalavrachave synchronized dessacaractersticaaumblocodecdigo,erecebe


qualoobjetoqueserusadocomochave.Achavesdevolvidanomomentoemquea
Thread quetinhaessachavesairdobloco,sejaporreturn oudisparodeumaexceo(ou
aindanautilizaodomtodowait())..

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. public void deposita(double valor) {


15. synchronized (this) {
16. double novoSaldo = this.saldo + valor;
17. this.saldo = novoSaldo;
18. }
19. }
20.
21.}
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
Danecessidadededoiscomputadoressecomunicarem,surgiramdiversosprotocolosque
TCP permitissemtaltrocadeinformao:oprotocoloqueiremosusaraquio TCP (Transmission
ControlProtocol).

AtravsdoTCPpossvelcriarumfluxoentredoiscomputadorescomomostradono
diagramaabaixo:

Servidor
Aplicao Fluxo
Cliente

Exemplos:
Bancode
dados
Aplicao Webserver
Fluxo Servidorde
Cliente
icq
Central
bancria

Aplicao Fluxo
Cliente

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?

ServidorWeb
Cliente Fluxo ip10.0.0.1
Firefox1.0 porta80

Cliente Fluxo
Opera7.54

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 ServidorWeb
Firefox ip10.0.0.1
1.0 porta80
Iniciandona
porta80

Cliente
Opera
7.54
Continua
emoutra

EmJava,issodeveserfeitoatravsdethreadseoprocessodeaceitaraconexodeve
serrodadoomaisrpidopossvel.

19.5 - Servidor
Iniciandoagoraummodelodeservidordechat,oserviodocomputadorquefunciona
comobasedeveprimeiroabrirumaportaeficarouvindoatalgumtentarseconectar.

1. importjava.net.*;
2.
3. publicclassServidor{
4.
5. publicstaticvoidmain(Stringargs[]){
6.
7. try{
8. ServerSocketservidor=newServerSocket(10001);
9. System.out.println("Porta10001aberta!");
10. //acontinuaodoservidordeveserescritaaqui
11. }catch(IOExceptione){
12. System.out.println("Ocorreuumerronaconexo");
13. e.printStackTrace();
14.
15. }
16.
17. }
18. }

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. publicclassLeitorimplementsRunnable{
2.
3. privateScannerentrada;
4.
5. publicLeitor(InputStreamstream){
6. this.entrada=newScanner(stream);
7. }
8.
9. publicvoidrun(){
10. while(entrada.hasNextLine()){
11. System.out.println(entrada.nextLine());

12. }
13. }
14. }

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. Socketsocket=serverSocket.accept();
9. System.out.println(Servidorrecebeuconexaodocliente);
10.
11. //criandoleitorquevailerdasocketeimprimirnoconsole
12. Leitorleitor=newLeitor(socket.getInputStream());
13. newThread(leitor).start();
14.
15. Scannerteclado=newScanner(System.in);
16. PrintStreamsaida=newPrintStream(socket.getOutputStream());
17.
18. //lendodotecladoeescrevendonasocket
19. while(teclado.hasNextLine(){
20. saida.println(teclado.nextLine());
21. }
22. }
23.
24.}

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 Comeaaficarmuitochatodeescrevertodahoraonomedaclasse.Pararesolveresse
IMPORT 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 Getters..........................................59
Sun..................................................3 Setters...........................................60
Mquina Virtual..............................5 Construtor.....................................61
Bytecode.........................................6 Static.............................................64
CLASSPATH....................................9 Herana........................................68
main..............................................12 Extends.........................................68
Variveis........................................15 Super e Sub Classes.....................69
int..................................................15 Protected.......................................69
Operadores Aritmticos................16 Reescrita de mtodo.....................69
double...........................................17 Reescrita.......................................70
boolean..........................................17 Polimorfismo.................................72
char...............................................17 Composio...................................74
Atribuio......................................17 Classe Abstrata.............................93
Casting..........................................19 Abstract.........................................93
if....................................................21 Mtodo Abstrato...........................95
Condio.......................................21 Sobrecarga..................................102
booleana........................................21 Interface......................................105
Else...............................................21 Implements.................................105
Operadores Lgicos......................21 Exception....................................115
Operador de Negao...................21 Throws........................................121
Lao...............................................22 Finally.........................................125
While.............................................22 Pacote.........................................129
For.................................................22 Package.......................................129
Break.............................................23 Import.........................................131
Continue........................................24 JAR..............................................135
Escopo...........................................24 Javadoc........................................139
Orientao Objetos....................28 java.lang......................................144
Classe............................................30 Object..........................................145
Atributo.........................................31 Casting de Referncias...............146
New...............................................31 Wrapping.....................................147
Mtodo..........................................32 Autoboxing..................................148
Void...............................................32 toString.......................................148
Argumento....................................32 equals..........................................149
Parmetro.....................................32 split.............................................150
This...............................................32 compareTo..................................150
Invocao de Mtodo....................33 java.io..........................................154
Return...........................................34 Arquivos......................................154
Referncia.....................................34 Sockets........................................154
Valores default..............................39 Entrada e Sada..........................154
NULL.............................................40 Arrays..........................................161
Matriz............................................48 Vetor............................................161
Array.............................................48 Collections..................................162
Private...........................................56 List..............................................162
Modificador de acesso..................56 Comparable.................................166
Public............................................57 Set...............................................168
Encapsular....................................58 Map.............................................170

i
CaelumJava e Orientao a Objetos

Execuo Concorrente................178 Lock............................................182


Runnable.....................................178 Synchronized..............................182
Thread.........................................178 TCP.............................................187
Sleep...........................................179 Porta............................................188
Garbage Collector.......................179 Static Import...............................202
THREAD SAFE...........................182

ii