Beruflich Dokumente
Kultur Dokumente
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
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
v
CaelumJava e Orientao a Objetos
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.
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/
Captulo1ComoaprenderJavaPgina1
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
Existemtambm,emdeterminadoscaptulos,umasriededesafios.Elesfocammaisno
problemacomputacionalquenalinguagem,pormsoumaexcelenteformadetreinarasintaxe
eprincipalmentefamiliarizaroalunocomabibliotecapadroJava,almdeproporcionarum
ganhonavelocidadededesenvolvimento.
Sevocjparticipadeumgrupodeusuriosjavaoualgumalistadediscusso,podetirar
suasdvidasnosdoislugares.
Fora isso, sintase a vontade de entrar em contato conosco para tirar todas as suas
dvidasduranteocurso.
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.
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.
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?
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.
Writeonce,runanywhere
EsseumsloganqueaSunusaparaoJava,jquevocnoprecisareescreverpartedasua
aplicaotodavezquequisermudardesistemaoperacional.
Muitaspessoascriticamoucriampiadasemcimadesseslogan,poracharemquenemsempre
umaaplicaoJavapoderodaremduasplataformasdiferentessemproblemas.
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.
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.
JVM=apenasavirtualmachine,essedownloadnoexiste
JRE = Java Runtime Environment, ambiente de execuo Java, formado pela JVM e
bibliotecas,tudoquevocprecisaparaexecutarumaaplicaoJava.
JDK=Ns,desenvolvedores,faremosodownloaddoJDKdoJavaSE(StandardEdition).
QueremosdeixarclarodequeapremissadoJavanoadecriarsistemaspequenos,
ondetemosum oudois desenvolvedores,maisrapidamenteque linguagenscomophp,perl,
entreoutras.
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.
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.
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.
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.
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.
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
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.
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
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.
Omiolodoprogramaoqueserexecutadoquandochamamosamquinavirtual.Por
MAIN enquanto,todasaslinhasanteriores,ondehadeclaraodeumaclasseeadeummtodo,
noimportaparans.MasdevemossaberquetodaaplicaoJavacomeaporumpontode
entrada,eestepontodeentradaummtodomain.
Aindanosabemosoquemtodo,masveremosnocaptulo4.Atl,nosepreocupe
comessasdeclaraes.Semprequeumexerccioforfeito,ocdigosempreestarnessemiolo.
2.13 - E o bytecode?
OMeuPrograma.classgeradonolegvelporsereshumanos(noquesejaimpossvel).
Eleestescritonoformatoqueavirtualmachinesabeentenderequefoiespecificadoqueela
Captulo2OqueJavaPgina11
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
deveentender.
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.
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.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
IremosaprenderatrabalharcomosseguintesrecursosdalinguagemJava:
declarando,atribuindovalores,castingecomparandovariveis;
controledefluxoatravsdeifeelse;
instruesdelaoforewhile,controledefluxocombreakecontinue.
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.
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
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.
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;
charletra='a';
System.out.println(letra);
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
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.
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;
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.
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;
}
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.
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;
}
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;
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
//aquiavarivelinoexiste
inti=5;
//apartirdaquielaexiste
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);
while(condicao){
for(inti=0;i<10;i++){
//cdigo
}
}
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.
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.
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.
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.
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.
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.}
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.
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?
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.}
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
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;
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.
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.
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";
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.}
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
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.
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.
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.
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.
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");
}
Funcionariof1=newFuncionario():
f1.nome="Fiodor";
f1.salario=100;
Captulo4OrientaoaobjetosbsicaPgina43
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
Funcionariof2=f1;
Oqueacontececomoifdoexerccioanterior?
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)
Sevocestcomdificuldadeemalgumapartedessecaptulo,aproveiteetreinetudoo
quevimosatagoranospequenosprogramasabaixo:
Programa1
Classe:Pessoa.
Atributos:nome,idade.
Mtodo:voidfazAniversario()
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
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.
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.
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.
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.}
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;
}
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
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.
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;
//...
}
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
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.
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.
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!
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().
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
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);
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/
Contac=newConta();
totalDeContas=totalDeContas+1;
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.
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());
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.}
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.
classFuncionario{
Stringnome;
Stringcpf;
doublesalario;
//mtodosdevemviraqui
}
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.
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.
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
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());
ImaginequeparacalcularabonificaodeumGerente,devemosfazerigualaoclculo
deumFuncionarioporemadicionandoR$1000.Poderamosfazerassim:
classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnthis.salario*0.10+1000;
}
//...
}
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.
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
OdiaquecriarmosumaclasseSecretaria,porexemplo,quefilhadeFuncionario,
precisaremos mudar a classe de ControleDeBonificacoes? No. Basta a classe
Secretariareescreverosmtodosquelheparecernecessrio.exatamenteesseopoderdo
polimorfismojuntamentecomaheranaereescritademtodo:diminuiracoplamentoentreas
classes,paraqueevitarquenovoscdigosresultememmodificaeseminmeroslugares.
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!!!
}
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.
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.
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.
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.
Captulo8EclipseIDEPgina79
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
FecheateladeWelcomeevocveratelaabaixo.Nestatela,destacamosasViews(em
linhacontnua)easPerspectives(emlinhapontilhada)doEclipse.
AViewNavigatormostraaestruturadediretrioassimcomoestnosistemadearquivos.
AViewOutlinemostraumresumodasclasses,interfaceseenumeraesdeclaradasnoarquivo
javaatualmenteeditado(servetambmparaoutrostiposdearquivos).
Captulo8EclipseIDEPgina80
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
NomenuWindow>ShowView>othervocpodeverasdezenasdeViewsquejvem
embutidasnoEclipse.AcostumeseasempreprocurarnovasViews,elaspodemteajudarem
diversastarefas.
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:
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
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).
O Eclipse abrir uma View chamada Console onde ser apresentada a sada do seu
programa:
Quandovocprecisarrodardenovo,bastaclicarnoconeverdedeplaynatoolbar,que
rodaoprogramaanterior.Aoladodesseconetemumasetinhaondesolsitadosos10ltimos
executados.
Captulo8EclipseIDEPgina87
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
saber:
Ctrl+1Acionaoquickfixescomsugestesparacorreodeerros.
Ctrl+EspaoCompletacdigos
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.
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.
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.
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.
Serentoquefazalgumsentidoteressemtodonaclasse Funcionario?Serque
existeumabonificaopadroparatodotipode Funcionario?Pareceno,cadaclassefilha
terummtododiferentedebonificaopoisdeacordocomnossosistemanoexisteuma
Captulo9OrientaoaObjetosClassesAbstratasPgina93
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
OmtododoControleDeBonificacaoestavaassim:
publicvoidregistra(Funcionariof){
System.out.println(Adicionandobonificacaodofuncionario:+f);
this.totalDeBonificacoes+=funcionario.getBonificacao();
}
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.
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)
2)Umaclasseabstratanoprecisanecessariamenteterummtodoabstrato.
9.6 - Exerccios
1) Repare que a nossa classe Conta uma excelente candidata para uma classe
abstrata.Porque?Quemtodosseriaminteressantescandidatosaseremabstratos?
abstractclassConta{
//...
}
2)SeagoranopodemosdarnewemConta,qualautilidadedeterummtodoque
recebeumarefernciaaContacomoargumento?Alis,possoterisso?
Compileocdigo.QualoproblemacomaclasseContaPoupanca?
abstractclassConta{
//atributosemetodosquejexistiam
abstractvoidatualiza(doubletaxaSelic);
}
Captulo9OrientaoaObjetosClassesAbstratasPgina98
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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
Aotrminodessecaptulo,vocsercapazde:
dizeroqueumainterfaceeasdiferenasentreheranaeimplementao;
escreverumainterfaceemJava;
utilizlascomoumpoderosorecursoparadiminuiracoplamentoentreasclasses.
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?
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
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.
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
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;
}
Captulo10OrientaoObjetosInterfacesPgina104
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
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.
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
Comofazercomquetodasaschamadasparabancosdedadosdiferentesrespeitema
mesmaregra?Usandointerfaces!ImagineumainterfaceConexao,ondetodososmtodosque
precisamosparanoscomunicaretrocardadoscomobancoestodefinidosl.Cadaempresa
ficaencarregadadecriarasuaimplementaoparaessainterface.
Apesardojava.sql.Connectionnotrabalharbemassim,aidiamuitosimilar,pormas
conexesvemdeumafactorychamadaDriverManager.
Conexo a banco de dados est fora do escopo desse treinamento, mas um dos
primeirostpicosabordadosnocursoFJ21,juntamentecomDAO.
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
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?
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;
}
}
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());
}
}
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{
//...
}
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.
ContaminhaConta=newConta();
minhaConta.deposita(100);
minhaConta.setLimite(100);
minhaConta.saca(1000);
// osaldo900?100?0?Achamadaaomtodosacafuncionou?
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).
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.
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):
Rodeocdigo.Qualasada?Oqueissorepresenta?Oqueelaindica?
EXCEPTION
Captulo11ExceesControlandooserrosPgina114
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
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");
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.
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
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).
MasnosessetipodeexceoqueexisteemJava,umoutrotipoobrigaosusurios
quechamamomtodoouconstrutoratrataroerro.Umexemploquepodemosmostraragora
odeabrirumarquivoparaleitura,quandopodeocorreroerrodoarquivonoexistir(veremos
comotrabalharcomarquivosemoutrocaptulo,nosepreocupecomistoagora):
publicstaticvoidmetodo(){
newjava.io.FileReader(arquivo.txt);
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();
}
}
}
No h uma regra para decidir em que momento do seu programa voc vai tratar
determinar exceo.Isso vaidependerdeem quepontovoctemcondiesdetomaruma
decisoemrelaoaaqueleerro.Enquantonoforomomento,vocprovavelmentevaipreferir
delegararesponsabilidadeparaomtodoqueteinvocou.
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.
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");
}
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());
}
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());
}
}
publicclassSaldoInsuficienteExceptionextendsException{
SaldoInsuficienteException(Stringmessage){
super(message);
}
}
catchethrows
Existeumapssimaprticadeprogramaoemjavaqueadeescrevero catch eothrows
comException.
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
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);
}
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());
}
}
classValorInvalidoExceptionextendsValorInvalidoException{
Ateno:nemsempreinteressantecriarmosumnovotipodeexception!Dependedo
caso.EsteaquiseriamelhoraindautilizarmosIllegalArgumentException.
6)(opcional)ColoqueumconstrutornaclasseValorInvalidoExceptionquereceba
o quanto ele tentou sacar. Dessa maneira, na hora de dar o throw new
ValorInvalidoExceptionvocvaiprecisarpassarovalordosaqueilegalcomoargumento.
publicStringgetMessage(){
return"Nopossoretirarvalornegativo:"+valor;
}
Agoraaoimprimiraexception,reparequeessamensagemquevaiaparecer.
Captulo11ExceesControlandooserrosPgina126
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
emvezdeRuntimeException.Oqueacontece?
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.
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;
}
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);
}
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.
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.*;
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.
Classespblicas
Paramelhororganizarseucdigo,oJavanopermitemaisdeumaclassepblicaporarquivoeo
arquivodeveserNomeDaClasse.java.
Umavezqueoutrosprogramadoresiroutilizaressaclasse,quandoprecisaremolharocdigoda
mesma,ficamaisfcilencontrlasabendoqueelaestnoarquivodemesmonome.
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina131
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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).
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;
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.
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.
1)Nabarrademenu,selecioneomenuProject,depoisaopoGenerateJavadoc....
(apenasdisponvelseestivernaperspectivaJava,masvocpodeacessaromesmowizardpelo
exportdoprojeto).
Captulo13Ferramentas:jarejavadocPgina138
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
Vamosverumpoucodesuasprincipaisclasses.
inti=System.in.read();
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.
14.3 - java.lang.Object
Semprequandodeclaramosumaclasse,essaclasseobrigadaaherdardeoutra.Isto
,paratodaclassequedeclararmos,existeumasuperclasse.Pormcriamosdiversasclasses
semherdardeningum:
classMinhaClasse{
QuandooJavanoencontraapalavrachave extends,eleentoconsideraquevoc
OBJECT
estherdandodaclasseObject,quetambmseencontradentrodopacotejava.lang.Voc
atmesmopodeescreveressaherana,queamesmacoisa:
classMinhaClasseextendsObject{
Podemos tambm afirmar que qualquer objeto em Java um Object, podendo ser
referenciado comotal.Entoqualquerobjetopossuitodososmtodosdeclaradosnaclasse
Object,everemosalgunsdeleslogoapsocasting.
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;
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;
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
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).
Strings="101";
inti=Integer.parseInt(s);
inti=5;
Integerx=newInteger(i);
EdadoumInteger,podemospegarointqueestdentrodele(desembrulhlo):
inti=5;
Integerx=newInteger(i);
intnumeroDeVolta=x.intValue();
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.
Objecto=5;
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);
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);
Stringfrase="javademais";
Stringpalavras[]=frase.split("");
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.
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.
8) (opcional) Reescrevaomtododoexerccioanteriormasagoraimprimaastringde
trsparaafrente.
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
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.
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!
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.
1.classTestaEntrada{
2. publicstaticvoidmain(String[]args)throwsIOException{
3. InputStreamis=newFileInputStream("arquivo.txt");
4. InputStreamReaderisr=newInputStreamReader(is);
5. intc=isr.read();
6. }
7.}
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.}
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.
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).
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)
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());
}
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.
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.
impossvelbuscardiretamenteporumdeterminadoelementoparaoqualnosesabe
ondice;
noconseguimossaberquantasposiesdaarrayjforampopuladassemcriar,para
isso,mtodosauxiliares.
RetireaquartaConta
conta[3]=null;
Nafiguraacima,vocpodeverumarrayqueantesestavasendocompletamenteutilizado,
equedepoisteveumdeseuselementosremovidos.
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.
Emoutraspalavras,voctemagarantiadeque,quandopercorreralista,oselementos
seroencontradosemumaordemprdeterminada,definidanahoradainserodosmesmos.
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");
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.
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.
Vector
OutraimplementaoatradicionalclasseVector,presentedesdeoJava1.0,quefoiadaptada
parausocomoframeworkdecollections,comainclusodenovosmtodos.
Eladevesertratadacomcuidadopoislidadeumamaneiradiferentecomprocessoscorrendoem
paraleloesermaislentoqueumaArrayListquandonohouveracessosimultneoaosdados.
Listlista=newArrayList();
lista.add("Umastring");
lista.add(newContaCorrente());
...
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);
contas.add("umastring");//issonocompilamais!!
OusodeGenericstambmeliminaanecessidadedecasting,jqueseguramentetodos
osobjetosinseridosnalistaserodotipoContaCorrente:
for(inti=0;i<contas.size();i++){
ContaCorrentecc=contas.get(i);//semcasting!
System.out.println(cc.getSaldo());
}
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.
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.
System.out.println(contas);
Possveisaesemumconjunto:
AcamisetaAzulestnoconjunto?
RemovaacamisetaAzul.
AdicioneacamisetaVermelha.
Limpeoconjunto.
Noexistemelementosduplicados!
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.
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.
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.
NoJava5temosoutrainterfacefilhadeCollection:aQueue,quedefinemtodosde
entradaedesada,equeestecritrioseradefinidopelasuaimplementao(porexemplolifo,
fifoouaindaumheapondecadaelementopossuisuachavedeprioridade).
Captulo16CollectionsframeworkPgina170
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
Possveisaesemumiterador:
ContaCorrentec=
(ContaCorrente)iterator.next();
PrimeirocriamosumIteratorqueentranacoleo.
Acadachamadadomtodonext,oIteratorretornao
prximoobjetodoconjunto.
Umiteratorpodeserobtidocomomtodo iterator()
deCollection,porexemplo:
Iteratori=lista.iterator();
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.
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. }
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. }
Eleummapapoispossvelusloparamapearumachave,porexemplo:mapeieo
valorCaelumchaveescola,oumapeieRuaVergueirochaverua.
Captulo16CollectionsframeworkPgina172
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
chaves valores
Possveisaesemummapa:
Mapeieumachaveaumvalor
OqueestmapeadonachaveX?
Remapeieumacertachave
Querooconjuntodechaves.
Querooconjuntodevalores.
DesmapeieachaveX.
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
Apesardomapafazerpartedoframework,elenoimplementa
a interface Collection, por ter um comportamento bem diferente.
Porm,ascoleesinternasdeummapa(adechaveseadevalores,
verFigura7)soacessveispormtodosdefinidosnainterfaceMap.
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.
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!
3)(opcional)Faatestescomo Map<String,ContaCorrente>,comovistonesse
captulo.
Captulo16CollectionsframeworkPgina176
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
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.
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);
classMinhaThreadextendsThread{
publicvoidrun(){
//cdigoaserexecutadopelaThread
}
}
Enoseumain:
MinhaThreadt=newMinhaThread();
t.start();
Apesardeserumcdigomaissimples,vocestusandoheranaapenasporfacilidade,
enoporpolimorfismo,queseriaagrandevantagem.PrefiraimplementarRunnableaherdar
deThread.
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. }
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. }
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?
Podemos fazer isso em Java. Podemos usar qualquer objeto como um lock (trava,
chave),parapodersincronizaremcimadesseobjeto,isto,seumaThreadentraremumbloco
LOCK
quefoidefinidocomosincronizadoporesselock,apenasumaThreadpoderestarldentroao
mesmotempo,poisachaveestarcomela.
QueremosentobloquearoacessosimultneoaumamesmaConta:
Captulo17ThreadsPgina182
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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).
Vocpodeseperguntarporquenousamossempreessasclassesthreadsafe.Adquirir
umlocktemumcusto,ecasoumobjetonovaserusadoentrediferentesthreads,noh
porqueusaressasclassesqueconsomemmaisrecursos.Masnemsemprefcilenxergarse
devemossincronizarumbloco,ousedevemosutilizarblocossincronizados.
Antigamenteocustodeseusarlockseraaltssimo,hojeemdiaissocustapoucoparaa
JVM,masnomotivoparavocsincronizartudosemnecessidade.
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
Ondecontinuaraoterminaro'JavaeOrientaoaObjetos'.
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
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.
Consulteositeoficialdo'FJ'emwww.caelum.com.brpararecebermaisinformaes.
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.
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.
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.
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();
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
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
UtilizandoaAPIdoSiwngparafazerintrefacesgrficasemJava
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.
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;
}
Issoexibiraseguintetela:
NestaclasseJoptionPane,haindaoutrosmtodosparaexibirjanelasdeconfirmao
(Ok/Cancelar)ejanelasparaentradadedadospelousurio(input).
AAPIdoSwingtrazumasriedecomponentesvisuaisprontosparauso.Socamposde
texto, botes, checkboxes, labels, tabelas, rvores e muitos outros. Para comear nosso
formulrioiremosusardoiscomponentes:umcampodetexto(JTextField)eumaetiqueta/label
(JLabel):
TodocomponenteSwingdeveseradicionadoaumcontiner(Container)queadministrar
oagrupamentoeexibiodosmesmos.Usaremosocontainermaiscomum,umJpanel(algo
comoumpaineldecomponentes).Atravsdeseumtodoaddconseguimosadicionarnossos
componentes:
// 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.
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.*;
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Aorodaresteprograma,teremosaseguintetelaparadigitaodonome:
Captulo20ApndiceBSwingbsicoPgina197
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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):
Issoacrescentarobotoaoformulrio,mascomodispararummtodoquandooboto
for clicado? O Swing nos traz o conceito de Listeners (ouvintes), que so interfaces que
implementamoscommtodosparaseremdisparadosporeventos.
Nonossocaso,parafazerummtododispararaocliquedoboto,usamosainterface
ActionListener.EssainterfacenosdummtodoactionPerformed:
Vamos fazer ento nossa prpria classe formulrio implementar essa interface e esse
mtodo.Queremos,quandoobotoforclicado,pegarotextodigitadopelousurioeexibirna
tela(vamosusaroJOptionPaneparaisso).NossomtodoactionPerformedficadestaforma:
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:
button.addActionListener(this);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Captulo20ApndiceBSwingbsicoPgina199
Caelumhttp://www.caelum.com.brJava e Orientao a Objetos
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.
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.
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.
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();
}
}
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.
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
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));
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
VocpodepegarumDatedeumCalendareviceversaatravsdosgettersesettersde
time:
Calendarc=newGregorianCalendar(2005,Calendar.OCTOBER,12);
Dated=c.getTime();
c.setTime(d);
Issofazcomquevocpossaoperarcomdatasdamaneiranova,mesmoqueasAPIs
aindausemobjetosdotipoDate(comoocasodejava.sql).
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
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.
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.
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)
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
ii