Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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
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
vi
captulo
Comoomaterialestorganizadoedicasdecomoestudaremcasa.
Ocurso
ParaaquelesqueestofazendoocursoJavaeOrientaoaObjetos,recomendadoestudarem
casaaquiloquefoivistoduranteaaula,tentandoresolverosexercciosquenoforamfeitoseos
desafiosqueestolparaenvolvermaisoleitornomundodeJava.
ConvenesdeCdigo
ParamaisinformaessobreasconvenesdecdigofonteJava,acesse:
http://java.sun.com/docs/codeconv/
Existemtambm,emdeterminadoscaptulos,umasriededesafios.Elesfocammaisno
problemacomputacionalquenalinguagem,pormsoumaexcelenteformadetreinarasintaxe
eprincipalmentefamiliarizaroalunocomabibliotecapadroJava,almdeproporcionarum
ganhonavelocidadededesenvolvimento.
Captulo1ComoaprenderJavaPgina2
captulo
O que Java
ChegouahoraderesponderasperguntasmaisbsicassobreJava.Aotrminodessecaptulovoc
sercapazde:
responderoqueJava;
mostrarasvantagensedesvantagensdeJava;
compilareexecutarumprogramasimples.
2.1 - Java
MuitosassociamJavacomumamaneiradedeixarsuaspginasdawebmaisbonitas,
comefeitosespeciais,ouparafazerpequenosformulriosnaweb.
OqueassociaasempresasaoJava?
Jiremoschegarnesteponto,masantesvamosveromotivo peloqualasempresas
fogemdasoutraslinguagens:
Quaissoosseusmaioresproblemasquandoestprogramando?
PLATAFORMA
JAVA
SUN
ponteiros?
liberarmemria?
organizao?
faltadebibliotecasboas?
terdereescreverpartedocdigoaomudardesistemaoperacional?
custodeusaratecnologia?
Java tenta amenizar esses problemas. Alguns desses objetivos foram atingidos muito
tempoatrs,porque,antesdoJava1.0sair,aidiaquealinguagemfosseusadaempequenos
dispositivos,comotvs,aspiradores,liquidificadoreseoutros.Apesardissoalinguagemteveseu
lanamentomirandoousodelanosclientesweb(browsers)pararodarpequenasaplicaes
(applets).Hojeemdiaessenomaisofocodalinguagem.
OJavadesenvolvidoemantidopelaSun(http://www.sun.com)eseusiteprincipalo
http://java.sun.com.(java.comumsitemaisinstitucional,voltadoaoconsumidordeprodutose
usuriosleigos,nodesenvolvedores).
AhistriadoJava
ASuncriouumtime(conhecidocomoGreenTeam)paradesenvolverinovaestecnolgicasem
1992.EssetimefoilideradoporJamesGosling,consideradoopaidoJava.Otimevoltoucoma
idiadecriaruminterpretador(jeraumamquinavirtual,veremosoqueissomaisafrente)
parapequenosdispositivos,facilitandoareescritadesoftwareparaaparelhoseletrnicos,como
vdeocassete,televisoeaparelhosdetvacabo.
Captulo2OqueJavaPgina3
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.
CdigofonteemC
compila
Cdigobinriopara
umdeterminadorSO
Essecdigoexecutvel(binrio)resultanteserexecutadopelosistemaoperacionale,
poressemotivo,eledevesaberconversarcomosistemaoperacionalemquesto.
Captulo2OqueJavaPgina4
Windows
SistemaOperacional
Cdigobinriopara
Linux
Linux
Isto,temosumcdigoexecutvelparacadasistemaoperacional.necessriocompilar
umavezparaWindows,outraparaoLinux,etc...
Como foi dito anteriormente, na maioria das vezes, a sua aplicao se utiliza das
bibliotecasdosistemaoperacional,como,porexemplo,adeinterfacegrficaparadesenharas
'telinhas'.AbibliotecadeinterfacegrficadoWindowsbemdiferentedasdoLinux;resultado?
Voc precisa reescrever o mesmo pedao da aplicao para diferentes sistemas
operacionais,jqueelesnosocompatveis.
MQUINA
VIRTUAL
Bytecodejava
MquinaVirtualJava
paraLinux
MquinaVirtualJava
ParaWindows
Linux
Windows
Dessaforma,amaneiraaqualvocabreumajanelanoLinuxounoWindowsamesma:
voc ganha independncia de sistema operacional. Ou, melhor ainda, independncia de
plataformaemgeral:noprecisosepreocuparemqualsistemaoperacionalsuaaplicaoest
rodando,nememquetipodemquina,configuraesetc.
Repare que uma mquina virtual um conceito bem mais amplo que o de um
interpretador.Comooprprionomediz,umamquinavirtualcomoumcomputadordementira:
ela tem tudo que um computador tem. Em outras palavras, ela responsvel por gerenciar
memria, gerenciar threads, a pilha de execuo, etc. Sua aplicao roda sem nenhum
envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual
Machine (JVM).Essacaractersticainteressante:comotudopassarpelaJVM,elapodetirar
mtricas, decidir onde melhor alocar amemria,entre outros. UmaJVMisola a aplicao
totalmentedosistemaoperacional.SeumaJVMterminaabruptamente,sasaplicaesque
estavam rodando nela iro terminar: isso no afetar outras JVMs que estejam rodando no
mesmocomputador,nemafetarosistemaoperacional.Essacamadadeisolamentotambm
interessantequandopensamosemumservidorquenopodesesujeitararodarcdigoque
Captulo2OqueJavaPgina5
possaavirainterferirnaboaexecuodeoutrasaplicaes.
BYTECODE
Writeonce,runanywhere
EsseumsloganqueaSunusaparaoJava,jquevocnoprecisareescreverpartedasua
aplicaotodavezquequisermudardesistemaoperacional.
Muitaspessoascriticamoucriampiadasemcimadesseslogan,poracharemquenemsempre
umaaplicaoJavapoderodaremduasplataformasdiferentessemproblemas.
ComoJava1.2houveumaumentograndenotamanhodaAPI,efoinessemomentoem
quetrocaramanomenclaturadeJavaparaJava2,comoobjetivodediminuiraconfusoentre
JavaeJavascript.Maslembrese,nohversodoJava2.0,o2foiincorporadoaonome:
Java21.2.
DeposvieramoJava21.3e1.4,eoJava1.5passouasechamarJava5,tantoporuma
questodemarketingeporquemudanassignificativasnalingaugemforamincludas.nesse
momentoqueo2donomeJavadesaparece.Reparequeparafinsdedesenvolvimento,oJava
5aindareferidocomoJava1.5.
Ataverso1.4existiaaterceiranumerao(1.3.1,1.4.1,1.4.2,etc),indicandobugfixese
melhorias.ApartirdoJava5existemapenasupdates:Java5update7,porexemplo.
O Java 6 est previsto para o fim de 2006, mas sem mudanas na especificao da
linguagem.
Captulo2OqueJavaPgina6
ExistecompatibilidadeparatrsemtodasasversesdoJava.Umclassgeradopelojavac
daverso1.2precisanecessariamenterodardaJVM5.0.
JVMsdisponveis,comoaJrockitdaBEA,entreoutras.
Issooutropontointeressanteparaasempresas.Casoelasnoestejamgostandode
algumdetalhedaJVMdaSun,ouprefiramtrabalharcomoutraempresapagandoporsuporte,
elaspodemtrocardeJVMtendoagarantiaabsolutaquetodoosistemacontinuarfuncionando,
tendoemvistaqueelacertificadapelaSun,precisandoaceitaromesmobytecode.Vocnem
precisarecompilarnenhumadesuasclasses.
Almdeindependnciadehardwareesistemaoperacional,voctemaindependnciade
vendor:graasaidiadaJVMserumaespecificaoenoumsoftware.
docursoautilizaodospacotesjava.io,java.utilejava.netreforarotodonossoaprendizado,
tendo em vista que essas bibliotecas foram desenvolvidas com o objetivo de reutilizao e
extenso,entoelasabusamdosconceitospreviamentevistos.
CLASSPATH
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
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.
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
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.
MAIN
Omiolodoprogramaoqueserexecutadoquandochamamosamquinavirtual.Por
enquanto,todasaslinhasanteriores,ondehadeclaraodeumaclasseeadeummtodo,
noimportaparans.MasdevemossaberquetodaaplicaoJavacomeaporumpontode
entrada,eestepontodeentradaummtodomain.
Aindanosabemosoquemtodo,masveremosnocaptulo4.Atl,nosepreocupe
comessasdeclaraes.Semprequeumexerccioforfeito,ocdigosempreestarnessemiolo.
Nocasodonossocdigo,alinhado System.out.println fazcomqueocontedo
entreaspassejacolocadonatela.
2.13 - E o bytecode?
OMeuPrograma.classgeradonolegvelporsereshumanos(noquesejaimpossvel).
Eleestescritonoformatoqueavirtualmachinesabeentenderequefoiespecificadoqueela
Captulo2OqueJavaPgina11
deveentender.
como um assembly, escrito para esta mquina em especfico. Podemos ler os
menmnicosutilizandoaferramentajavapqueacompanhaoJDK:
javapcMeuPrograma
Easada:
MeuPrograma();
Code:
0:aload_0
1:invokespecial#1;//Methodjava/lang/Object."<init>":()V
4:return
publicstaticvoidmain(java.lang.String[]);
Code:
0:getstatic#2;//Fieldjava/lang/System.out:Ljava/io/PrintStream;
3:ldc#3;//StringMinhaprimeiraaplicaoJava!!
5:invokevirtual#4;//Method
java/io/PrintStream.println:(Ljava/lang/String;)V
8:return
}
ocdigoacimaqueaJVMsabeler.Sim,umbytecodepodeserrevertidoparao.java
original(comperdadecomentriosenomesdevariveislocais).Casoseusoftwarevvirarum
produtodeprateleira,fundamentalpassarumobfuscadornoseucdigo,quevaiembaralhar
classes,mtodoseummontedeoutrosrecursos.(vejahttp://proguard.sf.net).
2.14 - Exerccios
1)Altereseuprogramaparaimprimirumamensagemdiferente.
2)Altereseuprogramaparaimprimirduaslinhasdetextousandoduaslinhasdecdigo
System.out.
3) Sabendo que os caracteres \n representam uma quebra de linhas, imprima duas
linhasdetextousandoumanicalinhadecdigoSystem.out.
Captulo2OqueJavaPgina12
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
captulo
IremosaprenderatrabalharcomosseguintesrecursosdalinguagemJava:
declarando,atribuindovalores,castingecomparandovariveis;
controledefluxoatravsdeifeelse;
instruesdelaoforewhile,controledefluxocombreakecontinue.
Dentrodeumbloco,podemosdeclararvariveiseuslas.
EmJava,todavariveltemumtipoquenopodesermudadoumavezquedeclarado:
tipoDaVaravelnomeDaVarivel;
INT
Porexemplo,possvelterumaidadequevaleumnmerointeiro:
intidade;
Comisso,vocdeclaraavarivelidade,quepassaaexistirapartirdestemomento.Ela
do tipo int, que guarda umnmero inteiro. A partir de agora voc pode usla, primeiro
atribuindovalores.
Alinhaaseguiratraduodeidade deve valer agora quinze.
idade=15;
ComentriosemJava
Parafazerumcomentrioemjava,vocpodeusaro // paracomentaratofinaldalinha,ou
entousaro/**/paracomentaroqueestiverentreeles.
/*comentriodaqui,
ateaqui*/
//umalinhadecomentriosobreaidade
intidade;
Almdeatribuir,vocpodeutilizaressevalor.Ocdigoaseguirdeclaranovamentea
varivel idade com valor 15 e imprime seu valor na sada padro atravs da chamada a
System.out.println.
//declaraaidade
intidade;
idade=15;
Captulo3VariveisprimitivaseControledefluxoPgina14
//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.
Por exemplo, para imprimir a idade e a idadeNoAnoQueVem podemos escrever o seguinte
programadeexemplo:
1.classTestaIdade{
2.
3.
publicstaticvoidmain(String[]args){
4.
5.
//declaraaidade
6.
intidade;
7.
idade=15;
8.
9.
//imprimeaidade
10.
System.out.println(idade);
11.
12.
//geraumaidadenoanoseguinte
13.
intidadeNoAnoQueVem;
14.
idadeNoAnoQueVem=idade+1;
15.
16.
//imprimeaidade
17.
System.out.println(idadeNoAnoQueVem);
18.
19.
}
20.}
Captulo3VariveisprimitivaseControledefluxoPgina15
Representarnmerosinteirosfcil,mascomoguardarvaloresreais,comofraesde
nmerosinteiroseoutros?Outrotipodevarivelmuitoutilizadoodouble,quearmazenaum
nmerocompontoflutuante.
DOUBLE
doubled=3.14;
doublex=5*10;
BOOLEAN
Otipobooleanarmazenaumvalorverdadeirooufalso,es.
booleanverdade=true;
Otipo char guardaumeapenasumcaractere.Essecaracteredeveestarentreaspas
simples. No se esquea dessas duas caractersticas de uma varivel do tipo char! Por
exemplo,elanopodeguardarumcdigocomopoisovazionoumcaractere!
CHAR
charletra='a';
System.out.println(letra);
EssestiposdevariveissotiposprimitivosdoJava:ovalorqueelasguardamsooreal
contedo da varivel. Quando voc utilizar o operador de atribuio = o valor ser
copiado.
inti=5;//irecebeumacpiadovalor5
intj=i;//jrecebeumacpiadovalordei
i=i+1;//ivira6,jcontinua5
Aqui,ificacomovalorde6.Masej?Nasegundalinha,jestvalendo5.Quandoi
passaavaler6,serquejtambmficavalendo?No,poisovalordeumtipoprimitivosempre
copiado.
Apesardalinha2fazerj=i,apartirdessemomentoessasvariveisnotemrelao
nenhuma:oqueacontecercomumanorefleteemnadacomaoutra.
Outrostiposprimitivos
Vimosaquiostiposprimitivosquemaisaparecem.OJavatemoutros,quesoo byte, short,
longefloat.
Cada tipo possui caractersticas especiais que, para um programador avanado, podem fazer
muitadiferena.
3.3 - Exerccios
1)Naempresaondetrabalhamos,htabelascomoquantofoigastoemcadams.Para
fechar o balano do primeiro trimestre, precisamos somar o gasto total. Sabendo que, em
Janeirofoigasto15000reais,emFevereiro,23000reais eemMaro,17000reais,faaum
programaquecalculeeimprimaogastototalnotrimestre.Sigaessespassos:
a) Crie uma classe chamada BalancoTrimestral com um bloco main, como nos
exemplosanteriores;
Captulo3VariveisprimitivaseControledefluxoPgina16
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
usurio,eningumvaigarantirqueessaconversoocorrasemperdadevalores.
Jnocasoaseguirocontrrio:
inti=5;
doubled2=i;
Ocdigoacimacompilasemproblemas,jqueum double podeguardarumnmero
com ou sem ponto flutuante. Todos os inteiros representados por uma varivel do tipo int
podemserguardadosemumavariveldouble,entonoexistemproblemasnocdigoacima.
CASTING
svezes,precisamosqueumnmeroquebradosejaarredondadoearmazenadonum
nmerointeiro.Parafazerissosemquehajaoerrodecompilao,precisoordenarqueo
nmeroquebradosejamoldado (casted)comoumnmerointeiro.Esseprocessorecebeo
nomedecasting.
doubled3=3.14;
inti=(int)d3;
Ocastingfoifeitoparamoldaravariveld3comoumint.Ovalordelaagora3.
Omesmoocorreentrevaloresintelong.
longx=10000;
inti=x;//naocompila,poispodeestarperdendoinformao
E,sequisermosrealmentefazerisso,fazemosocasting:
longx=10000;
inti=(int)x;
Casosnotocomunsdecastingeatribuio
Algunscastingsaparecemtambm:
floatx=0.0;
Ocdigoacimanocompilapoistodososliteraiscompontoflutuantesoconsideradosdouble
pelo Java. E float no pode receber um double sem perda de informao, para fazer isso
funcionarpodemosescreveroseguinte:
floatx=0.0f;
Aletra f,quepodesermisculaouminscula,indicaqueaqueleliteraldevesertratadocomo
float.
longl=0.0L;
AletraL,quetambmpodesermisculaouminscula,indicaqueaqueleliteraldevesertratado
comolong.
Outrocaso,quemaiscomum:
doubled=5;
floatf=3;
floatx=(float)d+f;
Captulo3VariveisprimitivaseControledefluxoPgina18
VocprecisadocastingporqueoJavafazascontasevaiarmazenandosemprenomaiortipoque
apareceuduranteasoperaes,nocasoodouble.
Eumaobservaonomnimo,oJavaarmazenaemumint,nahoradefazerascontas.
Atcastingcomvariveisdotipo char podemocorrer.Onicotipoprimitivoquenopodeser
atribudoanenhumoutrotipooboolean.
Castingspossveis
AbaixoestorelacionadostodososcastspossveisnalinguagemJava,mostrandoquandovoc
querconverterdeumvalorparaoutro.AindicaoImpl.querdizerqueaquelecastimplcitoe
automtico,ouseja,vocnoprecisaindicarocastexplicitamente.(lembrandoqueotipoboolean
nopodeserconvertidoparanenhumoutrotipo)
PARA:
byte
short
char
int
long
float
double
byte
Impl.
(char)
Impl.
Impl.
Impl.
Impl.
short
(byte)
(char)
Impl.
Impl.
Impl.
Impl.
char
(byte)
(short)
Impl.
Impl.
Impl.
Impl.
int
(byte)
(short)
(char)
Impl.
Impl.
Impl.
long
(byte)
(short)
(char)
(int)
Impl.
Impl.
float
(byte)
(short)
(char)
(int)
(long)
Impl.
double
(byte)
(short)
(char)
(int)
(long)
(float)
DE:
Tamanhodostipos
Natabelaabaixo,estoostamanhosdecadatipoprimitivodoJava.
TIPO
TAMANHO
boolean
1bit
byte
1byte
short
2bytes
char
2bytes
int
4bytes
float
4bytes
long
8bytes
double
8bytes
3.5 - O If-Else
IF
AsintaxedoifnoJavaaseguinte
if(condicaoBooleana){
codigo;
}
Uma condio booleana qualquerexpressoque retorne true ou false.Para
Captulo3VariveisprimitivaseControledefluxoPgina19
isso,vocpodeusarosoperadores<,>,<=,>=eoutros.Umexemplo:
CONDIO
BOOLEANA
intidade=15;
if(idade<18){
System.out.println("Nopodeentrar");
}
Almdisso,vocpodeusaraclusulaelseparaindicarocomportamentoquedeveser
executadonocasodaexpressobooleanaserfalsa:
ELSE
intidade=15;
if(idade<18){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
OPERADORES
Voc pode concatenar expresses booleanas atravs dos operadores lgicos
LGICOS
OU.OErepresentadopelo&eoOUrepresentadopelo|.
E e
intidade=15;
booleanamigoDoDono=true;
if(idade<18&amigoDoDono==false){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
OPERADOR
DE NEGAO
Essecdigopoderiaaindaficarmaislegvel,utilizandoseooperadordenegao,o !.
Esseoperadortransformaumaexpressobooleanadefalseparatrueeviceversa.
intidade=15;
booleanamigoDoDono=true;
if(idade<18&!amigoDoDono){
System.out.println(Nopodeentrar);
}
else{
System.out.println(Podeentrar);
}
Reparenalinha3queotrechoamigoDoDono==false virou!amigoDoDono.Eles
tm o mesmo valor.
Paracompararseumavariveltemomesmovalorqueoutravarivelouvalor,utilizamos
ooperador ==.Reparequeutilizarooperador = vairetornarumerrodecompilao,jqueo
operador=odeatribuio.
intmes=1;
if(mes==1){
System.out.println(Vocdeveriaestardefrias);
}
&&ou&?
Emalgunslivros,logoserapresentadoavocdoistiposdeoperadoresdeOUedeE.Voc
realmentenoprecisasaberdistinguiradiferenaentreelesporenquanto.
Oqueacontecequeosoperadores && e || funcionamcomoseusoperadoresirmos,porm
Captulo3VariveisprimitivaseControledefluxoPgina20
elesfuncionamdamaneiramaisrpidapossvel,quandopercebemquearespostanomudar
mais, eles param de verificar as outras condies booleanas. Por isso eles so chamados de
operadoresdecurtocircuito(shortcircuitoperators).
if(true|algumaCoisa){
//...
}
OvalordealgumaCoisaseranalisadonessecaso.Reparequenoprecisaria,poisjtemosum
true.trueouqualqueroutracoisadsempretrue.
if(true||algumaCoisa){
//...
}
NestecasooalgumaCoisanoseranalisado.Podenofazersentidoterasduasopes,mas
em alguns casos interessante e til usar um ou outro, alm de dar diferena no resultado.
Veremosmaisadianteemoutroscaptulos.
3.6 - O While
LAO
WHILE
Owhileumcomandousadoparafazerumlao(loop),isto,repetirumtrechode
cdigo algumas vezes. A idia que esse trecho de cdigo seja repetido enquanto uma
determinadacondiopermanecerverdadeira.
intidade=15;
while(idade<18){
System.out.println(idade);
idade=idade+1;
}
Otrechodentrodoblocodo while serexecutadoatomomentoemqueacondio
idade<18 passeaserfalsa.Eissoocorrerexatamentenomomentoemque idade==
18,oquenoofarimprimir18.
inti=0;
while(i<10){
System.out.println(i);
i=i+1;
}
Jowhileacimaimprimede0a9.
3.7 - O For
FOR
Outrocomandodeloopextremamenteutilizadoofor.Aidiaamesmadowhile,
fazerumtrechodecdigoserrepetidoenquantoumacondiocontinuarverdadeira.Masalm
disso,o for isolatambmumespaoparainicializaodevariveiseomodificadordessas
variveis.Issofazcomquefiquemaislegvelasvariveisquesorelacionadasaoloop:
for(inicializacao;condicao;incremento){
codigo;
}
Umexemplooaseguir:
for(inti=0;i<10;i=i+1){
System.out.println(ol!);
}
Captulo3VariveisprimitivaseControledefluxoPgina21
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;
y");
BREAK
Ocdigoacimavaipercorrerosnmerosdexayepararquandoencontrarumnmero
divisvelpor19,umavezquefoiutilizadaapalavrachavebreak.
CONTINUE
Da mesma maneira, possvel obrigar o loop a executar o prximo lao. Para isso
usamosapalavrachavecontinue.
for(inti=0;i<100;i++){
if(i>50&&i<60){
continue;
}
System.out.println(i);
}
Ocdigoacimanovaiimprimiralgunsnmeros.(Quaisexatamente?)
Captulo3VariveisprimitivaseControledefluxoPgina22
//aquiavarivelinoexiste
inti=5;
//apartirdaquielaexiste
ESCOPO
//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
}
System.out.println(i);
Umasituaoparecidapodeocorrercomofor:
for(inti=0;i<10;i++){
System.out.println("ol!");
}
System.out.println(i);//cuidado!
Nesteforavarivelimorreaoseutrmino,nopodendoseracessadadeforadofor,
umerrodecompilao.Sevocrealmentequeracessarocontadordepoisdoloopterminar,
precisadealgocomo:
inti;
for(i=0;i<10;i++){
System.out.println("ol!");
}
System.out.println(i);
3.12 - Exerccios
Captulo3VariveisprimitivaseControledefluxoPgina24
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
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
captulo
Aotrminodestecaptulo,vocsercapazde:
dizeroqueeparaqueserveorientaoaobjetos,
conceituarclasses,atributosecomportamentose
entenderosignificadodevariveiseobjetosnamemria.
Orientaoobjetosumamaneiradeprogramarqueajudanaorganizaoeresolve
muitosproblemasenfrentadospelaprogramaoprocedural.
ConsideremosoclssicoproblemadavalidaodeumCPF. Normalmente, temosum
formulrio,noqualrecebemosessainformao,edepoistemosqueenviaressescaracteres
paraumafunoqueirvalidlo,comonopseudocdigoabaixo:
cpf=formulario>campo_cpf
valida(cpf)
AlgumteobrigaasemprevalidaresseCPF?Vocpode,inmerasvezes,esquecerde
chamaressevalidador.Mais:considerequevoctem50formulrioseprecisevalidaremtodos
elesoCPF.Sesua equipetem3programadorestrabalhandonessesformulrios,quem fica
responsvelporessavalidao?Todos!
Asituaopodepiorar:naentradadeumnovodesenvolvedor,precisaramosavisloque
sempredevemosvalidarocpfdeumformulrio.nessemomentoquenasceaquelesguiasde
programaoparao desenvolvedor quefor entrarnesse projeto (as vezes um documento
enorme). Em outras palavras, todo desenvolvedor precisaficar sabendo de umaquantidade
enormedeinformaes,quenamaioriadasvezesnoestrealmenterelacionadoasuaparte
nosistema,maseleprecisalertudoisso,resultandoumentravemuitogrande!E
Outro ponto onde fica claro os problemas da programao procedural quando nos
encontamosnanecessidadedelerocdigoquefoiescritoporoutrodesenvolvedorequesomos
usurio desse pedao do sistema. Um sistema bem encapsulado no deveria gerar essa
necessidade.Emumsistemagrandesimplesmentenotemostempodelerumagrandeparte
docdigo.
Considerando que voc no erre a e quesua equipe tem uma comunicao muitog
rande (perceba que comunicao excessiva pode ser prejudicial e atrapalhar o andamento),
aindatemosoutroproblema:imaginequeagoraemtodoformulriovoctambmquerquea
idadedoclientetambmsejavalidada,precisesermaiorde18anos.Vamosterdecolocarum
if...masonde?Espalhadoportodoseucdigo...Mesmoquesecrieoutrafunoparavalidar,
precisaremos incluir isso nos nossos 50 formulrios j existentes. Qual a chance de
esquecermosemumdeles?muitogrande.
Captulo4OrientaoaobjetosbsicaPgina27
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.
Captulo4OrientaoaobjetosbsicaPgina28
Reparenafigura:apesardopapeldoladoesquerdoestarespecificadoumaConta,essa
especificaoumaConta?Nsdepositamosesacamosdinheirodessepapel?No.Utilizamos
aespecificaodaContaparapodercriarinstncias,querealmentesocontas,ondepodemos
realizarasoperaesquecriamos.Apesardedeclararmosquetodacontatemumsaldo,um
nmeroeumaagncianopedaodepapel(comoaesquerdanafigura),sonasinstncias
desseprojetoquerealmentehespaoparaarmazenasessesvalores.
CLASSE
Captulo4OrientaoaobjetosbsicaPgina29
classConta{
intnumero;
Stringnome;
doublesaldo;
doublelimite;
//..
}
String
StringumaclasseemJava.Elaguardaumapalavra,issoumpunhadodecaracteres.Como
estamosaprendendooqueumaclasse,entenderemoscomdetalhesaclasseStringapenasem
captulosposteriores.
ATRIBUTO
Porenquantodeclaramosoquetodacontadeveter.Estessoosatributos quetoda
conta,quandocriada,vaiter.Reparequeessasvariveisforamdeclaradasforadeumbloco,
diferentedoqueagentefaziaquandotinhaaquele main.Quandoumavariveldeclarada
diretamentedentrodoescopodaclasse,chamadadevariveldeobjeto,ouatributo.
Atravs da varivel minhaConta agora podemos acessar o objeto recm criado para
alterarseunome,seusaldoetc:
1.classPrograma{
2.
publicstaticvoidmain(String[]args){
3.
ContaminhaConta;
4.
minhaConta=newConta();
5.
6.
minhaConta.nome=Duke;
7.
minhaConta.saldo=1000.0;
8.
9.
System.out.println(Saldoatual:+minhaConta.saldo);
10.
}
11.}
importantefixarqueo ponto foiutilizadoparaacessaralgoem minhaConta.Agora,
minhaContapertenceaoDuke,etemsaldodemilreais.
4.5 - Mtodos
Dentrodaclasse,tambmiremosdeclararoquecadacontafaz,ecomoistofeito.Os
comportamentosquecadaclassetem,isto,oqueelafaz.Porexemplo,dequemaneiraque
umaContasacadinheiro?IremosespecificarissodentrodaprpriaclasseConta,enoemum
local desatrelado das informaes da prpria Conta.. por isso que essas funes so
chamadasdemtodoPoisamaneiradefazerumaoperaocomumobjeto.
MTODO
Apalavrachavevoiddizque,quandovocpedirparaacontaimprimironomedobanco,
nenhumainformaoserenviadadevoltaaquempediu.
ARGUMENTO
Quando algum pedir para sacar, ele tambm vai dizer quanto quer sacar. Por isso
precisamosdeclararomtodocomalgodentrodosparnteses,oquevaiadentrochamado
deargumentodomtodo(ouparmetro).Essavarivelumavarivelcomum,chamada
tambmdetemporriaoulocal,poisaofinaldaexecuodessemtodo,eladeixadeexistir.
PARMETRO
THIS
Dentrodomtodo,estamosdeclarandoumanovavarivel.Essavarivel,assimcomoo
argumento, vai morrer no fim do mtodo, pois este seu escopo. No momento que vamos
acessarnossoatributo,usamosapalavrachave this paramostrarqueesseumatributo,e
noumasimplesvarivel.(veremosdepoisqueopcional)
Reparequenessecaso,acontapodeestourarolimitefixadopelobanco.Maisparafrente
iremosevitaressasituao,edeumamaneiramuitoelegante.
Damesmaforma,temosomtodoparadepositaralgumaquantia:
voiddeposita(doublequantidade){
this.saldo+=quantidade;
}
Captulo4OrientaoaobjetosbsicaPgina31
Observeque,agora,nousamosumavarivelauxiliareaindausamosaabreviao+=
paradeixaromtodobemsimples.O+=somaquantidadeaovalorantigodosaldoeguardano
prpriosaldoovalorresultante.
INVOCAO
DE MTODO
Paramandarumamensagemaoobjeto,epedirqueeleexecuteummtodo,tambm
usamosoponto.Otermousadoparaissoumainvocao de mtodo.
Ocdigoaseguirsacaumdinheiroedepoisdepositaoutraquantiananossaconta:
1.classSacaEDeposita{
2.
publicstaticvoidmain(String[]args){
3.
//criandoaconta
4.
ContaminhaConta;
5.
minhaConta=newConta();
6.
7.
//alterandoosvaloresdeminhaConta
8.
minhaConta.nome="Duke";
9.
minhaConta.saldo=1000;
10.
11.
//saca200reais
12.
minhaConta.saca(200);
13.
14.
//deposita500reais
15.
minhaConta.deposita(500);
16.
System.out.println(minhaConta.saldo);
17.
}
18.}
Umavezqueseusaldoinicial1000reais,sesacamos200reais,depositamos500reais
eimprimimosovalordosaldo,oqueserimpresso?
RETURN
Agoraadeclaraodomtodomudou!Omtodosacanotemvoidnafrente,istoquer
dizerque,quandoacessado,eledevolvealgumtipodeinformao.Nocaso,umboolean.A
palavrachavereturnindicaqueomtodovaiterminarali,retornandotalinformao.
Captulo4OrientaoaobjetosbsicaPgina32
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.}
Quandodeclaramosumavarivelparaassociaraumobjeto,naverdade,essavarivel
noguardaoobjeto,esimumamaneiradeacesslo,chamadadereferncia.
poressemotivoque,diferentedostiposprimitivoscomointelong,precisamosdarnew
depoisdedeclaradaavarivel:
1.publicstaticvoidmain(Stringargs[]){
2.
Contac1;
3. c1=newConta();
4.
5. Contac2;
6.
c2=newConta();
7.}
Captulo4OrientaoaobjetosbsicaPgina33
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
Contac1=newConta();
Contac2=c1;
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
pensarqueo== comparaseosobjetos(refernciasnaverdade)soomesmo,enoseso
iguais.
Parasabersedoisobjetostemomesmocontedo,vocprecisacompararatributopor
atributo.Veremosumasoluomaiseleganteparaissotambm.
Paradeixarocdigomaisrobusto,poderamosverificarseacontapossuiaquantidadea
sertransferidadisponvel.Paraficaraindamaisinteressante,vocpodechamarosmtodos
depositaesacajexistentesparafazeressatarefa:
classConta{
//atributosemetodos...
Captulo4OrientaoaobjetosbsicaPgina36
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.
Voctambmpodedarvalores default,comosegue:
1.classConta{
2.
intnumero=1234;
3.
Stringdono="Duke";
4.
Stringcpf="123.456.78910";
5.
doublesaldo=1000;
6.
doublelimite=1000;
Captulo4OrientaoaobjetosbsicaPgina37
7.}
Nessecaso,quandovoccriarumcarro,seusatributosjestopopuladoscomesses
valorescolocados.
Imagine que agora comeamos a crescer nossa classe Conta e adicionar nome,
sobrenomeecpfdoclientedonodaconta.Comearamosatermuitosatributos...esevoc
pensardireito,umaContanotemnome,nemsobrenomenemcpf,quemtemessesatributos
umCliente.Entopodemoscriarumanovaclasseefazerumacomposio
Seusatributostambmpodemserrefernciasparaoutrasclasses.Suponhaaseguinte
classeCliente:
1.classCliente{
2.
Stringnome;
3.
Stringsobrenome;
4.
Stringcpf;
5.}
1.classConta{
2.
intnumero;
3.
doublesaldo;
4.
doublelimite;
5.
Clientecliente;
6.
//..
7.}
Edentrodomaindaclassedeteste:
1.classTeste{
2.
publicstaticvoidmain(String[]args){
3.
ContaminhaConta=newConta();
4.
Clientec=newCliente();
5.
minhaConta.cliente=c;
6.
//...
7.
}
8.}
Aquisimplesmentehouveumaatribuio.Ovalordavarivelccopiadoparaoatributo
clientedoobjetoaqualminhaContaserefere.Emoutraspalavras,minhaContaagoratem
uma referncia ao mesmo Cliente que c se refere, e pode ser acessado atravs de
minhaConta.cliente.
Vocpoderealmentenavegarsobretodaessaestruturadeinformao,sempreusandoo
ponto:
ClienteclienteDaMinhaConta=minhaConta.cliente;
clienteDaMinhaConta.nome="Duke";
Ouaindapodefazerissodeumaformamaisdireta,eatmaiselegante:
minhaConta.cliente.nome="Duke";
NULL
minhaConta.cliente.nome="paulo";
//...
}
}
Quando damos new em um objeto, ele o incializa com seus valores default, 0 para
nmeros, falsepara booleanenullparareferncias.nullumapalavrachaveemjava,
queindicaumarefernciaparanenhumobjeto.
Seemalgumcasovoctentaracessarumatributooumtododealgumqueestse
referenciando para null, voc receber um erro durante a execuo
(NullPointerException,queveremosmaisafrente).Daparaperceberentoqueonewno
trazumefeitocascata,amenosquevocdeumvalordefault(ouuseconstrutoresquetambm
veremosmaisafrente):
1.classConta{
2.
intnumero;
3.
doublesaldo;
4.
doublelimite;
5.
Clientecliente=newCliente();
6.
7.}
//quandochamaremnewConta,
//haveraumnewClienteparaele.
Captulo4OrientaoaobjetosbsicaPgina39
1.classCarro{
2.
Stringcor;
3.
Stringmodelo;
4.
doublevelocidadeAtual;
5.
doublevelocidadeMaxima;
6.
Motormotor;
7.
8.
//..
9.}
PodemosagoracriardiverosCarrosemexercomseusatributosemtodos,assimcomo
fizemosnoexemplodoBanco.
4.12 - Exerccios
O modelo de funcionrios a seguir ser utilizado para os exerccios de alguns dos
posteriorescaptulos.
OobjetivoaquicriarumsistemaparagerenciarosfuncionriosdoBanco.Osexerccios
dessecaptulosoextremamenteimportantes.
1) Modele um funcionrio. Ele deve ter onome do funcionrio, odepartamento onde
trabalha,seusalrio(double),adatadeentradanobanco(String),seuRG(String),eum
valorbooleanoqueindiqueseofuncionrioestnaempresanomomentoousejfoiembora.
Voc deve criar alguns mtodos de acordo como quevoc sentirnecessidade. Alm
deles,crieummtodo bonifica queaumentao salario dofuncionriodeacordocomo
parmetro passado como argumento. Crie tambm um mtodo demite que no recebe
parmetroalgum,smodificaovalorbooleanoindicandoqueofuncionrionotrabalhamais
aqui.
Aidiaaquiapenasmodelar,isto,sidentifiquequeinformaessoimportantes,eo
queumfuncionriofaz.DesenhenopapeltudooqueumFuncionariotemetudoqueelefaz.
2)TransformeomodeloacimaemumaclasseJava.Testea,usandoumaoutraclasse
quetenhaomain.VocdevecriaraclassedofuncionriochamadaFuncionario,eaclasse
detestevocpodenomearcomoquiser.Adetestedevepossuiromtodomain.
Umesboodaclasse:
Captulo4OrientaoaobjetosbsicaPgina41
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
Todasasclassesnomesmoarquivo?
Porenquanto,vocpodecolocartodasasclassesnomesmoarquivo,eapenascompileesse
arquivo.Elevaigerarosdois.class.
Pormboaprticacriarumarquivo.javaparacadaclasse,eemdeterminadoscasos,vocser
obrigadoadeclararumaclasseemumarquivoseparado,comoveremosnocaptulo10.Istono
importanteparaoaprendizadonomomento.
Captulo4OrientaoaobjetosbsicaPgina43
Funcionariof2=f1;
Oqueacontececomoifdoexerccioanterior?
6)(opcional)Emvezdeutilizaruma String pararepresentaradata,crieumaoutra
classe, chamada Data. Ela possui 3 campos int, para dia, ms e ano. Faa com que seu
funcionrio passe a usla. ( parecido com o ltimo exemplo, que a Conta passou a ter
refernciaparaumCliente).
classFuncionario{
DatadataDeEntrada;//qualovalordefaultaqui?
//seusoutrosatributosemtodos
}
1.classData{
2.
3.
intdia;
4.
intms;
5.
intano;
6.}
ModifiquesuaclasseTestaFuncionarioparaquevoccrieumaDataeatribuaelaao
Funcionario:
Funcionariof1=newFuncionario();
//...
Datadata=newData();//ligao!
f1.dataDeEntrada=data;
FaaodesenhodoestadodamemriaquandocriarmosumFuncionario.
7) (opcional) Modifique seu mtodo mostra para que ele imprima o valor da
dataDeEntradadaqueleFuncionario:
classFuncionario{
//seusoutrosatributosemtodos
DatadataDeEntrada;
voidmostra(){
System.out.println("Nome:"+this.nome);
//imprimiraquiosoutrosatributos...
System.out.println("Dia:"+this.dataDeEntrada.dia);
System.out.println("Ms:"+this.dataDeEntrada.mes);
System.out.println("Ano:"+this.dataDeEntrada.ano);
}
}
Testeo.
Agora,oqueacontecesechamarmosomtodomostraantesdeatribuirmosumadata
paraesteFuncionario?
8)(opcional)Oqueacontecesevoctentaracessarumatributodiretamentenaclasse?
Comoporexemplo:
Captulo4OrientaoaobjetosbsicaPgina44
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)
Classe:Pessoa.
Atributos:nome,idade.
Mtodo:voidfazAniversario()
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
captulo
Um pouco de arrays
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
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.
Captulo5UmpoucodearraysPgina48
Uma array de tipos primitivos guarda valores, uma array de objetos guarda
referncias.
Arraysnopodemmudardetamanho
Apartirdomomentoqueumaarrayfoicriada,elano podemudardetamanho.
Sevocprecisardemaisespao,sernecessriocriarumanovaarray,eantesdesereferenciar
paraela,copieoselementosdaarrayvelha.
7.
8.
9.}
System.out.println(x);
}
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
3)Oqueacontecesecriarumaarrayde0elementos?e1?
4)OmtodomainrecebeumaarraydeStringscomoargumento.Oquevemnela?Faa
umforquepercorraesseargumentoargsdentrodomaindeumaclasseTeste,edepoistente:
$javaTestearg1outromaisoutro
5.6 - Exerccios
1)VolteaonossosistemadeFuncionarioecrieumaclasse Empresa.AEmpresa tem
um nome, cnpj e uma array de Funcionario, alm de outros atributos que voc julgar
necessrio
classEmpresa{
//outrosatributos
Funcionario[]funcionarios;
Stringcnpj;
}
2) A empresa deve ter um mtodo adiciona que recebe uma referncia a
Funcionariocomoargumento,eguardaessefuncionario.Algocomo:
...
voidadiciona(Funcionariof){
//algotipo:this.funcionarios[???]=f;
//...
}
...
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
Captulo5UmpoucodearraysPgina53
captulo
Aotrminodessecaptulo,vocsercapazde:
controlaroacessoaosseusmtodos,atributoseconstrutoresatravsdosmodificadoresprivatee
public;
escrevermtodosdeacessoaatributosdotipogettersesetters;
escreverconstrutoresparasuasclassese
utilizarvariveisemtodosestticos.
ultrapassaolimitediretamente:
1.classTestaContaEstouro2{
2.
publicstaticvoidmain(Stringargs[]){
3.
ContaminhaConta=newConta();
4.
minhaConta.limite=100;
5.
minhaConta.saldo=200;//saldoestabaixodos100delimite
6.
}
7.}
Comoevitarisso?Umaidiasimplesseriatestarsenoestamosultrapassandoolimite
todavezqueformosalterarosaldo:
1.classTestaContaEstouro3{
2.
3.
publicstaticvoidmain(Stringargs[]){
4.
//aConta
5.
ContaminhaConta=newConta();
6.
minhaConta.limite=100;
7.
minhaConta.saldo=100;
8.
9.
//queromudarosaldopara200
10.
doublenovoSaldo=200;
11.
12.
//testaseonovoSaldoultrapassaolimitedaconta
13.
if(novoSaldo<minhaConta.limite){//
14.
System.out.println("Nopossomudarparaessesaldo");
15.
}else{
16.
minhaConta.saldo=novoSaldo;
17.
}
18.
}
19.}
Esse cdigo iria se repetir ao longo de toda nossa aplicao e, pior, algum pode
esquecer de fazer essa comparao em algum momento, deixando a conta na situao
inconsistente.AmelhorformaderesolverissoseriaforarquemusaaclasseContaachamaro
mtodosacaenopermitiroacessodiretoaoatributo.omesmocasodavalidaodeCPF.
PRIVATE
ParafazerissonoJavabastadeclararqueosatributosnopodemseracessadosdefora
daclasseusandoapalavrachaveprivate:
classConta{
privatedoublesaldo;
privatedoublelimite;
//...
}
MODIFICADOR
private um modificador
DE ACESSO visibilidade).
Marcandoumatributocomoprivado,fechamosoacessoaomesmodetodasasoutras
classes,fazendocomqueoseguintecdigonocompile:
classTestaAcessoDireto{
publicstaticvoidmain(Stringargs[]){
ContaminhaConta=newConta();
//nocompila!vocnopodeacessaroatributoprivadodeoutra
classe
minhaConta.saldo=1000;
}
Captulo6ModificadoresdeacessoeatributosdeclassePgina55
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
usam esse mtodo nem precisam ficar sabendo de tal modificao! Voc precisa apenas
recompilaraquelaclasse,esubstituiraquelearquivo.class.
6.2 - Encapsulamento
ENCAPSULAR
Oquecomeamosavernessecaptuloaidiadeencapsular,isto,escondertodos
osmembrosdeumaclassecomovimosacima,almdeescondercomofuncionaasrotinas(no
casomtodos)donossosistema.
Encapsular fundamental para que seu sistema seja sucetvel a mudanas: no
precisaremosmudarumaregradenegcioemvrioslugares,massimemapenasumnico
lugar,jqueessaregraestencapsulada.(vistoocasodomtodosaca)
Oconjuntodemtodospblicosdeumaclassetambmchamadode interface da
classe,poisestaanicamaneiraaqualvocsecomunicacomobjetosdessaclasse.
Programandovoltadoparaainterfaceenoparaaimplementao
sempre bom programar pensando na interface da sua classe, como seus usurios estaro
utilizandoela,enosomentecomoelairfuncionar.
Aimplementaoemsi,ocontedodosmtodos,notemtantaimportnciaparaousuriodessa
classeumavezqueelesprecisasaberoquecadamtodopretendefazer,enocomoelefaz
poisistopodemudarcomotempo.
Essa frasevemdolivroDesignPatterns,deEricGammaetal.Umlivro cultuadonomeioda
orientaoaobjetos.
Sempre que vamos acessar um objeto utilizamos sua interface. Existem diversas
analogiasfceisnomundoreal:
Quandovocdirigeumcarro,oqueteimportasoospedaiseovolante(interface)e
noomotorquevocestusando(implementao).claroqueummotordiferente
podetedarmelhoresresultados,mas oqueelefaz amesmacoisaqueummotor
menospotente,adiferenaestem comoelefaz.Paratrocarumcarroaalcoolpara
Captulo6ModificadoresdeacessoeatributosdeclassePgina57
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
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.}
returnthis.saldo;
}
publicvoidsetSaldo(doublesaldo){
this.saldo=saldo;
}
publicdoublegetLimite(){
returnthis.limite;
}
publicvoidsetLimite(doublelimite){
this.limite=limite;
}
publicClientegetDono(){
returnthis.dono;
}
publicvoidsetDono(Clientedono){
this.dono=dono;
}
umamprticacriarumaclasseelogoemseguidacriargettersesettersprosseus
atributos.Vocsdevecriarumgetterousettersetiverarealnecessidade.Reparequenesse
exemplosetSaldonodeveriatersidocriado,jquequeremosquetodosusemdeposita()e
saca().
Outrodetalheimportante,ummtodo getX nonecessariamenteretornaovalordeum
atributoquechamaXdoobjetoemquesto.Issointeressanteparaoencapsulamento.Imagine
a situao: queremos que obanco sempre mostre como saldo o valor do limite somado ao
saldo(umaprticacomumdosbancosquecostumailudirseusclientes).Poderamossempre
chamarc.getLimite()+c.getSaldo(),masissopoderiagerarumasituaodereplaceall
quando precisassemos mudar como o saldo mostrado. Podemos encapsular isso em um
mtodo,eporquenodentrodoprpriogetSaldo?Repare:
1.publicclassConta{
2.
3.
privatedoublesaldo;
4.
privatedoublelimite;
5.
privateClientedono;
6.
7.
privatedoublegetSaldo(){
8.
returnthis.saldo+this.limite;
9.
}
10.
11.
//deposita()esaca()
12.
13.
publicClientegetDono(){
14.
returnthis.dono;
15.
}
16.
17.
publicvoidsetDono(Clientedono){
18.
this.dono=dono;
19.
}
20.}
Ocdigoacimanempossibilitaachamadadomtodo getLimite(),elenoexiste.E
nem deveexistirenquantono houveressa necessidade.O mtodo getSaldo no devolve
Captulo6ModificadoresdeacessoeatributosdeclassePgina59
6.4 - Construtores
Quandousamosapalavrachavenew,estamosconstruindoumobjeto.Semprequandoo
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
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.}
Stringdono;
doublesaldo;
doublelimite;
//construtor
Conta(Stringdono){
this.dono=dono;
}
//..
Esseconstrutorrecebeodonodaconta.Assim,quandocriarmosumaconta,elajter
umdeterminadodono.
Contac=newConta(Duke);
System.out.println(c.dono);
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
}
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/
Seria interessante ento, que essa varivel fosse nica, compartilhada por todos os
objetosdessaclasse.Dessamaneira,quandomudasseatravsdeumobjeto,ooutroenxergaria
omesmovalor.Parafazerissoemjava,declaramosavarivelcomostatic.
privatestaticinttotalDeContas;
Captulo6ModificadoresdeacessoeatributosdeclassePgina62
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
Ostaticrealmentetrazumcheiroprocedural,pormemmuitasvezesnecessrio.
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());
returnthis.funcionarios[posicao];
}
}
6)(opcional)Naclasse Empresa,emvezdecriarumaarraydetamanhofixo,receba
comoparmetronoconstrutorotamanhodaarraydeFuncionario
Agora com esse construtor, o que acontece se tentarmos dar new Empresa() sem
passarargumentoalgum?Porque?
7)(opcional)Comogarantirquedatascomo31/2/2005nosejamaceitaspelasuaclasse
Data?
8)(opcional)Crieaclasse PessoaFisica.Queremosteragarantiaquepessoafisica
algumatenhaCPFinvalido,nemsejacriadaPessoaFisicasemcpfinicial.(vocnoprecisa
escreveroalgoritmodevalidaodecpf,bastapassarocpfporummtodo valida(String
x)....)
6.9 - Desafios
1)Porqueessecdigonocompila?
1.classTeste{
2.
intx=37;
3.
publicstaticvoidmain(String[]args){
4.
System.out.println(x);
5.
}
6.}
2)Imaginequetenhoumaclasse FabricaDeCarro equerogarantirquesexisteum
objetodessetipoemtodaamemria.Noexisteumapalavrachaveespecialparaistoemjava,
entoteremosdefazernossaclassedetalmaneiraqueelarespeiteessanossanecessidade.
Comofazerisso?(pesquise:singletondesignpattern)
Captulo6ModificadoresdeacessoeatributosdeclassePgina65
captulo
Aotrminodessecaptulo,vocsercapazde:
dizeroqueheranaequandoutilizla;
reutilizarcdigoescritoanteriormente;
criarclassesfilharereescrevermtodos;
usartodoopoderqueopolimorfismoda.
Precisamosmesmodeoutraclasse?
PoderamosterdeixadoaclasseFuncionariomaisgenrica,mantendonelasenhadeacesso.
Casoofuncionrionofosseumgerente,deixaramosesteatributovazio.
Essa umapossibilidade.Maseemrelaoaosmtodos?Aclasse Gerente temomtodo
autentica,quenofazsentidoseracionadoemumfuncionrioquenogerente.
Se tivssemos um outro tipo de funcionrio, que tem caractersticas diferentes do
funcionriocomum,precisaramoscriarumaoutraclasse,ecopiarocdigonovamente!
Alm disso, se um dia precisarmos adicionar uma nova informao para todos os
funcionrios,precisaramospassarportodasasclassesdefuncionrioeadicionaresseatributo.
Oproblemaacontecenovamentepornocentralizarasinformaesprincipaisdofuncionrioem
umnicolugar!
HERANA
EXTENDS
Existeumamaneira,emJava,derelacionarmosumaclassedetalmaneiraqueumadelas
herdatudoqueaoutratem.Istoumarelaodeclassemeeclassefilha.Nonossocaso,
gostaramosdefazercomqueoGerentetivessetudoqueumFuncionariotem,gostaramos
que ela fosse uma extenso de Funcionario. Fazemos isto atravs da palavra chave
extends.
classGerenteextendsFuncionario{
intsenha;
publicbooleanautentica(intsenha){
if(this.senha==senha){
System.out.println("AcessoPermitido!");
returntrue;
}else{
System.out.println("AcessoNegado!");
returnfalse;
}
}
}
TodomomentoquecriarmosumobjetodotipoGerente,esteobjetopossuirtambmos
atributosdefinidosnaclasseFuncionario,poisagoraumGerente umFuncionario:
classTestaGerente{
publicstaticvoidmain(String[]args){
Gerentegerente=newGerente();
gerente.setNome("JoodaSilva");
gerente.setSenha(4231);
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina67
}
}
DizemosqueaclasseGerenteherdatodososatributosemtodosdaclasseme,no
nossocaso,aFuncionario.Parasermaispreciso,elatambmherdaosatributosemtodos
privados,pormnoconsegueacessalosdiretamente.
SUPER E SUB
CLASSES
SupereSubclasse
AnomenclaturamaisencontradaqueFuncionarioasuperclassedeGerente,eGerentea
subclassedeFuncionario.DizemostambmquetodoGerenteumFuncionrio.
PROTECTED
classFuncionario{
protectedStringnome;
protectedStringcpf;
protecteddoublesalario;
//mtodosdevemviraqui
}
Sempreusarprotected?
Entoporqueusar private?Depoisdeumtempoprogramandoorientadoaobjetos,vocvai
comearasentirquenemsempreumaboaidiadeixarqueaclassefilhaacesseosatributosda
classeme,poisistoquebraumpoucoaidiadequesaquelaclassedeveriamanipularseus
atributos.Essaumadiscussoumpoucomaisavanada.
Almdisso,nosassubclassespodemacessarosatributosprotected,comooutrasclasses,
queveremosmaisafrente(mesmopacote).
REESCRITA
DE MTODO
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina68
Oresultadoaquiser500.Noqueremosessaresposta,noqueremosestemtodoque
foiescritonaclasseme,euqueroreescrever(sobrescrever,override)estemtodo:
classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnthis.salario*0.15;
}
//...
}
Agorasimomtodoestcorretoparao Gerente.Refaaotesteevejaque,agora,o
valorimpressoocorreto(750):
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina69
Gerentegerente=newGerente();
gerente.setSalario(5000.0);
System.out.println(gerente.getBonificacao());
classGerenteextendsFuncionario{
intsenha;
publicdoublegetBonificacao(){
returnsuper.getBonificacao()+1000;
}
//...
}
Essa invocaovai procurar o mtodocom o nome getBonificacao de umasuper
classedeGerenteestende.NocasoelevailogoencontraressemtodoemFuncionario.
Emmuitoscasosissoocorre,poisomtodoreescritogeralmentefazalgoamaisqueo
mtododaclasseme.Chamarounoomtododecimaumadecisosua,edependedoseu
problema.
7.4 - Polimorfismo
O que guarda uma varivel do tipo Funcionario? Uma referncia para um
Funcionario.
Naherana,vimosque Gerente um Funcionario,poisumaextensodeste.Eu
possomereferenciaraum Gerente comosendoum Funcionario.Sealgumprecisafalar
comumFuncionariodobanco,podefalarcomumGerente!Porque?PoisGerente um
Funcionario.Essaasemnticadaherana.
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina70
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
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina72
//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!!!
}
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
b)Adicioneoatributosaldo
classConta{
privatedoublesaldo;
}
c)CrieosmtodosgetSaldo(),deposita(double)esaca(double)
classConta{
privatedoublesaldo;
voiddeposita(doublevalor){
this.saldo+=valor;
}
voidsaca(doublevalor){
this.saldo=valor;
}
doublegetSaldo(){
returnthis.saldo;
}
}
2)Adicioneummtodonaclasse Conta,queatualizaessacontadeacordocomuma
taxapercentualfornecida.
classConta{
privatedoublesaldo;
//outrosmtodosaqui...
voidatualiza(doubletaxa){
this.saldo=this.saldo*taxa;
}
}
3)CrieduassubclassesdaclasseConta:ContaCorrenteeContaPoupanca.Ambas
teroomtodoatualizareescrito:AContaCorrentedeveatualizarsecomodobrodataxaea
ContaPoupancadeveatualizarsecomotriplodataxa.
Almdisso,a ContaCorrente devereescreveromtodo deposita,afimderetirara
CPMFde0.38%acadadepsito.
a) Crie as classes ContaCorrente e ContaPoupanca. Ambas so filhas da classe
Conta:
classContaCorrenteextendsConta{
}
classContaPoupancaextendsConta{
}
b)ReescrevaomtodoatualizanaclasseContaCorrente,seguindooenunciado:
classContaCorrenteextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*2;
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina74
}
}
Reparequeparaacessaroatributosaldoherdadodaclasse Conta,vocvaiprecisar
trocaromodificadordevisibilidadedesaldoparaprotected.
c)ReescrevaomtodoatualizanaclasseContaPoupanca,seguindooenunciado:
classContaPoupancaextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*3;
}
}
d)NaclasseContaCorrente,reescrevaomtododepositaparadescontaracpmf:
classContaCorrenteextendsConta{
voidatualiza(doubletaxa){
this.saldo+=this.saldo*taxa*2;
}
voiddeposita(doublevalor){
this.saldo+=valor*0.9962;
}
}
Observao:existemoutrassoluesparamodificarosaldodasuaclasseme:voc
pode utilizar os mtodos retira e deposita se preferir continuar com o private
(recomendado!),ouentocriarummtodosetSaldo,masprotected,paranodeixaroutras
pessoasalteraremosaldosempassarporummtodo(nemmesmosuafilhaconseguiriaburlar
isso). Hoje emdiamuitaspessoasdizem queo protected quebra encapsulamento, assim
comoalgunscasosdeheranaondeameefilhatemumacoplamentomuitoforte.
4)Crieumaclassecommtodo main einstancieessasclasses,atualizeasevejao
resultado.Algocomo:
publicclassTestaContas{
publicstaticvoidmain(String[]args){
Contac=newConta();
ContaCorrentecc=newContaCorrente();
ContaPoupancacp=newContaPoupanca();
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina75
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
c.deposita(1000);
cc.deposita(1000);
cp.deposita(1000);
adc.roda(c);
adc.roda(cc);
adc.roda(cp);
System.out.println("SaldoTotal:"+adc.getSaldoTotal());
}
}
8)(Opcional)CrieumaclasseBancoquepossuiumaarraydeConta.Reparequenuma
arrayde Conta vocpodecolocartanto ContaCorrente quanto ContaPoupanca.Crieum
metodo voidadiciona(Contac),ummtodo ContapegaConta(intx) eoutro int
pegaTotalDeContas(),muitosimilararelaoanteriordeEmpresaFuncionario.
Faacomqueseumtodomaincriediversascontas,insiraasnoBanco,edepoiscom
um for percorra todas as contas do Banco para passlas como argumento para o
AtualizadorDeContas.
9)(Opcional)Useapalavrachavesupernosmtodosatualizareescritos,paranoterde
refazerotrabalho.
10) (Opcional) Se voc precisasse criar uma classe ContaInvestimento, e seu
mtodo atualiza fosse complicadssimo, voc precisaria alterar as classes Banco e
AtualizadorDeContas?
Captulo7OrientaoaObjetosherana,reescritaepolimorfismoPgina77
captulo
Eclipse IDE
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
Vocpodedeixarodiretrioqueelejdefiniu.
LogoemseguidaumateladeWelcomeseraberta,ondevoctemdiversoslinkspara
tutoriaiseajuda.CliqueemWorkbench.AteladeWelcomedoEclipse3.2(queestnafigura
abaixo)umpoucodiferentedado3.1.
FecheateladeWelcomeevocveratelaabaixo.Nestatela,destacamosasViews(em
linhacontnua)easPerspectives(emlinhapontilhada)doEclipse.
AViewNavigatormostraaestruturadediretrioassimcomoestnosistemadearquivos.
AViewOutlinemostraumresumodasclasses,interfaceseenumeraesdeclaradasnoarquivo
javaatualmenteeditado(servetambmparaoutrostiposdearquivos).
Captulo8EclipseIDEPgina80
NomenuWindow>ShowView>othervocpodeverasdezenasdeViewsquejvem
embutidasnoEclipse.AcostumeseasempreprocurarnovasViews,elaspodemteajudarem
diversastarefas.
Captulo8EclipseIDEPgina81
VocpodechegarnessamesmateladandocliquedadiretanoespaodaViewNavigator
eseguindoomesmomenu.Nestatela,configureseuprojetocomonatelaabaixo:
Captulo8EclipseIDEPgina82
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
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
Captulo8EclipseIDEPgina85
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
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.
saber:
Ctrl+1Acionaoquickfixescomsugestesparacorreodeerros.
Ctrl+EspaoCompletacdigos
Ctrl+PgUp e Ctrl+PgDown Naveganasabasabertas.tilquandoestivereditando
vriosarquivosaomesmotempo.
Ctrl+Shift+FFormataocdigosegundoasconvenesdoJava
Ctrl+MExpandeaViewatualparaatelatoda(mesmoefeitodedardoiscliquesnottulo
daView)
Ctrl+Shift+LExibetodososatalhospossveis.
Ctrl+OExibeumoutlinepararpidanavegao
Veremosmaisnodecorrerdocurso,emespecialquandovermospacotes.
8.8 - Exerccios
1) Crie as classes ContaCorrente, ContaPoupanca e opcionalmente o
AtualizadorDeContasnonossoprojetodoEclipse.Destaveztenteabusardocontrol+espaoe
control+1.
Porexemplo:
ContaCorr<ControlEspaco><ControlEspaco>=new<ControlEspaco>();
Reparequeatmesmonomesdevariveiselecriaparavoc!
2)ImaginequequeremoscirarumsetterdosaldoparaaclasseConta.Dentrodaclasse
Conta,digite:
setSa<ControlEspaco>
Omesmovalenocasodevocquererreescreverummtodo.DentrodeContaCorrente
faa:
atua<ControlEspaco>
3)VnasuaclassequetemomainesegureoCONTROLapertadoenquandovoc
passaomousesobreoseucdigo.Reparequetudovirouhyperlink.Cliqueemummtodoque
vocestinvocandonaclasseConta.
4)Deumcliquedadireitaemumarquivononavigator.EscolhaCompareWith>Local
History.Oqueestatela?
Captulo8EclipseIDEPgina88
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
Captulo8EclipseIDEPgina90
captulo
Aotrminodessecaptulovocsercapazdeutilizarclassesabstratasquandonecessrio.
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
daControleDeBonificacao.
Estamosutilizandoaquiaclasse Funcionario paraopolimorfismo:senofosseela
teramosumgrandeprejuzo:precisaramoscriarummtodobonificapararecebercadaum
dostiposdeFuncionario,umparaGerente,umparaDiretor,etc.Reparequeperderesse
podermuitopiorqueapequenavantagemqueaheranatrazemherdarcdigo.
Porm, em alguns sistemas, como o nosso caso, usamos uma classe apenas com
essesintuitos:deeconomizarumpoucocdigoeganharpolimorfismoparacriarmtodosmais
genricosequeseencaixemadiversosobjetos.
FazsentidoterumobjetodotipoFuncionario?Essaperguntadiferentedesaberse
faz sentido ter uma referncia do tipo Funcionario: esse caso faz sim e muito til.
Referenciando Funcionario temos o polimorfismo de referncia, j que podemos receber
qualquercoisaquesejaumFuncionario.Porm,darnewemFuncionariopodenofazer
sentido,isso,noqueremosreceberumobjetodotipoFuncionario,queremosqueaquela
referncia seja ou um Gerente, ou um Diretor, etc. Algo mais concreto que um
Funcionario.
ControleDeBonificacoescdb=newControleDeBonificacoes();
Funcionariof=newFuncionario();
cdb.adiciona(f);//fazsentido?
Umoutrocasoemquenofazsentidoterumobjetodaqueletipo,apesardaclasseexistir:
imagineaclassePessoaeduasfilhas,PessoaFisicaePessoaJuridica.Quandopuxamos
umrelatriodenossosclientes(umaarraydePessoaporexemplo),queremosquecadaum
delessejaouuma PessoaFisica,ouuma PessoaJuridica.Aclasse Pessoa nessecaso
estaria sendo usada apenas para ganhar o polimorfismo e herdar algumas coisas: no faz
sentidopermitirinstancila.
Pararesolveressesproblemastemosasclassesabstratas.
Usamosapalavrachaveabstractparaimpedirqueelapossaserinstanciada.Esseo
efeitodiretordeseusaromodificadorabstractnadeclaraodeumaclasse:
abstractclassFuncionario{
protecteddoublesalario;
publicdoublegetBonificacao(){
returnthis.salario*1.2;
}
//outrosatributosemtodoscomunsatodosFuncionarios
}
Captulo9OrientaoaObjetosClassesAbstratasPgina92
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.
Existe um recurso em Java que, em uma classe abstrata, podemos escrever que
determinadomtodosersempreescritopelasclassesfilhas.Isto,ummtodo abstrato.
Eleindicaquetodasasclassesfilhas(concretas,isso,quenoforemabstratas)devem
reescreveressemtodo,ounocompilaro.comosevocherdassearesponsabilidadedeter
aquelemtodo.
Comodeclararummtodoabstrato
svezesnoficaclarocomodeclararummtodoabstrato.
Bastaescreverapalavrachaveabstractnaassinaturadomesmoecolocarumpontoevrgulaem
vezdeabreefechachaves!
abstractclassFuncionario{
abstractdoublegetBonificacao();
//outrosatributosemtodos
}
Reparequenocolocamosocorpodomtodo,eusamosapalavrachave abstract
paradefiniromesmo.Porquenocolocarcorpoalgum?Porqueessemtodonuncavaiser
chamado,semprequandoalgumchamaromtodo getBonificacao,vaicairemumadas
suasfilhas,querealmenteescreveramomtodo.
Qualquerclassequeestenderaclasse Funcionario serobrigadaareescrevereste
mtodo, tornandoo concreto. Se no reescreverem esse mtodo, um erro de compilao
ocorrer.
OmtododoControleDeBonificacaoestavaassim:
publicvoidregistra(Funcionariof){
System.out.println(Adicionandobonificacaodofuncionario:+f);
this.totalDeBonificacoes+=funcionario.getBonificacao();
}
Nosso banco deseja todo dia de manh atualizar as contas bancrias de todas as
pessoas. Temos dois tipos de conta, a ContaCorrente e a ContaPoupanca. A
ContaPoupancaatualizatododiaumapequenaporcentagem,jaContaCorrentesprecisa
atualizarsecomumfatordecorreomensal.
1.classConta{
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.}
privatedoublesaldo=0.0;
publicvoidretira(doublevalor){
this.saldo=valor;
}
publicvoiddeposita(doublevalor){
this.saldo+=valor;
}
publicdoublegetSaldo(){
returnthis.saldo();
}
1.classContaCorrenteextendsConta{
2.
3.
4.
5.
6.
7.
8.}
privatedoublelimiteDoChequeEspecial=1000.0;
privatedoublegastosNoChequeEspecial=100.0;
publicvoidatualiza(){
super.retira(this.gastosNoChequeEspecial*0.08);
}
1.classContaPoupancaextendsConta{
2.
3.
4.
5.
6.
7.}
privatedoublecorrecaoMensal;
publicvoidatualiza(){
super.deposita(this.saldo*this.correcaoMensal);
}
O que no est legal aqui? Por enquanto usamos herana para herdar um pouco de
cdigo,eassimnoterdereescrevlo.Masjfrisamosqueessanoagrandevantagemde
seusarherana,aidiautilizaropolimorfismoadquirido.Podemosnosreferenciarauma
ContaCorrenteeContaPoupancacomosendoumaConta:
classAtualizadorDeSaldos{
privateConta[]contas;
publicvoidsetContas(Conta[]contas){
this.contas=contas;
}
publicvoidatualizaSaldos(){
for(Contaconta:this.contas){
conta.atualiza();//nocompila!!!
}
}
}
Estecdigoacimanocompila!SetenhoumarefernciaparaumaConta,quemgarante
queoobjetoreferenciadotemomtodoatualiza?Ningum.Podemosentocoloclonaclasse
Conta:
classConta{
protecteddoublesaldo;
Captulo9OrientaoaObjetosClassesAbstratasPgina95
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
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
orientaoaobjetospodeterumaenormedificuldadeparasaberquandoutilizlas,oquemuito
normal.
Estudaremosopacotejava.io,queusabastanteclassesabstratas,sendoumexemplorealdeuso
desserecurso,quevaimelhoraroentendimentodasmesmas.(classeInputStreamesuasfilhas)
9.6 - Exerccios
1) Repare que a nossa classe Conta uma excelente candidata para uma classe
abstrata.Porque?Quemtodosseriaminteressantescandidatosaseremabstratos?
Transformeaclasse Conta paraabstrata,nomaintentedarum new nelaecompileo
cdigo.
abstractclassConta{
//...
}
2)SeagoranopodemosdarnewemConta,qualautilidadedeterummtodoque
recebeumarefernciaaContacomoargumento?Alis,possoterisso?
3) Remova o mtodo atualiza() da ContaPoupanca, dessa forma ele herdar o
mtodo diretamente de Conta. Transforme o mtodo atualiza() da classe Conta para
abstrato. Repare que ao colocar a palavra chave abstract ao lado do mtodo, o Eclipse
rapidamentevaisugerirquevocdeveremoverocorpo(body)domtodo.
Compileocdigo.QualoproblemacomaclasseContaPoupanca?
abstractclassConta{
//atributosemetodosquejexistiam
abstractvoidatualiza(doubletaxaSelic);
}
4) Reescreva o mtodo atualiza() na classe ContaPoupanca para que a classe
possacompilarnormalmente.(Oeclipsetambmsugereissocomoumquickfix)
Captulo9OrientaoaObjetosClassesAbstratasPgina98
Captulo9OrientaoaObjetosClassesAbstratasPgina99
captulo
10
10
Aotrminodessecaptulo,vocsercapazde:
dizeroqueumainterfaceeasdiferenasentreheranaeimplementao;
escreverumainterfaceemJava;
utilizlascomoumpoderosorecursoparadiminuiracoplamentoentreasclasses.
Captulo10OrientaoObjetosInterfacesPgina100
ReparequeomtododeautenticaodecadatipodeFuncionariopodevariarmuito.
Masvamosaosproblemas.ConsidereoSistemaInterno,eseucontrole,precisamosreceber
umDiretorouGerentecomoargumento,verificarseeleseautenticaecoloclodentrodo
sistema:
classSistemaInterno{
voidlogin(Funcionariofuncionario){
//chamaromtodoautentica?noda!NemtodoFuncionariotem
}
}
OSistemaInternoaceitaqualquertipodeFuncionario,tendoeleacessoaosistema
ouno,masnotequenemtodoFuncionariopossuiomtodoautentica.Issonosimpede
de chamar esse mtodo com uma referncia apenas a Funcionario (haveria um erro de
compilao).Oquefazerento?
Uma possibilidade: criar dois mtodos login no SistemaInterno: um para receber
DiretoreoutroparareceberGerente.Jvimosqueessanoumaboaescolha.Porque?
Cada vez que criarmos uma nova classe de Funcionario que autenticvel,
precisaramosadicionarumnovomtododeloginnoSistemaInterno.
SOBRECARGA
Mtodoscommesmonome
EmJava,mtodospodemteromesmonomedesdequenosejamambguos,isso,queexista
umamaneiradedistinguirnomomentodachamada.
Issosechamasobrecargademtodo.(overloading,noconfundircomoverriding,que
umconceitomuitomaispoderosonocaso).
Umasoluomaisinteressanteseriacriarumaclassenomeiodarvoresdeherana,
FuncionarioAutenticavel:
classFuncionarioAutenticavelextendsFuncionario{
publicbooleanautentica(intsenha){
//fazautenticacaopadrao
}
Captulo10OrientaoObjetosInterfacesPgina101
//outrosatributosemetodos
}
As classes
Diretor
e
Gerente
passariam a estender de
FuncionarioAutenticavel,eoSistemaInternoreceberiarefernciasdessetipo,comoa
seguir:
classSistemaInterno{
voidlogin(FuncionarioAutenticavelfa){
intsenha=//pegasenhadeumlugar,oudeumscannerde
polegar
booleanok=
fa.autentica(senha);
//aquieupossochamaroautentica!
//PoistodoFuncionarioAutenticaveltem
}
}
ReparequeFuncionarioAutenticavelumafortecandidataaclasseabstrata.Mais
ainda,omtodoautenticapoderiaserummtodoabstrato.
Ousodeheranaresolveessecaso,masvamosaumaoutrasituao:
PrecisamosquetodososclientestambmtenhamacessoaoSistemaInterno.Oque
fazer?UmaopocriaroutromtodologinemSistemaInterno:masjdescartamosessa
anteriormente.
Uma outra, que comum entre os novatos, fazer uma herana sem sentido para
resolver o problema, por exemplo, fazer Cliente extends FuncionarioAutenticavel.
Realmente resolve o problema, mas trar diversos outros. Cliente definitivamente no
FuncionarioAutenticavel.Sevocfizerisso,o Cliente ter,porexemplo,ummtodo
getBonificacao,umatributosalarioeoutrosmembrosquenofazemomenorsentidopara
estaclasse!Nofaaheranaquandoarelaonoestritamenteum.
Captulo10OrientaoObjetosInterfacesPgina102
Comoresolverento?
10.2 - Interfaces
O que precisamos para resolver nosso problema? Arranjar uma forma de poder
referenciar Diretor, GerenteeCliente deumamesmamaneira, isto,acharumfator
comum.
Se existisse uma forma na qual essas classes garantissem a existncia de um
determinadomtodo,atravsdeumcontrato,resolveramosoproblema.
Todaclassedefine2itens:
CONTRATO
oqueumaclassefaz(asassinaturasdosmtodos)
comoumaclassefazessastarefas(ocorpodosmtodoseatributosprivados)
Podemoscriarumcontratoquedefinetudooqueumaclassedevefazersequiserter
umdeterminadostatus.Imagine:
contratoAutenticavel:
quemquiserserAutenticavelprecisasaberfazer:
1. autenticardadaumasenha,devolvendoumbooleano
Quemquiserpodeassinaressecontrato,sendoassimobrigadoaexplicarcomoser
feitaessaautenticao.Avantagemque,seumGerenteassinaressecontrato,podemosnos
referenciaraumGerentecomoumAutenticavel.
PodemoscriaressecontratoemJava!
interfaceAutenticavel{
booleanautentica(intsenha);
Captulo10OrientaoObjetosInterfacesPgina103
}
INTERFACE
IMPLEMENTS
EoGerentepodeassinarocontrato,ouseja,implementarainterface.Nomomento
que ele implementa essa interface, ele precisa escrever os mtodos pedidos pela interface
(muito prximo ao efeito de herdar mtodos abstratos, alis, mtodos de uma interface so
pblicos e abstratos, sempre). Para implementar usamos a palavra chave implements na
classe:
classGerenteextendsFuncionarioimplementsAutenticavel{
privateintsenha;
//outrosatributosemtodos
publicbooleanautentica(intsenha){
if(this.senha!=senha)
returnfalse;
//podefazeroutraspossiveisverificacoes,comosaberseesse
//departamentodogerentetemacessoaoSistema
returntrue;
}
}
AgorapodemospassarumDiretor.Nodiaemquetivermosmaisumfuncionriocom
acessoaosistema,bastaqueeleimplementeessainterface,paraseencaixarnosistema.
Qualquer Autenticavel passado para o SistemaInterno. Est bom para ns.
Captulo10OrientaoObjetosInterfacesPgina105
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.
Captulo10OrientaoObjetosInterfacesPgina106
Apesardojava.sql.Connectionnotrabalharbemassim,aidiamuitosimilar,pormas
conexesvemdeumafactorychamadaDriverManager.
Conexo a banco de dados est fora do escopo desse treinamento, mas um dos
primeirostpicosabordadosnocursoFJ21,juntamentecomDAO.
10.6 - Exerccios
1) A sintaxe do uso de interfaces pode estranhas bastante a primeira vista. Vamos
comearcomumexerccioparapraticarasintaxe:
interfaceAreaCalculavel{
doublecalculaArea();
}
QueremosagoracriaralgumasclassesquesoAreaCalculavel:
Captulo10OrientaoObjetosInterfacesPgina107
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
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?
tributveisdeumapessoaesomaseusvalores,eummtodoparadevolverseutotal:
classGerenciadorDeImpostoDeRenda{
privatedoubletotal;
voidadiciona(Tributavelt){
System.out.println("Adicionandotributavel:"+t);
this.total=this.total+t.calculaTributos();
}
publicdoublegetTotal(){
returntotal;
}
}
System.out.println(gerenciador.getTotal());
AdapteContaCorrenteeContaPoupancaparaessamodificacao:
classContaCorrenteimplementsConta{
//...
}
Captulo10OrientaoObjetosInterfacesPgina110
Reparequeocdigopodeparecerestranhopoisainterfacenodeclaramtodoalgum,
s herda os mtodos abstratos declarados nas outras interfaces. Repare tambm que uma
interfacepodeestenderdemaisdeumainterface,sendoqueclassespodeestenderdeuma
(heranasimples).
Captulo10OrientaoObjetosInterfacesPgina111
captulo
11
11
Aotrminodessecaptulo,vocsercapazde:
controlarerrosetomardecisesbaseadasnosmesmos;
criarnovostiposdeerrosparasuamelhorarotratamentodosmesmosemsuaaplicaoou
biblioteca;
assegurarqueummtodofuncionoucomodizemseu"contrato".
11.1 - Motivao
VoltandosContasquecriamosnocaptulo6,oqueiriaaconteceraotentarchamaro
mtodosacacomumvalorforadolimite?Osistemairiamostrarumamensagemdeerro,mas
quemchamouomtodosacanoirsaberqueissoaconteceu.
Como avisar aquele que chamou o mtodo que ele no conseguiu fazer aquilo que
deveria?
EmJava,osmtodosdizemqualocontratoqueelesdevemseguir,seaotentarsacar
elenoconseguefazeraquiloquedeveria,eleprecisaaomenosavisarousurioquetentou
sacarqueissonofoifeito.
Vejanoexemploabaixo,estamosforandouma Conta aterumvalornegativo,isto,
estarnumestadoinconsistentedeacordocomanossamodelagem.
ContaminhaConta=newConta();
minhaConta.deposita(100);
minhaConta.setLimite(100);
minhaConta.saca(1000);
//
osaldo900?100?0?Achamadaaomtodosacafuncionou?
Emsistemas deverdade, muito comumque quemsaiba tratar oerro aquele que
chamouomtodoenoaprpriaclasse!Portanto,nadamaisnaturalqueaclassesinalizarque
umerroocorreu.
Asoluomaissimplesutilizadaantigamenteade marcaroretornodeummtodo
comobooleaneretornartruesetudoocorreudamaneiraplanejadaoufalsecasocontrrio:
booleansaca(doublequantidade){
if(quantidade>this.saldo+this.limite){//possosacarat
saldo+limite
System.out.println("Nopossosacarforadolimite!");
returnfalse;
}else{
this.saldo=this.saldoquantidade;
returntrue;
}
Captulo11ExceesControlandooserrosPgina112
}
Umnovoexemplodechamadaaomtodoacima:
ContaminhaConta=newConta();
minhaConta.setSaldo(100);
minhaConta.setLimite(100);
if(!minhaConta.saca(1000)){
System.out.println("Nosaquei");
}
Masesefossenecessriosinalizarquandoousuriopassouumvalornegativocomo
quantidade?Umasoluoalteraroretornodebooleanparaint,eretornarocdigodo
erroqueocorreu.Istoconsideradoumamprtica(conhecidatambmcomousodemagic
numbers).
Alm de voc perder o retorno do mtodo, o valor retornado mgico, e s legvel
peranteextensadocumentao,almdequenoobrigaoprogramadoratrataresseretorno,e
nocasodeesquecerissoseuprogramacontinuarrodando.
Repare o que iria acontecer se fosse necessrio retornar um outro valor. O exemplo
abaixomostraumcasoondeatravsdoretornonoserpossveldescobrirseocorreuumerro
ounopoisomtodoretornaumcliente.
publicClienteprocuraCliente(intid){
if(idInvalido){
//avisaomtodoquechamouestequeocorreuumerro
}else{
Clientecliente=newClient();
cliente.setId(id);
//cliente.setNome();
returncliente;
}
}
PoresseeoutrosmotivosutilizamosumcdigodiferenteemJavaparatrataraquiloque
chamamosdeexcees:oscasosondeacontecealgoquenormalmentenoiriaacontecer.O
exemplodoargumentodosaqueinvlidooudo id invlidodeumclienteuma exceo a
regra.
Exceo
Umaexceorepresentaumasituaoquenormalmentenoocorreerepresentaalgodeestranho
ouerradonosistema.
Captulo11ExceesControlandooserrosPgina113
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?
Captulo11ExceesControlandooserrosPgina114
STACKTRACE
for, pegando
try{
for(inti=0;i<=15;i++){
array[i]=i;
System.out.println(i);
Captulo11ExceesControlandooserrosPgina115
}
}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
Agoraretireotry/catchecoloqueeleemvoltadachamadadometodo2.
System.out.println("iniciodometodo1");
try{
metodo2();
}catch(ArrayIndexOutOfBoundsExceptione){
System.out.println("erro:"+e);
}
System.out.println("fimdometodo1");
Captulo11ExceesControlandooserrosPgina117
Reparequeapartirdomomentoqueumaexceptionfoicatched(tratada, handled),a
execuovoltaaonormalapartirdaqueleponto.
publicclassTestandoReferenciaNula{
publicstaticvoidmain(Stringargs[]){
Contac=null;
System.out.println("Saldoatual"+c.getSaldo());
}
}
Tenteexecutaroprogramaacima.Oqueacontece?
Captulo11ExceesControlandooserrosPgina118
Repare que um
ArrayIndexOutOfBoundsException
ou um
NullPointerException poderiaserfacilmenteevitadocomo for corretamenteescrito,ou
comifsquechecariamoslimitesdaarray.
Outro caso que tambm ocorre tal tipo de exceo quando um cast errado feito
(veremosmaisprafrente).Emtodososcasostaiserrosprovavelmentepoderiamserevitados
pelo programador. por esse motivo que o java no te obriga a dar o try/catch nessas
exceptions,echamamosessasexceesdeunchecked(emoutraspalavras,ocompiladorno
checasevocesttratandoessasexcees).
Erros
OserrosemJavasoumtipodeexceoquetambmpodemsertratados.Elesrepresentam
problemasnamquinavirtualenodevemsertratadosem99%doscasos,jqueprovavelmente
omelhorasefazerdeixaraJVMencerrar(ouapenasaThreademquesto).
Paracompilarefazeroprogramafuncionar,precisamostrataroerrodeumdedoisjeitos.
Oprimeirotratlocomotryecatchdomesmojeitoqueusamosnoexemploanteriorcom
umaarray:
publicstaticvoidmetodo(){
try{
Captulo11ExceesControlandooserrosPgina119
newjava.io.FileReader(arquivo.txt);
}catch(java.io.FileNotFoundExceptione){
System.out.println(Naofoipossivelabriroarquivopara
leitura);
}
}
THROWS
A segunda forma de tratar esse erro a de delegar ele para quem chamou o nosso
mtodo,isto,passarparaafrente.
publicstaticvoidmetodo()throwsjava.io.FileNotFoundException{
newjava.io.FileReader(arquivo.txt);
}
NoEclipsebemsimplesfazertantoumtry/catchassimcomoumthrows:
Tentedigitaressecdigonoeclipse:
publicclassTestaException{
publicstaticvoidmain(String[]args){
newjava.io.FileReader("arquivo.txt");
}
}
OEclipsevaireclamar:
Evoctemduasopes:
1)Addthrowsdeclaration,quevaigerar:
publicclassTestaException{
publicstaticvoidmain(String[]args)throwsFileNotFoundException{
newjava.io.FileReader("arquivo.txt");
}
}
2)Surroundwithtry/catch,quevaigerar:
publicclassTestaException{
Captulo11ExceesControlandooserrosPgina120
publicstaticvoidmain(String[]args){
try{
newjava.io.FileReader("arquivo.txt");
}catch(FileNotFoundExceptione){
//TODOAutogeneratedcatchblock
e.printStackTrace();
}
}
}
Noincioexiste umagrandetentaodesemprepassaroerro prafrenteparaoutros
trataremdele.Podeserquefaasentidodependendodocasomasnoatomain,porexemplo.
Acontecequequemtentaabrirumarquivosabecomolidarcomumproblemanaleitura.Quem
chamouummtodonocomeodoprogramapodenosaberou,piorainda,tentarabrircinco
arquivosdiferentesenosaberqualdelesteveumproblema!
No h uma regra para decidir em que momento do seu programa voc vai tratar
determinar exceo.Isso vaidependerdeem quepontovoctemcondiesdetomaruma
decisoemrelaoaaqueleerro.Enquantonoforomomento,vocprovavelmentevaipreferir
delegararesponsabilidadeparaomtodoqueteinvocou.
//..
}
2. Comothrows:
publicvoidabre(Stringarquivo)throwsIOException,SQLException{
//..
}
Vocpodetambmescolhertrataralgumasexceesedeclararasoutrasnothrows:
3. Comothrowsecomotryecatch:
publicvoidabre(Stringarquivo)throwsIOException{
try{
objeto.metodoQuePodeLancarIOeSQLException();
}catch(SQLExceptione){
//..
}
}
desnecessriodeclararnothrowsasexceptionsquesounchecked,pormpermitido
e,svezes,facilitaaleituraeadocumentaodoseucdigo.
if(this.saldo<valor){
thrownewIllegalArgumentException();
}else{
this.saldo=valor;
}
}
IllegalArgumentExceptiondizumpoucomais:algofoipassadocomoargumentoe
seumtodonogostou.ElaumaExceptionuncheckedpoisestendedeRuntimeException
e jfazparteda bibliotecadojava.(IllegalArgumentException melhordeserusado
quando umargumentosempreinvlido,comoporexemplo nmerosnegativos,referncias
nulas,etc).
Eagoraparapegaresseerro,nousaremosumif/elseesimumtry/catch,porquefaz
maissentidopoisumaexceoafaltadesaldo:
Contacc=newContaCorrente();
cc.deposita(100);
try{
cc.saca(100);
}catch(IllegalArgumentExceptione){
System.out.println("SaldoInsuficiente");
}
Podamos melhorar ainda mais e passar para o construtor da
IllegalArgumentExceptionomotivodaexcecao:
voidsaca(doublevalor){
if(this.saldo<valor){
thrownewIllegalArgumentException("Saldoinsuficiente");
}else{
this.saldo=valor;
}
}
OmtodogetMessage()definidonaclasseThrowable(medetodosostiposdeerros
e exceptions) vai retonar a mensagem que passamos ao construtor da
IllegalArgumentException.
try{
cc.saca(100);
}catch(IllegalArgumentExceptione){
System.out.println(e.getMessage());
}
}
EagoraaoinvslanarumIllegalArgumentException,vamoslanarnossaprpria
exception,comumamensagemquedirSaldoInsuficiente:
voidsaca(doublevalor){
if(this.saldo<valor){
thrownewSaldoInsuficienteException("SaldoInsuficiente,tente
umvalor
menor");
}else{
this.saldo=valor;
}
}
Eparatestar,crieumaclassequedepositeumvaloretentesacarumvalormaior:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
cc.deposita(10);
try{
cc.saca(100);
}catch(SaldoInsuficienteExceptione){
System.out.println(e.getMessage());
}
}
Podemos transformar essa Exception de unchecked para checked, obrigando assim
quemchamaessemtodoadartrycatch,outhrows:
publicclassSaldoInsuficienteExceptionextendsException{
SaldoInsuficienteException(Stringmessage){
super(message);
}
}
catchethrows
Existeumapssimaprticadeprogramaoemjavaqueadeescrevero catch eothrows
comException.
Existemcdigosquesempreusam Exception poisissocuidadetodosospossveiserros.O
maiorproblemadissogeneralizaroerro.SealgumjogaalgodotipoExceptionparaquemo
chamou,quemrecebenosabequalotipoespecficodeerroocorreuenovaisabercomotratar
omesmo.
Os blocos try e catch podem conter uma terceira clusula chamada finally que
indicaoquedeveserfeitoapsotrminodoblocotryoudeumcatchqualquer.
interessante colocar algo que imprescindvel de ser executado, caso o que voc
queriafazertenhadadocerto,ouno.Ocasomaiscomumodeliberarumrecurso,comoum
arquivoouconexocombancodedados,nofinally,paraqueagentepossateracertezadeque
aquelearquivo(ou conexo)v serfechado, mesmoquealgotenha falhadonodecorrerdo
cdigo.
Captulo11ExceesControlandooserrosPgina124
Noexemploaseguir,oblocofinallyserexecutadonoimportasetudoocorrerokou
comalgumproblema:
try{
//blocotry
}catch(IOExceptionex){
//blococatch1
}catch(SQLExceptionsqlex){
//blococatch2
}finally{
//blocofinally
11.11 - Exerccios
1)Naclasse Conta,modifiqueomtodo deposita(doublex) paraqueeleagora
retornevoid.EledevelanarumaexceptionchamadaIllegalArgumentException,quej
fazpartedabibliotecadojava,semprequeovalorpassadocomoargumentoforinvlido(por
exemplo,quandofornegativo).
voiddeposita(doublevalor){
if(valor<0){
thrownewIllegalArgumentException();
}else{
this.saldo+=valor;
}
}
2)CrieumaclasseTestaDepositacomomtodomain.CrieumaContaCorrentee
tentedepositarvaloresinvlidos:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
cc.deposita(100);
}
O que acontece? Uma IllegalArgumentException lanada j que tentamos
depositarumvalorinvido.Adicioneotry/catchparatrataroerro:
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
Captulo11ExceesControlandooserrosPgina125
try{
cc.deposita(100);
}catch(IllegalArgumentExceptione){
System.out.println("Voctentoudepositarumvalorinvlido");
}
}
3)Aolanara IllegalArgumentException,passeviaconstrutorumamensagema
serexibida.Lembrequea String recebidacomoparmetroacessveldepoisviaomtodo
getMessage()herdadoportodasasExceptions.
voiddeposita(doublevalor){
if(valor<0){
thrownewIllegalArgumentException("Voctentoudepositar
umvalornegativo");
}else{
this.saldo+=valor;
}
}
AgoraalteresuaclasseTestaDepositaparaexibiramensagemdaexceoatravsda
chamadadogetMessage():
publicstaticvoidmain(String[]args){
Contacc=newContaCorrente();
try{
cc.deposita(100);
}catch(IllegalArgumentExceptione){
System.out.println(e.getMessage());
}
5)Criesuaprpria Exception, ValorInvalidoException.Paraissovocprecisa
criarumaclassecomessenomequeextendade RuntimeException.Lancea emvez de
IllegalArgumentException.
classValorInvalidoExceptionextendsValorInvalidoException{
}
Ateno:nemsempreinteressantecriarmosumnovotipodeexception!Dependedo
caso.EsteaquiseriamelhoraindautilizarmosIllegalArgumentException.
6)(opcional)ColoqueumconstrutornaclasseValorInvalidoExceptionquereceba
o quanto ele tentou sacar. Dessa maneira, na hora de dar o throw new
ValorInvalidoExceptionvocvaiprecisarpassarovalordosaqueilegalcomoargumento.
7) (opcional) A classe Exception (na verdade Throwable) tem definida nela um
mtodo getMessage quepodeserreescritonassuassubclassesparafalarumpoucomais
sobreoerro.ReescrevaonasuaclasseValorInvalidoExceptionparaalgocomo:
publicStringgetMessage(){
return"Nopossoretirarvalornegativo:"+valor;
}
Agoraaoimprimiraexception,reparequeessamensagemquevaiaparecer.
8)(opcional)Declareaclasse ValorInvalidoException comofilhade Exception
Captulo11ExceesControlandooserrosPgina126
emvezdeRuntimeException.Oqueacontece?
Voc vai precisar avisar que o seu mtodo saca() throws
ValorInvalidoException,poiselaumacheckedexception.Almdisso,quemchamaesse
mtodovaiprecisartomarumadecisoentretrycatchouthrows.
11.12 - Desafios
1)Oqueaconteceseacabaramemriadojava?Comoforarisso?
Captulo11ExceesControlandooserrosPgina127
captulo
12
12
Aotrminodessecaptulo,vocsercapazde:
separarsuasclassesempacotese
preparararquivossimplesparadistribuio.
12.1 - Organizao
Quandoumprogramadorutilizaasclassesfeitasporoutrosurgeumproblemaclssico:
comoescreverduasclassescomomesmonome?
Porexemplo,podeserqueaminhaclassedeDatafuncionedeumcertojeitoeaclasse
de Data deumcolegadeoutrojeito.Podeserqueaclassede Data deuma biblioteca
funcioneaindadeterceiramaneira.
Comopermitirquetudoissorealmentefuncione?Comocontrolarquemquerusarqual
classedeData?Asoluosimples:criardiretriosparaorganizarasclasses.
Os diretrios esto diretamente relacionados aos chamados pacotes e costumam
agruparclassesdefuncionalidadeparecida.
PACOTE
packagebr.com.caelum.banco;
classCliente{
//...
}
PACKAGE
Fica fcil notar que a palavra chave package indica qual o pacote que contm esta
classe.
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina128
Umpacotepodeconternenhum,umoumaissubpacotese/ounenhuma,umaoumais
classesdentrodele.
Padrodanomenclaturadospacotes
Opadrodasunparadarnomeaospacotesrelativoaonomedaempresaquedesenvolveua
classe:
br.com.nomedaempresa.nomedoprojeto.subpacote
br.com.nomedaempresa.nomedoprojeto.subpacote2
br.com.nomedaempresa.nomedoprojeto.subpacote2.subpacote3
Ospacotesspossuemletrasminsculas,noimportaquantaspalavrasestejamcontidasnele.
Essepadroexisteparaevitaraomximooconflitodepacotesdeempresasdiferentes.
Asclassesdopacotepadrodebibliotecasnoseguemessanomenclatura,quefoidadapara
bibliotecasdeterceiros.
12.2 - Import
Parausarumaclassedomesmopacote,bastafazerrefernciaaelacomofoifeitoat
agora,simplesmenteescrevendooprprionomedaclasse.SeexisteumaclasseBancodentro
dopacotebr.com.caelum.banco,eladeveserescritaassim:
packagebr.com.caelum.banco;
classBanco{
Stringnome;
Clienteclientes[];
}
AclasseClientedeveficarnomesmopacotedaseguintemaneira:
packagebr.com.caelum.banco;
classCliente{
Stringnome;
Stringendereco;
}
Anovidadechegaaotentarutilizaraclasse Banco (ou Cliente)emumaoutraclasse
queestejaemoutropacote,porexemplonopacotebr.com.caelum.util:
packagebr.com.caelum.banco.util;
classTesteDoBanco{
publicstaticvoidmain(Stringargs[]){
br.com.caelum.banco.BancomeuBanco=new
br.com.caelum.banco.Banco();
meuBanco.nome="BancodoBrasil";
System.out.println(meuBanco.nome);
}
}
Reparequeprecisamosreferenciaraclasse Banco comtodoonomedopacotenasua
frente.(esseoconhecido FullQualifiedName deumaclasse,emoutraspalavras,esseo
verdadeiro nome de uma classe, por isso que duas classes X em pacotes diferentes no
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina129
conflitam).
Mesmoassim,aotentarcompilaraclasseanteriorocompiladorirreclamarqueaclasse
Banconoestvisvel.
Acontecequeasclassesssovisveisparaoutrasnomesmo pacoteeparapermitir
queaclasseTesteDoBancovejaeacesseaclasseBancoemoutropacoteprecisamosalterar
essaltimaetransformlaempblica:
packagebr.com.caelum.banco;
publicclassBanco{
Stringnome;
Clienteclientes[]=newCliente[2];
}
Apalavrachavepublicliberaoacessoparaclassesdeoutrospacotes.Domesmojeito
que ocompiladorreclamou quea classe no estava visvel, agora ele reclama que o nome
tambmnoest.fcildeduzircomoresolveroproblema,algoquejfoivistoanteriormente:
packagebr.com.caelum.banco;
publicclassBanco{
publicStringnome;
publicClienteclientes[]=newCliente[2];
}
Agorajpodemostestarnossoexemploanterior.
Voltando ao cdigo do TesteDoBanco, necessrio escrever todo o pacote para
identificarqualclassequeremosusar?Oexemploqueusamosficoubemcomplicadodeler:
br.com.caelum.banco.BancomeuBanco=newbr.com.caelum.banco.Banco();
ExisteumamaneiramaissimplesdesereferenciaraclasseBanco:bastaimport-la
dopacotebr.com.caelum.banco:
IMPORT
packagebr.com.caelum.banco.util;
importbr.com.caelum.banco.Banco;//agorapodemosnosreferenciar
//aBancodiretamente
classTesteDoBanco{
publicstaticvoidmain(Stringargs[]){
BancomeuBanco=newBanco();
meuBanco.nome=BancodoBrasil;
}
}
package,import,class
muitoimportantemanteraordem!Primeiroapareceuma(ounenhuma)vezopackage,depois
podeaparecerumoumaisimporteporltimoasdeclaraesdeclasses.
importx.y.z.*;
possvelimportarumpacoteinteiro(todasasclassesdopacote, exceto os subpacotes)
atravsdo*:
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina130
importjava.util.*;
Importar todas as classes de um pacote no implica em perda de performance em tempo de
execuomaspodetrazerproblemascomclassesdemesmonome!Almdisso,importardeum
emumconsideradoboaprticapoisfacilitaaleituraparaoutrosprogramadores
Classespblicas
Paramelhororganizarseucdigo,oJavanopermitemaisdeumaclassepblicaporarquivoeo
arquivodeveserNomeDaClasse.java.
Umavezqueoutrosprogramadoresiroutilizaressaclasse,quandoprecisaremolharocdigoda
mesma,ficamaisfcilencontrlasabendoqueelaestnoarquivodemesmonome.
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina131
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina132
NoEclipsenuncaprecisamosdeclararumimportouumpackage,poiselesemprevai
sugerirescreveressescomandosquandousarmosoControlEspacononomedeumaclasse,ou
casoadeclaraodepacoteestejaemconflitocomodiretriodoarquivofonte.
12.5 - Exerccios
Ateno: utilize os recursos do Eclipse para reailizar essas mudanas. Use a view
packageexplorer. Tambm utilize os quick fixes quando o Eclipse reclamar dos diversos
problemasdecompilao.
1)PasseoseusistemadeContasparautilizarpacotes.Respeiteaconveodecdigo
dasun,porexemplo:
br.com.empresa.banco:colocarclassecomomainaqui
br.com.empresa.banco.contas:colocarConta,suasfilhaseexceptionsaqui
br.com.empresa.banco.sistema:colocarAtualizadorDeContasaqui
2) Coloque cada classe em seu respectivo arquivo .java. Independente se ela ser
publica(boaprtica).
3) O cdigo novai compilarprontamente, pois muitos mtodosque declaramos so
packagefriendly,quandonaverdadeprecisaramosqueelesfossempublic.Omesmovalepara
asclasses,algumasdelasprecisaroserpublicas.UseorecursodequickfixdoEclipseaqui,
elemesmovaisugerirqueomodificadordeacessodeveserpblico.
Captulo12PacotesOrganizandosuasclassesebibliotecasPgina133
captulo
13
13
Aotrminodessecaptulo,vocsercapazde:
criaroJARdoseuaplicativo;
colocarumJARnobuildpathdoseuprojeto;
lerumjavadoc
criarojavadocdoseuaplicativo;
Ojeitomaissimplesdetrabalharcomumconjuntodeclassescompactlosemum
arquivo s. O formato de compactao padro o ZIP, porm a extenso do arquivo
compactadoserJAR.
Oarquivo.jar
O arquivo jar ou Java ARchive, possui uma srie de classes (e arquivos de configuraes)
compactados, no estilo de um arquivo zip. O arquivo jar pode ser criado com qualquer
compactadorzipdisponvelnomercado,inclusiveoprogramajarquevemjuntocomosdk.
Paracriarumarquivojardonossoprogramadebanco,bastairaodiretrioondeesto
contidasasclasseseusarcomandoaseguirparacriaroarquivo banco.jar comtodasas
classesdospacotesbr.com.caelum.utilebr.com.caelum.banco.
jarcvfbanco.jarbr/com/caelum/util/*.classbr/com/caelum/banco/*.class
Parausaressearquivobanco.jarpararodaroTesteDoBancobastarodarojavacom
oarquivojarcomoargumento:
javaclasspathbanco.jarbr.com.caelum.util.TesteDoBanco
Paraadicionarmaisarquivos.jar,quepodemserbibliotecas,aoprogramabastarodaro
javadaseguintemaneira:
javaclasspathbiblioteca1.jar;biblioteca2.jarNomeDaClasse
Valelembrarqueopontoevrgulautilizadosvlidoemambientewindowsedepende
decadasistemaoperacional(nolinuxodoispontos).
H tambm um arquivo de manifesto, que contm informaes do seu jar, como por
exemploqualclasseelevairodarquandoojarforchamado.Masnosepreocupe,poiscomo
Captulo13Ferramentas:jarejavadocPgina134
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.
Captulo13Ferramentas:jarejavadocPgina135
2)NatelaExport(comomostraafiguraabaixo),selecioneaopoJARfile,eaperteo
botoNext.
3)NaopoJARfile:,selecioneolocalquevocdesejasalvaroarquivoJAR.Eaperte
Next
Captulo13Ferramentas:jarejavadocPgina136
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
JAVADOC
No site da Sun, voc pode (e deve) baixar a documentao das bibliotecas do Java,
freqentementereferenciadacomojavadocouAPI(sendonaverdadeadocumentaoda
API).
Nestadocumentao,noquadrosuperioresquerdovocencontraospacotes,eoinferior
esquerdo est a listagem das classes e interfaces do respectivo pacote (ou de todos caso
nenhumtenhasidoespecificado).Clicandoseemumaclasseouinterface,oquadrodadireita
passaadetalhartodosatributosemtodos.
Reparequemtodoseatributosprivadosnoestoa.Oimportantedocumentaroque
sua classe faz, e no como ela faz: detalhes de implementao, como atributos e mtodos
privados, no interessam ao desenvolvedor que usar a sua biblioteca (ou ao menos no
deveriaminteressar).
Voc tambm consegue gerar esse javadoc apartir da linha de comando, com o
comando:javadoc.
Captulo13Ferramentas:jarejavadocPgina138
Captulo13Ferramentas:jarejavadocPgina139
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
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
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
captulo
14
14
O pacote java.lang
Aotrminodessecaptulovocsercapazde:
utilizarasprincipaisclassesdopacotejava.langeleradocumentaopadrodeprojetosjava;
usaraclasseSystemparaobterinformaesdosistema;
utilizaraclasseStringdeumamaneiraeficienteeconhecerseusdetalhes;
usarasclasseswrappers(comoInteger)eboxinge
utilizarosmtodosherdadosdeObjectparageneralizarseuconceitodeobjetos.
JusamospordiversasvezesasclassesStringeSystem.Vimososistemadepacotes
dojava,enuncaprecisamosdarum import nessasclasses.Issoocorreporqueelasesto
dentrodopacotejava.lang,queautomaticamente importadoparavoc.onico
pacotecomestacaracterstica.
Vamosverumpoucodesuasprincipaisclasses.
posteriormente.OmtodoexecteretornaumProcessondevoccapazdepegarasadado
programa,enviardadosparaaentrada,entreoutros.
Veremostambmaclasse System noprximocaptuloenode Threads.Consultea
documentaodoJavaevejaoutrosmtodosteisdaSystem.
14.3 - java.lang.Object
Semprequandodeclaramosumaclasse,essaclasseobrigadaaherdardeoutra.Isto
,paratodaclassequedeclararmos,existeumasuperclasse.Pormcriamosdiversasclasses
semherdardeningum:
classMinhaClasse{
}
QuandooJavanoencontraapalavrachave extends,eleentoconsideraquevoc
estherdandodaclasseObject,quetambmseencontradentrodopacotejava.lang.Voc
atmesmopodeescreveressaherana,queamesmacoisa:
OBJECT
classMinhaClasseextendsObject{
}
Todas as classes, sem exceo, herdam de Object, seja direta ou
indiretamente.
Podemos tambm afirmar que qualquer objeto em Java um Object, podendo ser
referenciado comotal.Entoqualquerobjetopossuitodososmtodosdeclaradosnaclasse
Object,everemosalgunsdeleslogoapsocasting.
//...
Objectobject=guardador.pegaObjeto(0);//pegaacontareferenciadocomo
objeto
object.getSaldo();//classeObjectnaotemmtodogetSaldo!nocompila!
PoderamosentoatribuiressarefernciadeObjectparaConta?Tentemos:
ContacontaResgatada=object;
Nstemoscertezadequeesse Object sereferenciaauma Conta,jquefomosns
queoadicionamosnaclassequeguardaobjetos.MasoJavanotemgarantiassobreisso!
Essalinhaacimanocompila,poisnemtodoObjectumaConta.
Paraconseguirrealizaressaatribuio,devemosavisaroJavaquerealmentequeremos
isso, sabendo do risco que podemos estar correndo. Fazemos o casting de
referncias,parecidocomoquandofizemoscomostiposprimitivos:
CASTING DE
REFERNCIAS fazer
ContacontaResgatada=(Conta)object;
Agoraocdigopassaacompilar,masserqueroda?Essecdigorodasemnenhum
problema,poisemtempodeexecuoeleirverificarseessarefernciarealmenteestse
referindoauma Conta,eest!Senotivesse,umaexceodotipo ClassCastException
serialanada.
PoderamosfazeromesmocomFuncionarioeGerente.Tendoumarefernciapara
umFuncionario,quetemoscertezaserumGerente,podemosfazeraatribuio,desdeque
tenhaocasting,poisnemtodoFuncionarioumGerente.
Funcionariofuncionario=newGerente();
//
...edepois
Gerentegerente=funcionario;//nocompila!
//nemtodoFuncionarioumGerente
Ocorretoentoseria:
Gerentegerente=(Gerente)funcionario;
Ateno! O problema aqui poderia ser resolvido atravs da parametrizao da classe
GuardadorDeObjetos.Vejaoapndicedegenerics.
Eagoravamosmisturaralgumascoisas:
Objectobject=newConta();
//
...edepois
Gerentegerente=(Gerente)object;
Essecdigocompila?Roda?
Compila,pormnoroda,elevailanarumaException(ClassCastException)emtempo
de execuo. importante diferenciar tempo de compilao e tempo de execuo. Neste
exemponsgarantimosaojavaquenossoObjetoobjecteraumGerentecomoCasting,por
Captulo14Opacotejava.langPgina145
inti=5;
Integerx=newInteger(i);
EdadoumInteger,podemospegarointqueestdentrodele(desembrulhlo):
inti=5;
Integerx=newInteger(i);
intnumeroDeVolta=x.intValue();
Integerx=5;
Captulo14Opacotejava.langPgina146
inty=x;
NoJava1.4essecdigoinvlido.NoJava5.0elecompilaperfeitamente.importante
ressaltarqueissonoquerdizerquetiposprimitivoserefernciasagorasoamesmacoisa,
issosimplesmenteumadocicamentosintticoparafacilitaracodificao.
Vocpodefazertodosostiposdeoperaesmatemticascomoswrappersagora,porm
correoriscodetomarumNullPointerException.
Vocpodefazeroautoboxingdiretamentepara Object tambm,possibilitandopassar
umtipoprimitivoparaummtodoquereceberObjectcomoargumento:
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
System.out.println("descrio:"+c);
O outro mtodo muito importante o equals. Quando comparamos duas variveis
referncianoJava,o==verificaseasduasreferemseaomesmoobjeto:
Contac1=newConta(100);
Contac2=newConta(100);
if(c1!=c2){
System.out.println("objetosreferenciadossodiferentes!"");
}
Mas,esefosseprecisocompararosatributos?Quaisatributoseledeveriacomparar?O
Javaporsisnofazisso,masexisteummtodonaclasse Object quepodeserreescrito
paracriarmosessecritriodecomparao.Essemtodooequals.
EQUALS
OequalsrecebeumObjectcomoargumento,edeveverificarseelemesmoigualao
Object recebido para retornar um boolean. Se voc no reescrever esse mtodo, o
comportamentoherdadofazerum==comoobjetorecebidocomoargumento.
publicclassConta{
privatedoublesaldo;
//outrosatributos...
publicConta(doublesaldo){
this.saldo=saldo;
}
publicbooleanequals(Objectobject){
ContaoutraConta=(Conta)object;
if(this.saldo==outraConta.saldo){
returntrue;
}
returnfalse;
}
publicStringtoString(){
return"Umacontacomvalor:"+this.saldo;
}
}
Umexemploclssicodousodoequalsparadatas.Sevoccriarduasdatas,isto,dois
objetos diferentes, contendo 31/10/1979, ao comparar com o == receber false, pois so
referncias para objetos diferentes. Seria correto ento reescrever este mtodo, fazendo as
comparaesdosatributos,eousuriopassariaainvocarequalsemvezdecompararcom==.
Vocpoderiacriarummtodocomoutronomeemvezdereescreverequalsquerecebe
Object,maseleimportantepoismuitasbibliotecasochamamatravsdopolimorfismo,como
veremosnocaptulodojava.util.
OmtodohashCode()andademodadacomomtodoequals()edefundamental
entendimentonocasodevocutilizarsuasclassescomestruturasdedadosqueusamtabelas
deespalhamento.Tambmfalamosdelenocaptulodejava.util.
14.8 - java.lang.String
StringumaclasseemJava.VariveisdotipoStringguardamrefernciasobjetos,
enoumvalor,comoacontececomostiposprimitivos.
Alis,podemoscriarumaStringutilizandosedonew:
Captulo14Opacotejava.langPgina148
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);
SPLIT
Stringfrase="javademais";
Stringpalavras[]=frase.split("");
COMPARETO
Stringpalavra="fj11";
palavra.toUpperCase();
System.out.println(palavra);
Podeparecerestranho,maseleimprimefj11emminsculo.Todomtodoqueparece
alterarovalordeumaStringnaverdadecriaumanovaStringcomasmudanassolicitadasea
retorna.Ocdigorealmentetilficariaassim:
Stringpalavra="fj11";
Captulo14Opacotejava.langPgina149
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
Strings="fj11";
s.replaceAll("1","1");
System.out.println(s);
}
}
Comofazerparaeleimprimirfj22?
2)UtilizesedadocumentaodoJavaedescubradequeclasseoobjetoreferenciado
peloatributooutdaSystem.
3)ReescrevaomtodotoStringdasuaclasseContafazendocomqueosaldoseja
devolvido:
abstractclassConta{
privatedoublesaldo;
publicStringtoString(){
return"esseobjetoumacontacomsaldoR$"+saldo;
}
//restante
}
CrieeimprimaumarefernciaparaConta(ContaCorrente ou ContaPoupanca no
casodesuaContaserabstrata).Removaessemtodo,sevoctentarimprimirumareferncia
aContaoqueaparece?
4)ReescrevaomtodoequalsdaclasseContaparaqueduascontascomomesmo
nmerodecontasejamconsideradasiguais.Esboo:
abstractclassConta{
privateintnumero;
publicbooleanequals(Objectobj){
ContaoutraConta=(Conta)obj;
returnthis.numero==outraConta.numero;
}
//restante
}
Compare duas instncias de Conta com ==, depois com equals, sendo que as
instnciassodiferentesmaspossuemomesmonmero.
5) Um double no est sendo suficiente para eu guardar a quantidade de casas
necessrias em uma aplicao. Preciso guardar um nmero decimal muito grande! O que
poderiausar?(consulteadocumentao,tenteadivinharondevocpodeencontraralgodesse
tipopelosnomesdospacotes,vejacomointuitivo).
Captulo14Opacotejava.langPgina151
6) (opcional) Agora faa com que o equals da sua classe Conta tambm leve em
consideraoaStringdonomedoclienteaqualelapertence.Testea.
7) (opcional) Escreva um mtodo que usa os mtodos charAt e length de uma
Stringparaimprimiramesmacaractereacaractere,sendoquecadacaracteredeveestarem
umalinhadiferente.
8) (opcional) Reescrevaomtododoexerccioanteriormasagoraimprimaastringde
trsparaafrente.
9)(opcional)Crieaclasse GuardadorDeObjetos dessecaptulo.Testeaadicionando
umaStringedepoisretirnandocomocastingparaumaoutraclasse,comoConta.Reparea
exception que lanada. Teste tambm o autoboxing do java 5.0 passando um inteiro para
nossoguardador.
10)(opcional)PesquiseaclasseStringBuilder(ouStringBuffernojava1.4).Ela
mutvel.PorqueuslaemvezdaString?Quandousla?
14.11 - Desafio
ConvertaumaStringparaumnmero,semusarasbibliotecasdojavaquejafazemisso.
Isso,umaStringx=767devegeraruminti=767.
Captulo14Opacotejava.langPgina152
captulo
15
Pacote java.io
15
Aotrminodessecaptulo,vocsercapazde:
lereescreverbytes,caractereseStringsde/paraaentradaesadapadro;
lereescreverbytes,caractereseStringsde/paraarquivose
utilizarbuffersparaagilizaraleituraeescritaatravsdefluxos.
UtilizarScannerePrintStream
ARQUIVOS
SOCKETS
ENTRADA E
SADA
AssimcomotodoorestodasbibliotecasemJava,apartedecontroledeentradaesada
dedados(conhecidocomoio)orientadaaobjetoseusaosprincipaisconceitosmostradosat
agora:interface,classesabstratasepolimorfismo.
A idia atrs do polimorfismo no pacote java.io de utilizar fluxos de entrada
(InputStream)edesada(OutputStream)paratodaequalqueroperao,sejaelarelativaa
um arquivo, a uma conexo remota via sockets ou at mesmo a entrada e sada
padrodeumprograma(normalmenteotecladoeoconsole).
As classes abstratas InputStream e OutputStream definem respectivamente o
comportamentopadrodosfluxosemJava:emumfluxodeentradapossvellerbyteseno
fluxodesadaescreverbytes.
Agrandevantagemdessaabstraopodesermostradaemummtodoqualquerque
Captulo15Pacotejava.ioPgina153
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");
Captulo15Pacotejava.ioPgina154
4.
5.
6.
7.
8.}
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
Strings=br.readLine();
}
Comooprprionomediz,essaclasseldo Reader porpedaos(chunk)paraevitar
realizarmuitaschamadasaosistemaoperacional.Vocpodeatconfigurarotamanhodobuffer
peloconstrutor.
essaacomposiodeclassesqueestacontecendo:
Aquilemosapenasaprimeiralinhadoarquivo.OmtodoreadLinedevolvealinhaque
foilidaemudaocursorparaaprximalinha.CasoelechegueaofimdoReader(nonossocaso
fimdoarquivo),elevaidevolver null.Entocomumsimpleslaopodemosleroarquivopor
inteiro:
1.classTestaEntrada{
2.
publicstaticvoidmain(String[]args)throwsIOException{
3.
InputStreamis=newFileInputStream("arquivo.txt");
4.
InputStreamReaderisr=newInputStreamReader(is);
5.
BufferedReaderbr=newBufferedReader(isr);
6.
Strings=br.readLine();//primeiralinha
7.
8.
while(s!=null){
9.
System.out.println(s);
10.
s=br.readLine();
11.
}
12.
}
13.}
Captulo15Pacotejava.ioPgina155
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.
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
11.}
LembresededarrefreshnoseuprojetodoEclipseparaqueoarquivocriadoaparea.O
FileOutputStreampodereceberumbooleanocomosegundoparmetroparaindicarsevoc
querreescreveroarquivooumanteroquejestavaescrito(append).
Omtodowritedo BufferedWriter noinsereo(s)caractere(s)dequebradelinha,
paraissovocpodechamaromtodonewLine.
Fechandooarquivo
importantssimosemprelembrardefecharoarquivo,ouaclasseaqualvocestutilizandopara
facilitaraleitura/escrita(elesemprevaifecharostreamdoqualeleestlendoquandovocinvocar
oclosedeste).
Eledeveserinvocadodequalquermaneira,porissocomumqueocloseestejadentrodeum
blocofinally.Seumarquivo foresquecidoaberto,earefernciaparaeleforperdida,eleser
fechadopelogarbagecollector,queveremosmaisafrente,porcausadofinalize.Masnobom
vocseprenderaisso.Sevocesquecerdefecharoarquivonocasodeumprogramaminsculo
comoesse,oprogramavaiterminarantesqueotaldogarbagecollectorteajude,resultandoem
umarquivonoescrito(osbytesficaramnobufferdoBufferedWriter).
Problemassimilarespodemacontecercomleitoresdeixadosemaberto)
Captulo15Pacotejava.ioPgina157
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
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
Apsrodarseuprograma,deumrefreshnoseuprojeto(cliquedadireitanonomedo
projeto,refresh),evejaqueelecriouumarquivosaida.txtnodiretrio.
6)(opcional)Alterenovamenteoprogramaparaelevirarumpequenoeditor:ldoteclado
eescreveemarquivo.Reparequeamudanamnima!
Captulo15Pacotejava.ioPgina160
captulo
16
Collections framework
16
Aotrminodessecaptulovocsercapazde:
utilizararrays,lists,setsoumapsdependendodanecessidadedoprograma;
iterareordenarlistasecoleese
usarmapasparainseroebuscadeobjetos.
Autilizaodearrayscomplicadaemmuitospontos:
nopodemosredimensionarumaarrayemJava;
impossvelbuscardiretamenteporumdeterminadoelementoparaoqualnosesabe
ondice;
noconseguimossaberquantasposiesdaarrayjforampopuladassemcriar,para
isso,mtodosauxiliares.
RetireaquartaConta
conta[3]=null;
Nafiguraacima,vocpodeverumarrayqueantesestavasendocompletamenteutilizado,
equedepoisteveumdeseuselementosremovidos.
Supondo que os dados armazenados representem contas, o que acontece quando
precisarmosinserirumanovacontanobanco?
Precisaremosprocurarporumespaovazio?
Iremosguardaremalgumaestruturadedadosexternaasposiesvazias?
Esenohouverespaovazio?Teramosdecriarumarraymaiorecopiarosdadosdo
antigoparaele?
Hmaisquestes:comoseiquantasposiesestosendousadasnoarray?Vouprecisar
semprepercorreroarrayinteiroparaconseguiressainformao?
Captulo16CollectionsframeworkPgina161
Almdessasdificuldadesqueasarraysapresentavam,faltavaumconjuntorobustode
classesparasupriranecessidadedeestruturasdedadosbsicas,comolistasligadasetabelas
deespalhamento.
COLLECTIONS
Comesseseoutrosobjetivosemmente,aSuncriouumconjuntodeclasseseinterfaces
conhecidocomoCollections Frameworkqueresidenopacotejava.util.
Collections
AAPIdoCollectionsrobustaepossuidiversasclassesquerepresentamestruturasdedados
avanadas.
Porexemplo,nonecessrioreinventararodaecriarumalistaligadamassimutilizaraquelaque
aSundisponibilizou.
LIST
AimplementaomaisutilizadadainterfaceListaArrayListquetrabalhacomuma
arrayinternaparagerarumalistaportantoelamaisrpidanapesquisaquesuaconcorrente,a
LinkedList,quemaisrpidanainseroeremoodeitensnaspontas.
ArrayListnoumaarray!
comumconfundiremumaArrayListcomumaarray,pormelanoumaarray,oqueocorre
que internamente ela usa uma array como estrutura para armazenar os dados, porm este
atributoestpropriamenteencapsuladoevocnotemcomoacessalo.Reparetambmquevoc
nopodeusar[]comumaArrayList,nemacessaratributolength.Nohrelao!
ParacriarumArrayListbastachamaroconstrutor:
ArrayListlista=newArrayList();
semprepossvelabstrairalistaapartirdainterfaceList:
Listlista=newArrayList();
Paracriarumalistadenomes(String),podemosfazer:
Listlista=newArrayList();
lista.add("Guilherme");
lista.add("Paulo");
Captulo16CollectionsframeworkPgina162
lista.add("Srgio");
Ainterface List possuidoismtodos add,umquerecebeoobjetoaserinseridoeo
colocanofinaldalistaeumsegundoquepermiteadicionaroelementoemqualquerposioda
mesma.
Notequeemmomentoalgumdizemosqualotamanhodalista;podemosacrescentar
quantoselementosquisermosquealistacresceconformefornecessrio.
Todalista(naverdade,todaCollection)trabalhadomodomaisgenricopossvel.Isto
,nohumaArrayListespecficaparaStrings,outraparaNmeros,outraparaDatasetc.
TodososmtodostrabalhamcomObject.
Assim,possvelcriar,porexemplo,umalistadeContasCorrentes:
ContaCorrentec1=newContaCorrente();
c1.deposita(100);
ContaCorrentec2=newContaCorrente();
c2.deposita(200);
ContaCorrentec3=newContaCorrente();
c3.deposita(300);
Listcontas=newArrayList();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Parasaberquantoselementoshnalista,podemosusaromtodosize():
System.out.println(contas.size());
Haindaummtodoget(int)querecebecomoargumentoondicedoelementoque
sequerrecuperar.Atravsdelepodemosfazerumforparaiterarnalistadecontas:
for(inti=0;i<contas.size();i++){
contas.get(i);//cdigonomuitotil....
}
Mascomofazerparaimprimirosaldodessascontas?Podemosacessaro getSaldo()
diretamente aps fazer contas.get(i)? No podemos; lembrese que toda lista trabalha
semprecomObject.Assimarefernciaretornadapeloget(i)dotipoObject,sendonecessrio
ocastparaContaCorrentesequisermosacessarogetSaldo():
for(inti=0;i<contas.size();i++){
ContaCorrentecc=(ContaCorrente)contas.get(i);
System.out.println(cc.getSaldo());
}
//notequeaordemdoselementosnoalterada
Haindaoutrosmtodoscomoremove()querecebeumobjetoquesedesejaremoverda
lista;econtains()querecebeumobjetocomoargumentoedevolvetrueorfalseindicando
seoelementoestounonalista.
Ainterface List ealgumasclassesqueaimplementampodemservistasnodiagrama
UMLaseguir:
Captulo16CollectionsframeworkPgina163
Acessoaleatrioepercorrendolistascomget
Algumaslistas,comoa ArrayList,temacessoaleatrioaosseuselementos:abuscaporum
elementoemumadeterminadaposiofeitademaneiraimediata,semquealistainteiraseja
percorrida.
Neste caso o acesso feito atravs do mtodo get(int) e muito rpido. Caso contrrio,
percorrer uma lista usando um for como esse que acabos de ver, pode ser desastroso. Ao
percorrermosumalistas,devemosusarsempreumIteratorouenhancedfor,comoveremos.
Umalistaumaexcelentealternativaaumarraycomumjquetemostodososbenefcios
dearrays,semanecessidadedetomarcuidadocomremoes,faltadeespaoetc.
A outra implementao muito usada (LinkedList), fornece mtodos adicionais para
obtereremoveroprimeiroeltimoelementodalista.
Vector
OutraimplementaoatradicionalclasseVector,presentedesdeoJava1.0,quefoiadaptada
parausocomoframeworkdecollections,comainclusodenovosmtodos.
Eladevesertratadacomcuidadopoislidadeumamaneiradiferentecomprocessoscorrendoem
paraleloesermaislentoqueumaArrayListquandonohouveracessosimultneoaosdados.
Captulo16CollectionsframeworkPgina164
Geralmentenonosinteressaumalistacomvriostiposdeobjetosmisturados;nodiaa
dia,usamoslistascomoaqueladecontascorrentes.NoJava5.0,podemosusarorecursode
Genericspararestringiraslistasaumdeterminadotipodeobjetos(enoqualquerObject):
List<ContaCorrente>contas=newArrayList<ContaCorrente>();
contas.add(c1);
contas.add(c3);
contas.add(c2);
Reparenousodeumparmetroaoladode List e ArrayList:eleindicaquenossa
listafoicriadaparatrabalharexclusivamentecomobjetosdotipoContaCorrente.Issonostraz
umaseguranaemtempodecompilao:
contas.add("umastring");//issonocompilamais!!
OusodeGenericstambmeliminaanecessidadedecasting,jqueseguramentetodos
osobjetosinseridosnalistaserodotipoContaCorrente:
for(inti=0;i<contas.size();i++){
ContaCorrentecc=contas.get(i);//semcasting!
System.out.println(cc.getSaldo());
}
contas.add(c3);
contas.add(c2);
Collections.sort(contas);//qualocritriodeordenao?
Semprequefalamosemordenao,precisamospensaremum critriodeordenao,
umaformadedeterminarqualelementovemantesdequal.necessrioinstruiroJavasobre
comocompararnossasContaCorrenteafimdedeterminarumaordemnalista.
COMPARABLE
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
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
contas.add(c3);
Collections.sort(contas);
Faaumlaoparaimprimirtodosossaldosdascontasnalistajordenada:
for(inti=0;i<contas.size();i++){
System.out.println(saldo:+contas.get(i).getSaldo());
}
Atenoespecial:reparequeescrevemosummtodocompareToemnossaclasse,e
nosso cdigo nunca o invoca!! Isto muito comum, reescrevemos (ou implementamos) um
mtodoequemoinvocarserumoutroconjuntodeclasses(nessecasoquemestchamando
ocompareTooCollections.sort,queousacomobaseparaoalgoritmodeordenao).
Issocriaumsistemaextremamentecoesa,eaomesmotempocombaixoacoplamento:aclasse
CollectionsnuncaimaginouqueordenariaobjetosdotipoContaPoupanca,masjqueeles
soComparable,oseumtodosortestsatisfeito.
(opcional)Sepreferirinsiranovascontasatravsdeumlao(for).Paracolocarsaldos
aleatrios,adivinheonomedaclasseparaisso?Random.Dopacotejava.util.Consultesua
documentaoparausla.
3) O que teria acontecido se a classe ContaPoupanca no implementasse
Comparable<ContaPoupanca>?
4)(opcional)Imprima arefernciaparaessalista. Reparequeo toString deuma
Array/LinkedListreescrito:
System.out.println(contas);
Umconjunto(Set)funcionadeformaanlogaaosconjuntosdamatemtica,eleuma
coleoquenopermiteelementosduplicados.
Possveisaesemumconjunto:
AcamisetaAzulestnoconjunto?
RemovaacamisetaAzul.
AdicioneacamisetaVermelha.
Limpeoconjunto.
Noexistemelementosduplicados!
Ao percorrer um conjunto, sua ordem
noconhecida!
Captulo16CollectionsframeworkPgina168
Outracaractersticafundamentaldeleofato
de que a ordem em que os elementos so
armazenados pode no ser a ordem na qual eles
foraminseridosnoconjunto.
Tal ordem varia de implementao para
implementao.
Um conjunto representado pela interface
Set etemcomosuasprincipaisimplementaesas
classesHashSeteTreeSet.
Ocdigoaseguircriaumconjuntoeadiciona
trsitens,apesardetentaradicionarquatro:
Setconjunto=newHashSet();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
conjunto.add("item3");
//imprimeasequncianatela
System.out.println(conjunto);
Oresultadosooselementosdoconjunto,aordemnaqualelesaparecempodemouno
seraordemnaqualelesforaminseridoseincorretosuporquesersempreamesmaordem!
Ordenandoumset
Seria possvel usar uma outra implementao de conjuntos, como um TreeSet, que insere os
elementos,detalforma,quequandoforempercorridos,aparecememumaordemdefinidapelo
mtodo de comparao entre seus elementos. Esse mtodo definido pela interface
java.lang.Comparable.OuaindapodesepassarumComparatorparaseuconstrutor.
No Java 5.0, assim como as listas, um conjunto tambm pode ser parametrizado
utilizandoGenerics,eliminandoanecessidadedecastings.
Adicionaumelementonacoleo.Comoalgumascoleesno
suportam elementos duplicados, este mtodo retorna true ou
falseindicandoseaadiofoiefetuadacomsucesso.
booleanremove(Object)
Removedeterminado elementodacoleo.Seelenoexistia,
retornafalse.
intsize()
Retornaaquantidadedeelementosexistentesnacoleo.
booleancontains(Object)
Captulo16CollectionsframeworkPgina169
nomtodoequals()doobjeto,enoatravsdooperador==.
Iteratoriterator()
Retornaumobjetoquepossibilitapercorreroselementosdaquela
coleo.
MAP
Captulo16CollectionsframeworkPgina170
Possveisaesemumiterador:
Existe um prximo elemento na
coleo?.
Pegueoprximoelemento.
Removaoelementoatualdacoleo.
ContaCorrentec=
(ContaCorrente)iterator.next();
PrimeirocriamosumIteratorqueentranacoleo.
Acadachamadadomtodonext,oIteratorretornao
prximoobjetodoconjunto.
Umiteratorpodeserobtidocomomtodo iterator()
deCollection,porexemplo:
Iteratori=lista.iterator();
A interface Iterator possui dois mtodos principais:
hasNext() (comretornobooleano)indicaseaindaexisteum
elementoaserpercorrido;next()retornaoprximoobjeto.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//populaoconjunto
Setconjunto=newHashSet();
conjunto.add(item1);
conjunto.add(item2);
conjunto.add(item3);
//retornaoiterator
Iteratori=conjunto.iterator();
while(i.hasNext()){
//recebeapalavra
Objectelemento=i.next();
Stringpalavra=(String)elemento;
//mostraapalavra
System.out.println(palavra);
O while anteriorsterminaquandotodososelementosdoconjuntoforempercorridos,
isto,quandoomtodohasNextmencionarquenoexistemmaisitens.
Emqueordemseroacessadososelementos?
Numalista,oselementosiroaparecerdeacordocomondiceemqueforaminseridos,
isto , de acordo com o que foi prdeterminado. Em um conjunto, a ordem depende da
Captulo16CollectionsframeworkPgina171
implementaodainterfaceSet.
PorqueoSetentotoimportanteeusado?
ParaperceberseumitemjexisteemumalistamuitomaisrpidousarumSetdoque
umList,eosTreeSetsjvemordenadosdeacordocomascaractersticasquedesejarmos!
ListIterator
Umalistafornece,almdeacessoaumIterator,umListIterator,queoferecerecursosadicionais,
especficosparalistas.
UsandooListIteratorvocpode,porexemplo,adicionarumelementonalistaouvoltarparao
elementoquefoi"iterado"anteriormente.
Setconjunto=newHashSet();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
//retornaoiterator
for(Objectelemento:conjunto){
Stringpalavra=(String)elemento;
System.out.println(palavra);
}
OJavavaiusaroiteratorda Collection dadaparapercorreracoleo.Sevocj
estiver usando uma coleo parametrizada, o for pode ser feito utilizando um tipo mais
especfico:
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set<String>conjunto=newHashSet<String>();
conjunto.add("item1");
conjunto.add("item2");
conjunto.add("item3");
//retornaoiterator
for(Stringpalavra:conjunto){
System.out.println(palavra);
}
Issopossvelporcausaqueomtodo iterator() da Collection<Tipo> devolve
umIterator<Tipo>.
Captulo16CollectionsframeworkPgina172
chaves
valores
Possveisaesemummapa:
Mapeieumachaveaumvalor
OqueestmapeadonachaveX?
Remapeieumacertachave
Querooconjuntodechaves.
Querooconjuntodevalores.
DesmapeieachaveX.
Captulo16CollectionsframeworkPgina173
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.
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
16.12 - Exerccios
1)Crieumcdigoqueinsira100milnmerosnumaArrayListepesquiseos.Vamos
usarummtododeSystemparacronometrarotempogasto:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
publicclassTestaPerformance{
publicstaticvoidmain(String[]args){
System.out.println("Iniciando...");
longinicio=System.currentTimeMillis();
Collection<Integer>teste=newArrayList<Integer>();
for(inti=0;i<30000;i++){
teste.add(i);
}
for(inti=0;i<30000;i++){
teste.contains(i);
}
longfim=System.currentTimeMillis();
doubletempo=(fiminicio)/1000.0;
System.out.println("Tempogasto:"+tempo);
}
}
TroqueaArrayListporumHashSeteverifiqueotempoquevaidemorar:
Collection<Integer>teste=newHashSet<Integer>();
Adiferenamaisquegritante.Sevocpassarde30milparaumnmeromaior,como
50ou100mil,verqueissoinviabilizaportotalousodeumaListanocasoemquequeremos
pesquisarmuito.
2)(conceitual)Reparequesevocdeclararacoleoedernewassim:
Collection<Integer>teste=newArrayList<Integer>();
emvezde
ArrayList<Integer>teste=newArrayList<Integer>();
garantido que vai ter de alterar s essa linha para substituir a implementao por
HashSet. Estamos aqui usando o polimorfismo para nos proteger que mudanas de
implementaovenhamnosobrigaraalterarmuitocdigo.Maisumavez: programevoltadoa
interface,enoaimplementao!Esseum excelente exemplodebomusodeinterfaces,
afinal,dequeimportacomoalistafunciona?Oquequeremosumalista,issonossuficiente!
Esse um cdigo extremamente elegante e flexvel. Obviamente algumas vezes no
conseguimostrabalhardessaforma,eprecisamosusarumainterfacemaisespecficaoumesmo
nosreferiraoobjetopelasuaimplementaoparapoderchamarmtodosmaisespecficos(por
exemplo, TreeSet temmaismtodosqueem Set,assimcomo LinkedList emrelaoa
List).
3)(opcional)Faatestescomo Map<String,ContaCorrente>,comovistonesse
captulo.
Captulo16CollectionsframeworkPgina176
16.13 - Desafios
1)Geretodososnmerosentre1e1000eordeneemordemdecrescenteutilizandoum
TreeSet.
2)Geretodososnmerosentre1e1000eordeneemordemdecrescenteutilizandoum
ArrayList.
Captulo16CollectionsframeworkPgina177
captulo
17
17
Threads
Aotrminodessecaptulo,vocsercapazde:
executartarefassimultaneamente;
colocartarefasparaaguardarumsinal;
esperaralgunssegundosparacontinuaraexecuodeumprograma.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Podemos, em Java, facilmente criar uma classe que tem um mtodo que vai ser
executadoconcorrentementecomoseumain.Paraisso,vocprecisaimplementarainterface
Runnable,quedefineomtodorun.
packagebr.com.caelum.threads;
classProgramaimplementsRunnable{
privateintid;
//colocargetteresetterproatributoid
publicvoidrun(){
for(inti=0;i<10000;i++){
System.out.println("Programa"+id+"valor:"+
i);
12.
13.
14.
}
}
}
Paravoccriaressanovalinhadeexecuo(Thread),muitosimples.
THREAD
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
packagebr.com.caelum.threads;
classTeste{
publicstaticvoidmain(String[]args){
Programap=newPrograma();
p.setId(1);
Threadt=newThread(p);
t.start();
}
}
Mas,esetivermososeguintecaso:
1.
2.
3.
packagebr.com.caelum.threads;
classTeste{
Captulo17ThreadsPgina178
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
publicstaticvoidmain(String[]args){
Programap1=newPrograma();
p1.setId(1);
Programap2=newPrograma();
p2.setId(2);
Threadt1=newThread(p1);
Threadt2=newThread(p2);
t1.start();
t2.start();
}
}
Oquevaiaparecer?Duasvezesde0a9999?Intercalado0,0,1,1....?Vocnosabe!
Vocnotemocontrole,enemsabe,quemexecutaemcadamomento.Aidiadecriar
uma Thread exatamente estar pedindo que as execues desses dois cdigos seja
concorrente,isto,noimportaaordemparavoc.Seaordemdeexecuoimportasse,voc
deveriatercolocadotudonumanicalinhadeexecuo!
Quandovocchamaavirtualmachine,elacriaumaThreadpararodaroseumain.
Evocpodeestarcriando(disparando)outras.
Dormindo
SLEEP
Para que a thread atual durma basta chamar o mtodo a seguir, por exemplo, para dormir 3
segundos:
Thread.sleep(3*1000);
OGarbage Collector(coletordelixo,lixeiro)umaThreadresponsvelporjogarfora
todososobjetosquenoestosendoreferenciadospornenhumaoutraThread,sejadiretaou
indiretamente!
Contaconta1=newContaCorrente();
Contaconta2=newContaCorrente();
Captulo17ThreadsPgina179
Atestemomento,sabemosquetemos2objetosemmemria.Esefizermososeguinte:
conta2=conta1;
Quantosobjetostemosemmemria?Perdemosumadasrefernciaparaumdoscarros
queforamcriados.Esseobjetojnomaisacessvel.Temosentoapenasumobjetoem
memria?
Vocnosabe!ComooGarbageCollectoruma Thread,vocnotemgarantiade
quandoelevairodar.Vocssabequealgumdiaaquelamemriavaiserliberada.
System.gc();
VocnoconseguenuncaforarqueoGarbageCollectorrode,maschamandoomtodoesttico
gcdaclasseSystem,vocestasugerindoparaqueaVirtualMachinerodeoGarbageCollector
naquelemomento.Sesuasugestovaiseraceitaouno,istodependeevocnotemgarantias.
Eviteousodestemtodo.
Finalizer
AclasseObjectdefinetambmummtodofinalize,quevocpodereescrever.Essemtodo
ser chamado no instante antes do Garbage Collector coletar este objeto. No um
destrutor! Ele nem sempre ser chamado!
17.4 - Exerccios
1) Gere diversas threads simultneas contando de 1 at 1000. Veja o interleaving
(entrelaamentodosprocessos):
1.
2.
3.
4.
5.
6.
7.
8.
9.
classProgramaimplementsRunnable{
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
classTeste{
publicstaticvoidmain(String[]args){
Programap1=newPrograma();
Threadt1=newThread(p1);
t1.start();
publicvoidrun(){
for(inti=0;i<1000;i++){
System.out.println(i);
}
}
}
Programap2=newPrograma();
Threadt2=newThread(p1);
t2.start();
}
}
Aumente o nmero de ciclos caso necessrio.
2-) (Opcional) Crie cada uma das threads da seguinte maneira:
1.
classTeste{
Captulo17ThreadsPgina180
2.
3.
4.
5.
6.
publicstaticvoidmain(String[]args){
newThread(newPrograma()).start();
newThread(newPrograma()).start();
}
}
Como explicar o funcionamento dessa estranha sintaxe? Porque compila?
publicclassConta{
privatedoublesaldo;
//outrosmetodoseatributos...
publicvoidatualiza(doubletaxa){
doublesaldoAtualizado=this.saldo*(1+taxa);
this.saldo=saldoAtualizado;
}
publicvoiddeposita(doublevalor){
doublenovoSaldo=this.saldo+valor;
this.saldo=novoSaldo;
}
}
Imagine uma Conta com saldo de 100 reais. Um cliente entra na agncia e faz um
depsitode1000reais.IssodisparaumaThreadnobancoquechamaomtododeposita();ele
comeacalculandoonovoSaldoquepassaaser1100(linha13).Squeporalgummotivoque
desconhecemos,oescalonadorpraessathread.
Captulo17ThreadsPgina181
Neste exato instante ele comea a executar uma outra Thread que chama o mtodo
atualizadamesmaConta,porexemplo,comtaxade1%.IssoquerdizerqueonovoSaldopassa
avaler101reais(linha8).E,nesseinstanteoescalonadortrocadeThreadsnovamente.Agora
eleexecutaalinha14naThreadquefaziaodepsito;osaldopassaavaler1100.Acabandoo
deposita,oescalonadorvoltapraThreaddoatualizaeexecutaalinha9,fazendoosaldovaler
101reais.
Resultado:odepsitodemilreaisfoitotalmenteignoradoeseuClienteficarpoucofeliz
comisso.Percebaquenopossveldetectaresseerro,jquetodoocdigofoiexecutado
perfeitamente,semproblemas.OproblemaaquifoioacessosimultneodeduasThreadsao
mesmoobjeto.
THREAD
SAFE
EoerrosocorreuporqueoescalonadorparounossasThreadsnaquelesexatoslugares.
Podeserquenossocdigofiquerodando1anosemdarproblemaalgumeemumbelodiao
escalonadorresolvealternarnossasThreadsdaquelaforma.Nosabemoscomooescalonador
secomporta!Temosqueprotegernossocdigocontraessetipodeproblema.Dizemosqueessa
classenothreadsafe,isso,noestprontaparaterumainstnciautilizadaentrevrias
threadsconcorrentemente.
OquequeramoseraquenofossepossvelalgumatualizaraContaenquantooutra
pessoaestdepositandoumdinheiro.QueramosqueumaThreadnopudessemexeremuma
Conta enquanto outra Thread est mexendo nela. Queramos que a execuo dos mtodos
fosse atmica;quesuaexecuonopudesseserinterrompidaporoutraThreadquefosse
acessarumoutromtodoquemexecomosmesmosrecursosqueestes.Nohcomoimpediro
escalonadordenossubstituir,entooquefazer?
Umaidiaseriacriarumatrava,enomomentoemqueuma Thread entrasseemum
dessesmtodos,trancassecomumachaveaentradaparaeles,dessamaneira,mesmoque
sendocolocadadelado,nenhumaoutraThreadpoderiaentrarnessesmtodos,poisachave
estariacomaoutraThread.
LOCK
Podemos fazer isso em Java. Podemos usar qualquer objeto como um lock (trava,
chave),parapodersincronizaremcimadesseobjeto,isto,seumaThreadentraremumbloco
quefoidefinidocomosincronizadoporesselock,apenasumaThreadpoderestarldentroao
mesmotempo,poisachaveestarcomela.
Apalavrachave synchronized dessacaractersticaaumblocodecdigo,erecebe
qualoobjetoqueserusadocomochave.Achavesdevolvidanomomentoemquea
Thread quetinhaessachavesairdobloco,sejaporreturn oudisparodeumaexceo(ou
aindanautilizaodomtodowait())..
SYNCHRONIZED
QueremosentobloquearoacessosimultneoaumamesmaConta:
1.public class Conta {
2.
3.
private double saldo;
4.
5.
// outros metodos e atributos...
6.
7.
public void atualiza(double taxa) {
8.
synchronized (this) {
9.
double saldoAtualizado = this.saldo * (1 + taxa);
10.
this.saldo = saldoAtualizado;
11.
}
12.
}
13.
Captulo17ThreadsPgina182
14.
15.
16.
17.
18.
19.
20.
21.}
Observeousodosblocossynchronizeddentrodosdoismtodos.Elesbloqueiamuma
ThreadutilizandoomesmoobjetoConta,othis.
Esses mtodos agora so mutuamente exclusivos, e s executam de maneira
atmica.Threadstentandopegarumlockquejestpego,ficaroemumconjuntoespecial
esperandopelaliberaodolock(nonecessariamentenumafila).
Sincronizandooblocointeiro
comumsempresincronizarmosummtodointeiro,enormalmenteemcimadothis.
publicvoidmetodo(){
synchronized(this){
//conteudodometodo
}
}
Paraisto,existeumasintaxemaissimples:
publicsynchronizedvoidmetodo(){
//conteudodometodo
}
Detalhe: se o mtodo for esttico, ser sincronizado usando o lock do objeto da classes
(NomeDaClasse.class).
Captulo17ThreadsPgina184
captulo
18
E agora?
18
Ondecontinuaraoterminaro'JavaeOrientaoaObjetos'.
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
18.6 - Revistas
Diversasrevistas,noBrasilenoexterior,estudamomundojavacomoningumepodem
ajudaroinicianteaconhecermuitodoqueestacontecendolforanasaplicaescomerciais.
Captulo18Eagora?Pgina186
captulo
19
19
Apndice A - Sockets
Olho por olho, e o mundo acabar cego.
MohandasGandhi
Conectandoseamquinasremotas.
19.2 - Protocolo
TCP
Danecessidadededoiscomputadoressecomunicarem,surgiramdiversosprotocolosque
permitissemtaltrocadeinformao:oprotocoloqueiremosusaraquio TCP (Transmission
ControlProtocol).
AtravsdoTCPpossvelcriarumfluxoentredoiscomputadorescomomostradono
diagramaabaixo:
Servidor
Aplicao
Cliente
Fluxo
Aplicao
Cliente
Fluxo
Aplicao
Cliente
Fluxo
Exemplos:
Bancode
dados
Webserver
Servidorde
icq
Central
bancria
Captulo19ApndiceASocketsPgina187
possvelconectarmaisdeumclienteaomesmoservidor,comoocasodediversos
bancodedados,webserversetc.
Ao escrever um programa em Java que se comunique com outra aplicao, no
necessriosepreocuparcomumnveltobaixoquantooprotocolo.Asclassesquetrabalham
comelesjforamdisponibilizadasparaseremusadaspornsnopacotejava.net.
AvantagemdeseusarTCPemvezdecriarnossoprprioprotocolosdebytesqueo
TCPvaigarantiraentregadospacotesquetransferirmos,ecriarumprotocolobaseparaisto
algobemcomplicado.
19.3 - Porta
Acabamosdemencionarquediversoscomputadorespodemseconectaraums,masna
realidademuitocomumencontrarmquinasclientescomumasconexofsica.Entocomo
possvelseconectaradoispontos?Comopossvelserconectadopordiversospontos?
Todos as aplicaes que esto enviando e recebendo dados fazem isso atravs da
mesmaconexofsicamasocomputadorconseguediscernirduranteachegadadenovosdados
quaisinformaespertencemaqualaplicao,mascomo?
Cliente
Firefox1.0
Fluxo
Cliente
Opera7.54
Fluxo
ServidorWeb
ip10.0.0.1
porta80
PORTA
Assim como existe o IP para indentificar uma mquina, a porta a soluo para
indentificardiversasaplicaesemumamquina.Estaportaumnmerode2bytes,varia de
0 a 65535. Se todas as portas de uma mquina estiverem ocupadas no possvel se
conectaraelaenquantonenhumaforliberada.
Aoconfigurarumservidorpararodarnaporta80(padrohttp),possvelseconectara
esseservidoratravsdessaporta,quejuntocomoipvaiformaroendereodaaplicao.Por
exemplo,oservidorwebdacaelum.com.brpodeserrepresentadopor:
caelum.com.br:80
19.4 - Socket
Mas se um cliente se conecta a um programa rodando na porta 80 de um servidor,
enquantoelenosedesconectardessaportaserimpossvelqueoutrapessoaseconecte?
Acontecequeaoefetuaraconexo,aoaceitaraconexo,oservidorredirecionaocliente
deumaportaparaoutra,liberandonovamentesuaportainicialepermitindoqueoutrosclientes
seconectemnovamente.
Captulo19ApndiceASocketsPgina188
Cliente
Firefox
1.0
Cliente
Opera
7.54
Iniciandona
porta80
ServidorWeb
ip10.0.0.1
porta80
Continua
emoutra
EmJava,issodeveserfeitoatravsdethreadseoprocessodeaceitaraconexodeve
serrodadoomaisrpidopossvel.
19.5 - Servidor
Iniciandoagoraummodelodeservidordechat,oserviodocomputadorquefunciona
comobasedeveprimeiroabrirumaportaeficarouvindoatalgumtentarseconectar.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
importjava.net.*;
publicclassServidor{
publicstaticvoidmain(Stringargs[]){
try{
ServerSocketservidor=newServerSocket(10001);
System.out.println("Porta10001aberta!");
//acontinuaodoservidordeveserescritaaqui
}catch(IOExceptione){
System.out.println("Ocorreuumerronaconexo");
e.printStackTrace();
}
}
}
Seoobjetoforrealmentecriadosignificaqueaporta10001estavafechadaefoiaberta.
Seoutroprogramapossuiocontroledestaportanesteinstante,normalqueonossoexemplo
nofuncionepoiselenoconsegueutilizarumaportaquejestemuso.
Apsabrira porta, precisamos esperar porumcliente atravs domtodo accept da
ServerSocket.Assimqueumclienteseconectaroprogramaircontinuar,porissodizemos
queessemtodoblocante,seguraathreadatquealgoonotifique.
Socketcliente=servidor.accept();
System.out.println("Novaconexocomocliente"+
cliente.getInetAddress().getHostAddress()
);
Porfim,bastalertodasasinformaesqueoclientenosenviar:
BufferedReaderin=newBufferedReader(
newInputStreamReader(cliente.getInputStream()));
while(true){
Captulo19ApndiceASocketsPgina189
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
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
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
publicclassLeitorimplementsRunnable{
privateScannerentrada;
publicLeitor(InputStreamstream){
this.entrada=newScanner(stream);
}
publicvoidrun(){
while(entrada.hasNextLine()){
System.out.println(entrada.nextLine());
}
}
}
1.
publicclassCliente{
2.
3.
publicstaticvoidmain(Stringargs[])throwsIOException{
4.
5.
Socketsocket=newSocket(127.0.0.1,10001);
6.
System.out.println(Oclienteseconectouaoservidor!);
7.
8.
//criandoleitorquevailerdasocketeimprimirno
console
9.
Leitorleitor=newLeitor(socket.getInputStream());
10.
newThread(leitor).start();
11.
12.
Scannerteclado=newScanner(System.in);
13.
PrintStreamsaida=new
PrintStream(socket.getOutputStream());
14.
15.
//lendodotecladoeescrevendonasocket
16.
while(teclado.hasNextLine(){
17.
saida.println(teclado.nextLine());
18.
}
19.
}
20.
21.}
1.publicclassServidor{
2.
//codigodoservidormuitoparecido!Samaneiradeobter
3.
//aSocketquemuda
4.
//Podemosatreaproveitalosemcopiarecolar.Comofazerisso?
5.
6.
publicstaticvoidmain(Stringargs[])throwsIOException{
7.
ServerSocketserverSocket=newServerSocket(10001);
Captulo19ApndiceASocketsPgina193
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.}
Socketsocket=serverSocket.accept();
System.out.println(Servidorrecebeuconexaodocliente);
//criandoleitorquevailerdasocketeimprimirnoconsole
Leitorleitor=newLeitor(socket.getInputStream());
newThread(leitor).start();
Scannerteclado=newScanner(System.in);
PrintStreamsaida=newPrintStream(socket.getOutputStream());
//lendodotecladoeescrevendonasocket
while(teclado.hasNextLine(){
saida.println(teclado.nextLine());
}
}
Captulo19ApndiceASocketsPgina194
captulo
20
20
UtilizandoaAPIdoSiwngparafazerintrefacesgrficasemJava
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.
estticochamadoshowMessageDialog.
package br.com.caelum.fj11.swing;
import javax.swing.JOptionPane;
public class OlaSwing {
public static void main(String[] args) {
JOptionPane.showMessageDialog(null, "Ola Swing!");
}
}
Issoexibiraseguintetela:
Porltimo,paraexibirmosnossoformulriosimples,precisamoscolocarnossoJpanelem
umajanela.UsaremosaclasseJFrame,querepresentaumajanelasimples.
// Criamos um JFrame passando o ttulo da janela
JFrame frame = new JFrame("Meu primeiro formulrio");
// Adicionamos nosso JPanel
frame.add(panel);
// Preparamos o JFrame para exibio
frame.pack();
frame.setVisible(true);
Omtodopack()deJFrame,chamadoacima,servepararedimensionarnossoframepara
um tamanho adequado baseado nos componentes que ele tem. E o setVisible recebe um
booleanindicandosequeremosqueajanelasejavisvelouno.
Vamosapenasadicionarumltimocomandoqueindicaaonossoframequeaaplicao
deveserterminadaquandoousuriofecharajanela.
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Noexemplocompletoabaixo,colocamostodasasvariveiscomoatributosecriamosum
mtodochamadomontaFormulariocomtodoocdigoexplicadoantes.Nomtodomain,criamos
umnovoFormularioechamamosomtodomontaFormulario():
package br.com.caelum.fj11.swing;
import javax.swing.*;
public class Formulario {
private JLabel label;
private JTextField textField;
private JPanel panel;
private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
panel = new JPanel();
panel.add(label);
panel.add(textField);
frame = new JFrame("Meu primeiro formulrio");
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
Captulo20ApndiceBSwingbsicoPgina198
disparado quando o boto for clicado. Fazemos isso atravs do mtodo addActionListener
chamadonoboto.ElerecebecomoargumentoumobjetoqueimplementaActionListener(no
nossocaso,oprprioFormulario,othis):
button.addActionListener(this);
Ocdigofinaldenossoformulriodeveestarassim:
public class Formulario implements ActionListener {
private JLabel label;
private JTextField textField;
private JButton button;
private JPanel panel;
private JFrame frame;
private void montaFormulario() {
label = new JLabel("Seu nome:");
textField = new JTextField(20);
button = new JButton("Exibir");
button.addActionListener(this);
panel = new JPanel();
panel.add(label);
panel.add(textField);
panel.add(button);
frame = new JFrame("Meu primeiro formulario");
frame.add(panel);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e) {
String texto = textField.getText();
JOptionPane.showMessageDialog(frame, texto);
}
public static void main(String[] args) {
new Formulario().montaFormulario();
}
}
Aorodaresseprograma,vocvernossoformulriocomumlabel,umcampodetextoe
umboto.Depoisdedigitaralgo,aoclicarnoboto,vocverumamensagemcomotextodo
campodetexto:
Captulo20ApndiceBSwingbsicoPgina199
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.
eetc).Porpadro,oJavavemcomumlookandfeelprprioquesecomportaexatamenteda
mesmaformaemtodasasplataformassuportadas.
Massvezesessenooresultadodesejado.Quandorodamosnossaaplicaono
Windoews,porexemplo,bastantegritanteadiferenaemrelaoaovisualdasaplicaes
nativas.Porissopossvelalterarqualolookandfeelaserusadoemnossaaplicao.
AlmdopadrodoJava,oJRE5daSunaindatrazLaFnativosparaWindowseMacOS,
almdoMotifeGTK.E,foraesses,vocaindapodebaixardiversosLaFnaInternetouat
desenvolveroseuprprio.
Veja esses screenshots da documentao do Swing mostrando a mesma aplicao
rodandocom4LaFdiferentes:
Captulo20ApndiceBSwingbsicoPgina201
captulo
21
21
Diversosdepequenosdetalhesquenovimosnodecorrerdocurso,masquesoimportantes
nodiaadia.
Comeaaficarmuitochatodeescrevertodahoraonomedaclasse.Pararesolveresse
problema, no Java 5.0 foi introduzido o static import, que importa mtodos e atributos
estticosdequalquerclasse.Usandoessanovatcnica,vocpodeimportarosmtodosdo
exemploanterioreuslosdiretamente:
importstaticpacote.ClasseComMetodosEstaticos.*;
classUsandoMetodosEstaticos{
voidmetodo(){
metodo1();
metodo2();
}
}
Apesar de voc ter importado todos os mtodos e atributos estticos da classe
ClasseComMetodosEstaticos,aclasseemsinofoiimportada,esevoctentassedernew,
porexemplo,elenoiaconseguirencontrla,precisandodeumimportnormalaparte.
Umbomexemplodeusosoosmtodoseatributosestticosdaclassedematemtica
doJava.
importstaticjava.lang.Math.*;
classTesteMatematico{
doubleareaDaCircunferencia(doubleraio){
returnPI*raio*raio;//usamosPIaoinvsdeMath.PI!!
}
}
Captulo21ApndiceCMaisjavaPgina202
21.2 - final
Apalavrachavefinaltemvriasutilidades.Naclasseeladefinequeestanuncapoder
terumafilha,isso,nopodeserestendida.AclasseString,porexemplo,final.
Comomodificadordemtodofinalindicaqueaquelemtodonopodeserreescrito.
Ao usarmos como modificador de declarao de varivel indica que o valor daquela
varivel nunca poder ser alterado. No caso da varivel ser um atributo, voc tem at a
construodaqueleobjetoparainicializarovalor(casocontrrioocorreumerrodecompilao,
poisatributosfinalnosoinicializadoscomvaloresdefault).
Imagine que quando criamos um objeto Cliente no queremos que seu rg seja
modificado:
classCliente{
privatefinalintrg;
publicCliente(intrg){
this.rg=rg;
}
}
Uma varivel static final tem uma cara de constante daquela classe, e se for
public static final a parece uma constante global! Por exemplo, na classe
Collectionsdojava.utilvoctemumavarivelpublicstaticfinalchamadaEMPTY_LIST.
convenoessasvariveisteremletrasmaisculaseseparadasporunderscoreemvezde
subiredescer.
Isso muito utilizado, mas hoje no java 5 para criarmos constantes muito mais
interessanteutilizarmosorecursodeenumeraes,quealmdetipadasjpossuemdiversos
mtodosauxiliares.
21.3 - Calendar
A classe abstrata Calendar encapsula um momento no tempo representado em
milissegundos.Tambmprovmtodosparamanipulaodessemomento.
A subclasse concreta de Calendar mais usada a GregorianCalendar que
representaocalendriousadopelamaiorpartedospases.(outrasimplementaesexistem,
como a do calendrio budista BuddhistCalendar, mas que so internas e devolvidas de
acordocomseuLocale)
ParaobterumCalendarqueencapsulaoinstanteatual(dataehora),usamosomtodo
estticogetInstance()deCalendar(vejaoprximoexemplo).
ApartirdeumCalendar,podemossaberovalordeseuscampos,comoano,mes,dia,
hora,minuto...Paraisso,usamosomtodogetquerecebeuminteirorepresentandoocampo;
osvalorespossveisestoemconstantesnaclasseCalendar.
Noexemploabaixo,imprimimosodiadehojeeodiadasemanacorrespondente.Note
que o dia da semana devolvido um inteiro que representa o dia da semana
(Calendar.MONDAYetc):
Captulo21ApndiceCMaisjavaPgina203
Calendarc=Calendar.getInstance();
System.out.println("DiadoMs:"+c.get(Calendar.DAY_OF_MONTH));
System.out.println("DiadaSemana:"+c.get(Calendar.DAY_OF_WEEK));
Umpossvelresultado:
DiadoMs:4
DiadaSemana:5
Noexemploacima,odiadasemana5representaaquintafeira.
Damesmaformaquepodemospegarosvaloresdoscampos,podemosatribuirnovos
valoresaessescampospormeiodosmtodosset.
HdiversosmtodossetemCalendar.Omaisgeraloquerecebedoisargumentos:o
primeiroindicaqualocampo(usandoaquelasconstantesdeCalendar)eosegundo,onovo
valor.Almdessemtodoset,outrosmtodossetrecebemvaloresdedeterminadoscampos;o
setdetrsargumentos,porexemplo,recebeano,mesedia.Vejamosumexemplodecomo
alteraradatadehoje:
Calendarc=Calendar.getInstance();
c.set(Calendar.HOUR,10);//fazemoshoravaler10
c.set(Calendar.MINUTE,30);//fazemosminutovaler30
c.set(2005,11,25);//mudamosadataparaoNata,mscomeado0
Outro mtodo bastante usado add que adiciona uma certa quantidade a qualquer
campodoCalendar.Porexemplo,paraadicionarumanodatadehoje:
Calendarc=Calendar.getInstance();
c.add(Calendar.YEAR,1);//adiciona1aoano
Note que, embora o mtodo se chame add, voc pode uslo para subtrair valores
tambm;bastacolocarumaquantidadenegativanosegundoargumento!
OsmtodosafterebeforesousadosparacompararoobjetoCalendaremquesto
aoutroCalendar.OmtodoafterdevolvertruequandooCalendaremquestoestivernum
momentonotempomaiorqueodoCalendarpassadocomoargumento.Porexemplo,after
devolverfalsesecompararmosodiadascrianascomonatal,poisodiadascrianasno
vemdepoisdonatal:
Calendarc1=newGregorianCalendar(2005,Calendar.OCTOBER,12);
Calendarc2=newGregorianCalendar(2005,Calendar.DECEMBER,25);
System.out.println(c1.after(c2));
Analogamente, o mtodo before verifica se o momento em questo vem antes do
momento do Calendar passado como argumento. No exemplo acima, c1.before(c2)
devolvertrue,poisodiadascrianasvemantesdoNatal.
Note que Calendar implementa Comparable.Isso querdizer quevoc podeusar o
mtodo compareTo para comparar dois calendrios. No fundo, after e before usam o
compareToparadarsuasrespostas.
Por ltimo, um dos problemas mais comuns quando lidamos com datas verificar o
intervalo entre duas datas. O mtodo abaixo devolve o nmero de dias entre dois objetos
Calendar.Oclculofeitopegandoadiferenaentreasdatasemmilissegundosedividindo
Captulo21ApndiceCMaisjavaPgina204
essevalorpelonmerodemilissegundosemumdia:
publicintdiferencaEmDias(Calendarc1,Calendarc2){
longm1=c1.getTimeInMillis();
longm2=c2.getTimeInMillis();
return(int)((m2m1)/(24*60*60*1000));
}
21.4 - Date
A classe Date no recomendada porque a maior parte de seus mtodos esto
marcadoscomodeprecated,pormelatemamplousolegadonasbibliotecasdojava.Elafoi
substituda no java 1.1 pelo Calendar, para haver suporte correto a internacionalizao do
sistemadedatas.
VocpodepegarumDatedeumCalendareviceversaatravsdosgettersesettersde
time:
Calendarc=newGregorianCalendar(2005,Calendar.OCTOBER,12);
Dated=c.getTime();
c.setTime(d);
Issofazcomquevocpossaoperarcomdatasdamaneiranova,mesmoqueasAPIs
aindausemobjetosdotipoDate(comoocasodejava.sql).
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
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
captulo
22
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.
Captulo22ApndiceDInstalaodoJDKPgina207
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
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
7)(estepassosserexecutadocasovocaindanotenhainstaladooJREnasuamquina)
ProntoagoraeleinstalaroJRE.
8)AgoraseuJDKestinstalado.CliqueemFinish.
Captulo22ApndiceDInstalaodoJDKPgina210
9)Agoravamoscriarasvariveisdeambiente.Cliquecomobotodireitoemcimadocone
MeuComputadoreselecioneaopoPropriedades.
10)AgoraescolhaaabaAvanadoedepoiscliquenobotoVariveisdeAmbiente
Captulo22ApndiceDInstalaodoJDKPgina211
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
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.
1)BaixeopacotedeinstalaoparaLinuxchamadoLinuxselfextractingfile,assimo
arquivoquevocbaixarteraextenso.bin.
2)Abraumterminaleloguesecomoroot(comandosu).
3)Crieumdiretriochamado/javanaraizdoseusistema(mkdir/java)
4)Copieoarquivoquevocbaixouparaodiretrio/java(cp/<caminhodoarquivo>/jdk
<verso>linux.bin/java)
5) Altere a permisso do arquivo para que ele possa ser executado(chmod +x
jdk<versao>linux.bin)
6)Executeoarquivo(./jdk<verso>linux.bin)
7)Aparecernasuatelaumacordodeinstalao,aperteateclaQparairatofinaldo
documento, e depois escreva yes para aceitar o contrato. Feito isso ele comear a
descompactaroJDKemumdiretrioqueelecria,chamadojdk<verso>.
8)Vamosagoracriarasvariveisdeambiente,editeoarquivo/etc/bash.bashrc
(vi/etc/bash.bashrc),nofinaldoarquivoadicioneasseguinteslinhas:
JAVA_HOME=/java/jdk<verso>
PATH=$PATH:/$JAVA_HOME/bin
CLASSPATH=.
exportJAVA_HOMEPATHCLASSPATH
9)Reinicieamquina
10)Loguesenormalmente,comseuusurio
11)AbraumterminaletesteoJavaCompiler(javacversion)
12)Asadadeverserparecidacomaapresentadaabaixo,pormsenofor,revejaos
passoseconfirasefoifeitotudocerto.
javac1.5.0_07
javac:nosourcefiles
Usage:javac<options><sourcefiles>
wherepossibleoptionsinclude:
gGeneratealldebugginginfo
g:noneGeneratenodebugginginfo
g:{lines,vars,source}Generateonlysomedebugginginfo
nowarnGeneratenowarnings
verboseOutputmessagesaboutwhatthecompilerisdoing
deprecation
Output source locations where deprecated APIs are
used
classpath<path>Specifywheretofinduserclassfiles
cp<path>Specifywheretofinduserclassfiles
sourcepath<path>Specifywheretofindinputsourcefiles
bootclasspath<path>Overridelocationofbootstrapclassfiles
extdirs<dirs>Overridelocationofinstalledextensions
endorseddirs<dirs>Overridelocationofendorsedstandardspath
d<directory>Specifywheretoplacegeneratedclassfiles
encoding<encoding>Specifycharacterencodingusedbysourcefiles
source <release> Provide source compatibility with specified release
target<release>GenerateclassfilesforspecificVMversion
versionVersioninformation
helpPrintasynopsisofstandardoptions
XPrintasynopsisofnonstandardoptions
Captulo22ApndiceDInstalaodoJDKPgina214
Captulo22ApndiceDInstalaodoJDKPgina215
Termos importantes
Plataforma Java...............................3
Sun..................................................3
Mquina Virtual..............................5
Bytecode.........................................6
CLASSPATH....................................9
main..............................................12
Variveis........................................15
int..................................................15
Operadores Aritmticos................16
double...........................................17
boolean..........................................17
char...............................................17
Atribuio......................................17
Casting..........................................19
if....................................................21
Condio.......................................21
booleana........................................21
Else...............................................21
Operadores Lgicos......................21
Operador de Negao...................21
Lao...............................................22
While.............................................22
For.................................................22
Break.............................................23
Continue........................................24
Escopo...........................................24
Orientao Objetos....................28
Classe............................................30
Atributo.........................................31
New...............................................31
Mtodo..........................................32
Void...............................................32
Argumento....................................32
Parmetro.....................................32
This...............................................32
Invocao de Mtodo....................33
Return...........................................34
Referncia.....................................34
Valores default..............................39
NULL.............................................40
Matriz............................................48
Array.............................................48
Private...........................................56
Modificador de acesso..................56
Public............................................57
Encapsular....................................58
Getters..........................................59
Setters...........................................60
Construtor.....................................61
Static.............................................64
Herana........................................68
Extends.........................................68
Super e Sub Classes.....................69
Protected.......................................69
Reescrita de mtodo.....................69
Reescrita.......................................70
Polimorfismo.................................72
Composio...................................74
Classe Abstrata.............................93
Abstract.........................................93
Mtodo Abstrato...........................95
Sobrecarga..................................102
Interface......................................105
Implements.................................105
Exception....................................115
Throws........................................121
Finally.........................................125
Pacote.........................................129
Package.......................................129
Import.........................................131
JAR..............................................135
Javadoc........................................139
java.lang......................................144
Object..........................................145
Casting de Referncias...............146
Wrapping.....................................147
Autoboxing..................................148
toString.......................................148
equals..........................................149
split.............................................150
compareTo..................................150
java.io..........................................154
Arquivos......................................154
Sockets........................................154
Entrada e Sada..........................154
Arrays..........................................161
Vetor............................................161
Collections..................................162
List..............................................162
Comparable.................................166
Set...............................................168
Map.............................................170
i
Execuo Concorrente................178
Runnable.....................................178
Thread.........................................178
Sleep...........................................179
Garbage Collector.......................179
THREAD SAFE...........................182
Lock............................................182
Synchronized..............................182
TCP.............................................187
Porta............................................188
Static Import...............................202
ii