Sie sind auf Seite 1von 187

http://www.caelum.com.

br/apostila-java-orientacao-objetos/

Java e Orientao a Objetos


Captulo 1

Como Aprender Java


"Busco um instante feliz que justifique minha e ist!ncia"

1.1 - O que realmente importante?


"uitos livros# ao passar $os captulos# mencionam to$os os $etalhes $a lin%ua%em juntamente com seus princpios b&sicos. 'sso acaba crian$o muita confus(o# em especial porque o estu$ante n(o conse%ue $istin%uir e atamente o que ) primor$ial apren$er no incio# $aquilo que po$e ser estu$a$o mais a$iante. *e uma classe abstrata $eve ou n(o ter ao menos um m)to$o abstrato# se o if s+ aceita ar%umentos booleanos e to$os os $etalhes sobre classes internas# realmente n(o $evem se tornar preocupa,-es para aquele cujo objetivo prim&rio ) apren$er .ava. /sse tipo $e informa,(o ser& a$quiri$a com o tempo# e n(o ) necess&rio no incio. 0este curso# separamos essas informa,-es em qua$ros especiais# j& que s(o informa,-es e tras. 1u ent(o# apenas citamos num e erccio e $ei amos para o leitor procurar informa,-es se for $e seu interesse. 2or fim# falta mencionar al%o sobre a pr&tica# que $eve ser trata$a seriamente: to$os os e erccios s(o muito importantes e os $esafios po$em ser feitos quan$o o curso terminar. 3e qualquer maneira recomen$amos aos alunos estu$arem em casa# e praticarem bastante c+$i%o e varia,-es. O curso 2ara aqueles que est(o fazen$o o curso .ava e 1rienta,(o a 1bjetos# recomen$amos estu$arem em casa aquilo que foi visto $urante a aula# tentan$o resolver os e erccios opcionais e os $esafios apresenta$os.

1.2 - obre os e!erc"cios


1s e erccios $o curso variam $e pr&ticos at) pesquisas na 'nternet# ou mesmo consultas sobre assuntos avan,a$os em $etermina$os t+picos para incitar a curiosi$a$e $o apren$iz na tecnolo%ia. / istem tamb)m# em $etermina$os captulos# uma s)rie $e $esafios. /les focam mais no problema computacional que na lin%ua%em# por)m s(o uma e celente forma $e treinar a sinta e e# principalmente# familiarizar o aluno com a biblioteca pa$r(o .ava# al)m $e proporcionar um %anho na veloci$a$e $e $esenvolvimento. A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade

Caelum. Conhe,a a 5lura.

1.% - &irando d'vidas e indo alm


2ara tirar $6vi$as $os e erccios# ou $e .ava em %eral# recomen$amos o f+rum $o 78. 9http://www.%uj.com.br/:# on$e sua $6vi$a ser& respon$i$a prontamente. 1 78. foi fun$a$o por $esenvolve$ores $a Caelum# e hoje conta com mais $e um milh(o $e mensa%ens. ;ora isso# sinta-se < vonta$e para entrar em contato com seu instrutor para tirar to$as as $6vi$as que sur%irem $urante o curso. *e o que voc! est& buscan$o s(o livros $e apoio# su%erimos conhecer a e$itora Casa $o C+$i%o: http://www.Casa3oCo$i%o.com.br 5 Caelum fornece muitos outros cursos .ava# com $estaque para o ;.-=1 que traz a aplica,(o $o .ava na web. >& tamb)m cursos online que v(o te aju$ar a ir al)m# com muita intera,(o com os instrutores: http://www.caelum.com.br/ http://www.caelum.com.br/online Captulo =

O que Java
"Computa$ores s(o in6teis# eles apenas $(o respostas" Che%ou a hora $e respon$er as per%untas mais b&sicas sobre .ava. 5o t)rmino $esse captulo# voc! ser& capaz $e: respon$er o que ) .ava? mostrar as vanta%ens e $esvanta%ens $o .ava? enten$er bem o conceito $e m&quina virtual? compilar e e ecutar um pro%rama simples.

2.1 - Java
/nten$er um pouco $a hist+ria $a plataforma .ava ) essencial para en er%ar os motivos que a levaram ao sucesso. @uais eram os seus maiores problemas quan$o pro%ramava na $)ca$a $e 1AABC ponteirosC %erenciamento $e mem+riaC or%aniza,(oC falta $e bibliotecasC ter $e reescrever parte $o c+$i%o ao mu$ar $e sistema operacionalC custo financeiro $e usar a tecnolo%iaC

5 lin%ua%em .ava resolve bem esses problemas# que at) ent(o apareciam com frequ!ncia nas outras lin%ua%ens. 5l%uns $esses problemas foram particularmente ataca$os porque uma $as %ran$es motiva,-es para a cria,(o $a plataforma .ava era $e que essa lin%ua%em fosse usa$a em pequenos $ispositivos# como tvs# vi$eocassetes# aspira$ores# liqui$ifica$ores e outros. 5pesar $isso a

lin%ua%em teve seu lan,amento foca$o no uso em clientes web 9browsers: para ro$ar pequenas aplica,-es 9applets:. >oje em $ia esse n(o ) o %ran$e merca$o $o .ava: apesar $e ter si$o i$ealiza$o com um prop+sito e lan,a$o com outro# o .ava %anhou $estaque no la$o $o servi$or. 1 .ava foi cria$o pela anti%a *un "icrosDstems e manti$a atrav)s $e um comit! 9http://www.jcp.or%:. *eu site principal era o java.sun.com# e java.com um site mais institucional# volta$o ao consumi$or $e pro$utos e usu&rios lei%os# n(o $esenvolve$ores. Com a compra $a *un pela 1racle em =BBA# muitas 8EFs e nomes tem si$o troca$os para refletir a marca $a 1racle. 5 p&%ina principal $o .ava ): http://www.oracle.com/technetworG/java/ 0o Brasil# $iversos %rupos $e usu&rios se formaram para tentar $isseminar o conhecimento $a lin%ua%em. 8m $eles ) o ()J 9http://www.%uj.com.br:# uma comuni$a$e virtual com arti%os# tutoriais e f+rum para tirar $6vi$as# o maior em ln%ua portu%uesa com mais $e cem mil usu&rios e 1 milh(o $e mensa%ens. /ncorajamos to$os os alunos a usar muito os f+runs $o mesmo# pois ) uma $as melhores maneiras para achar solu,-es para pequenos problemas que acontecem com %ran$e frequ!ncia.

2.2 - )ma breve $ist*ria do Java


5 *un criou um time 9conheci$o como 7reen Heam: para $esenvolver inova,-es tecnol+%icas em 1AA=. /sse time foi li$era$o por .ames 7oslin%# consi$era$o o pai $o .ava. 1 time voltou com a i$eia $e criar um interpreta$or 9j& era uma m&quina virtual# veremos o que ) isso mais a frente: para pequenos $ispositivos# facilitan$o a reescrita $e software para aparelhos eletrInicos# como v$eo cassete# televis(o e aparelhos $e H4 a cabo. 5 i$eia n(o $eu certo. Hentaram fechar $iversos contratos com %ran$es fabricantes $e eletrInicos# como 2anasonic# mas n(o houve ! ito $evi$o ao conflito $e interesses e custos. >oje# sabemos que o .ava $omina o merca$o $e aplica,-es para celulares com mais $e =.J bilh-es $e $ispositivos compatveis# por)m em 1AAK ain$a era muito ce$o para isso. Com o a$vento $a web# a *un percebeu que po$eria utilizar a i$eia cria$a em 1AA= para ro$ar pequenas aplica,-es $entro $o browser. 5 semelhan,a era que na internet havia uma %ran$e quanti$a$e $e sistemas operacionais e browsers# e com isso seria %ran$e vanta%em po$er pro%ramar numa 6nica lin%ua%em# in$epen$ente $a plataforma. ;oi a que o .ava 1.B foi lan,a$o: foca$o em transformar o browser $e apenas um cliente ma%ro 9thin client ou terminal burro: em uma aplica,(o que possa tamb)m realizar opera,-es avan,a$as# e n(o apenas ren$erizar html. 1s applets $ei aram $e ser o foco $a *un# e nem a 1racle nunca teve interesse. L curioso notar que a tecnolo%ia .ava nasceu com um objetivo em mente# foi lan,a$o com outro# mas# no final# $ecolou mesmo no $esenvolvimento $e aplica,-es $o la$o $o servi$or. *orteC >& hoje o .ava ;M# tentan$o $ar for,a para o .ava n(o s+ no $esGtop mas como aplica,-es ricas na web# mas muitos n(o acre$itam que haja espa,o para tal# consi$eran$o o $estino $e tecnolo%ias como 5$obe ;le e "icrosoft *ilverli%ht. 4oc! po$e ler a hist+ria $a lin%ua%em .ava em: http://www.java.com/en/javahistorD/ / um v$eo interessante: http://tinDurl.com/histjava /m =BBA a 1racle comprou a *un# fortalecen$o a marca. 5 1racle sempre foi# junto com a 'B"# uma $as empresas que mais investiram e fizeram ne%+cios atrav)s $o uso $a plataforma .ava. /m =B11 sur%e a vers(o .ava N com al%umas pequenas mu$an,as na lin%ua%em. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

2.% - 01quina +irtual


/m uma lin%ua%em $e pro%rama,(o como C e 2ascal# temos a se%uinte situa,(o quan$o vamos compilar um pro%rama:

1 c+$i%o fonte ) compila$o para c+$i%o $e m&quina especfico $e uma plataforma e sistema operacional. "uitas vezes o pr+prio c+$i%o fonte ) $esenvolvi$o visan$o uma 6nica plataformaO /sse c+$i%o e ecut&vel 9bin&rio: resultante ser& e ecuta$o pelo sistema operacional e# por esse motivo# ele $eve saber conversar com o sistema operacional em quest(o.

'sto )# temos um c+$i%o e ecut&vel para ca$a sistema operacional. L necess&rio compilar uma vez para Pin$ows# outra para o Finu # e assim por $iante# caso a %ente queira que esse nosso software possa ser utiliza$o em v&rias plataformas. /sse ) o caso $e aplicativos como o 1pen1ffice# ;irefo e outros. Como foi $ito anteriormente# na maioria $as vezes# a sua aplica,(o se utiliza $as bibliotecas $o sistema operacional# como# por e emplo# a $e interface %r&fica para $esenhar as "telas". 5 biblioteca $e interface %r&fica $o Pin$ows ) bem $iferente $as $o Finu : como criar ent(o uma aplica,(o que ro$e $e forma pareci$a nos $ois sistemas operacionaisC 2recisamos reescrever um mesmo pe$a,o $a aplica,(o para $iferentes sistemas operacionais# j& que eles n(o s(o compatveis. .& o .ava utiliza $o conceito $e m1quina virtual# on$e e iste# entre o sistema operacional e a aplica,(o# uma cama$a e tra respons&vel por "tra$uzir" - mas n(o apenas isso - o que sua aplica,(o $eseja fazer para as respectivas chama$as $o sistema operacional on$e ela est& ro$an$o no momento:

3essa forma# a maneira com a qual voc! abre uma janela no Finu ou no Pin$ows ) a mesma: voc! %anha in$epen$!ncia $e sistema operacional. 1u# melhor ain$a# in$epen$!ncia $e plataforma em %eral: n(o ) preciso se preocupar em qual sistema operacional sua aplica,(o est& ro$an$o# nem em que tipo $e m&quina# confi%ura,-es# etc. Eepare que uma m&quina virtual ) um conceito bem mais amplo que o $e um interpreta$or. Como o pr+prio nome $iz# uma m&quina virtual ) como um "computa$or $e mentira": tem tu$o que um computa$or tem. /m outras palavras# ela ) respons&vel por %erenciar mem+ria# threa$s# a pilha $e e ecu,(o# etc. *ua aplica,(o ro$a sem nenhum envolvimento com o sistema operacionalO *empre conversan$o apenas com a Java +irtual 0ac$ine 9.4":. /ssa caracterstica ) interessante: como tu$o passa pela .4"# ela po$e tirar m)tricas# $eci$ir on$e ) melhor alocar a mem+ria# entre outros. 8ma .4" isola totalmente a aplica,(o $o sistema operacional. *e uma .4" termina abruptamente# s+ as aplica,-es que estavam ro$an$o nela ir(o terminar: isso n(o afetar& outras .4"s que estejam ro$an$o no mesmo computa$or# nem afetar& o sistema operacional. /ssa cama$a $e isolamento tamb)m ) interessante quan$o pensamos em um servi$or que n(o po$e se sujeitar a ro$ar c+$i%o que possa interferir na boa e ecu,(o $e outras aplica,-es. /ssa cama$a# a m&quina virtual# n(o enten$e c+$i%o java# ela enten$e um c+$i%o $e m&quina especfico. /sse c+$i%o $e m&quina ) %era$o por um compila$or java# como o javac# e ) conheci$o por "b2tecode"# pois e istem menos $e =JQ c+$i%os $e opera,(o $essa lin%ua%em# e ca$a "opco$e" %asta um bDte. 1 compila$or .ava %era esse bDteco$e que# $iferente $as lin%ua%ens sem m&quina virtual# vai servir para $iferentes sistemas operacionais# j& que ele vai ser "tra$uzi$o" pela .4". 3rite once4 run an25$ere /sse era um slo%an que a *un usava para o .ava# j& que voc! n(o precisa reescrever partes $a sua aplica,(o to$a vez que quiser mu$ar $e sistema operacional.

2.6 - Java lento? 7otspot e J8&


Hotspot ) a tecnolo%ia que a .4" utiliza para $etectar pontos quentes $a sua aplica,(o: c+$i%o que ) e ecuta$o muito# provavelmente $entro $e um ou mais loops. @uan$o a .4" jul%ar necess&rio# ela vai compilar estes c+$i%os para instru,-es realmente nativas $a plataforma# ten$o em vista que isso vai provavelmente melhorar a performance $a sua aplica,(o. /sse compila$or ) o JIT: Just inTime Compiler# o compila$or que aparece "bem na hora" que voc! precisa. 4oc! po$e pensar ent(o: porque a .4" n(o compila tu$o antes $e e ecutar a aplica,(oC L que teoricamente compilar $inamicamente# a me$i$a $o necess&rio# po$e %erar uma performance melhor. 1 motivo ) simples: ima%ine um .e e %era$o pelo 4isualBasic# pelo %cc ou pelo 3elphi? ele ) est&tico. /le j& foi otimiza$o basea$o em heursticas# o compila$or po$e ter toma$o uma $ecis(o n(o t(o boa. .& a .4"# por estar compilan$o $inamicamente $urante a e ecu,(o# po$e perceber que um

$etermina$o c+$i%o n(o est& com performance a$equa$a e otimizar mais um pouco aquele trecho# ou ain$a mu$ar a estrat)%ia $e otimiza,(o. L por esse motivo que as .4"s mais recentes 9como a $o .ava N: em al%uns casos che%am a %anhar $e c+$i%os C compila$os com o 7CC R. .

2.9 - +ers:es do Java e a con-uso do Java2


.ava 1.B e 1.1 s(o as vers-es muito anti%as $o .ava# mas j& traziam bibliotecas importantes como o .3BC e o java.io. Com o .ava 1.= houve um aumento %ran$e no tamanho $a 52'# e foi nesse momento em que trocaram a nomenclatura $e .ava para .ava=# com o objetivo $e $iminuir a confus(o que havia entre .ava e .avascript. "as lembre-se# n(o h& vers(o ".ava =.B"# o = foi incorpora$o ao nome# tornan$ose .ava= 1.=. 3epois vieram o .ava= 1.R e 1.K# e o .ava 1.J passou a se chamar .ava J# tanto por uma quest(o $e marGetin% e porque mu$an,as si%nificativas na lin%ua%em foram inclu$as. L nesse momento que o "=" $o nome .ava $esaparece. Eepare que para fins $e $esenvolvimento# o .ava J ain$a ) referi$o como .ava 1.J. 5t) a vers(o 1.K# e istia um terceiro n6mero 91.R.1# 1.K.1# 1.K.=# etc:# in$ican$o bu% fi es e melhorias. 5 partir $o .ava J e istem apenas up$ates: .ava J up$ate N# por e emplo. >oje a 6ltima vers(o $isponvel $o .ava ) a N# lan,a$a em julho $e =B11. 3a vers(o 1.K para a J.B# a lin%ua%em sofreu muitas mo$ifica,-es# o que $e certa forma fomentou a mu$an,a no versionamento $o .ava. .& o .ava Q n(o trou e nenhuma mu$an,a na lin%ua%em# mas trou e mais recursos na 52' e muitas melhorias $e performance na 4". 1 novo .ava N traz al%umas pequenas mu$an,as na lin%ua%em. / iste compatibili$a$e para tr&s em to$as as vers-es $o .ava. 8m class %era$o pelo javac $a vers(o 1.= precisa necessariamente ro$ar em uma .4" N. 2or isso# recomen$amos sempre usar a 6ltima vers(o $o .ava para usufruir $as tecnolo%ias mais mo$ernas mas sem correr o risco $e quebrar aplica,-es anti%as. &ire suas d'vidas no novo ()J ;espostas 1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

2.< - J+0? J;=? J>?? O que devo bai!ar?


1 que %ostaramos $e bai ar no site $a 1racleC .4" S apenas a virtual machine# esse $ownloa$ n(o e iste# ela sempre vem acompanha$a. .E/ S Java ;untime =nvironment# ambiente $e e ecu,(o .ava# forma$o pela .4" e bibliotecas# tu$o que voc! precisa para e ecutar uma aplica,(o .ava. "as n+s precisamos $e mais. .3T S Java >evelopment ?it: 0+s# $esenvolve$ores# faremos o $ownloa$ $o .3T $o .ava */ 9*tan$ar$ /$ition:. /le ) forma$o pela .E/ soma$o a ferramentas# como o compila$or. Hanto o .E/ e o .3T po$em ser bai a$os $o site http://www.oracle.com/technetworG/java/. 2ara encontr&-los# acesse o linG .ava */ $entro $os top $ownloa$s. Consulte o ap!n$ice $e instala,(o $o .3T para maiores $etalhes.

2.@ - Onde usar e os objetivos do Java


0o $ecorrer $o curso# voc! po$e achar que o .ava tem menor pro$utivi$a$e quan$o compara$a com a lin%ua%em que voc! est& acostuma$o. L preciso ficar claro que a premissa $o .ava n(o ) a $e criar sistemas pequenos# on$e temos um ou $ois $esenvolve$ores# mais rapi$amente que lin%ua%ens como php# perl# e outras. 1 foco $a plataforma ) outro: aplica,-es $e mdio a grande porte# on$e o time $e $esenvolve$ores tem v rias pessoas e sempre po$e vir a mudar e crescer. 0(o tenha $6vi$as que criar a primeira vers(o $e uma aplica,(o usan$o .ava# mesmo utilizan$o '3/s e ferramentas po$erosas# ser& mais trabalhoso que muitas lin%ua%ens script ou $e alta pro$utivi$a$e. 2or)m# com uma lin%ua%em orienta$a a objetos e ma$ura como o .ava# ser& e tremamente mais f&cil e r&pi$o fazer altera,-es no sistema# $es$e que voc! si%a as boas pr&ticas e recomen$a,-es sobre design orienta$o a objetos. 5l)m $isso# a quanti$a$e enorme $e bibliotecas %ratuitas para realizar os mais $iversos trabalhos 9tais como relat+rios# %r&ficos# sistemas $e busca# %era,(o $e c+$i%o $e barra# manipula,(o $e M"F# toca$ores $e v$eo# manipula$ores $e te to# persist!ncia transparente# impress(o# etc: ) um ponto fortssimo para a$o,(o $o .ava: voc! po$e criar uma aplica,(o sofistica$a# usan$o $iversos recursos# sem precisar comprar um componente especfico# que costuma ser caro. 1 ecossistema $o .ava ) enorme. Ca$a lin%ua%em tem seu espa,o e seu melhor uso. 1 uso $o .ava ) interessante em aplica,-es que vir(o a crescer# em que a le%ibili$a$e $o c+$i%o ) importante# on$e temos muita conectivi$a$e e se h& muitas plataformas 9ambientes e sistemas operacionais: hetero%!neas 9Finu # 8ni # 1*M e Pin$ows mistura$os:. 4oc! po$e ver isso pela quanti$a$e enorme $e ofertas $e empre%o procuran$o $esenvolve$ores .ava para trabalhar com sistemas web e aplica,-es $e inte%ra,(o no servi$or. 5pesar $isto# a *un empenhou-se em tentar popularizar o uso $o .ava em aplica,-es $esGtop# mesmo com o fraco marGetshare $o *win%/5PH/*PH em rela,(o <s tecnolo%ias concorrentes 9em especial "icrosoft .0/H:. 5 atual tentativa ) o .ava ;M# on$e a 1racle tem investi$o bastante.

2.A - =speci-icao versus implementao


1utro ponto importante: quan$o falamos $e .ava 4irtual "achine# estamos falan$o $e uma especifica,(o. /la $iz como o bDteco$e $eve ser interpreta$o pela .4". @uan$o fazemos o $ownloa$ no site $a 1racle# o que vem junto ) a 1racle .4". /m outras palavras# e istem outras .4"s $isponveis# como a .EocGit $a B/5 9tamb)m a$quiri$a pela 1racle:# a .A $a 'B"# entre outras. /sse ) outro ponto interessante para as empresas. Caso n(o estejam %ostan$o $e al%um $etalhe $a .4" $a 1racle ou prefiram trabalhar com outra empresa# pa%an$o por suporte# elas po$em trocar $e .4" com a %arantia absoluta $e que to$o o sistema continuar& funcionan$o. 'sso porque to$a .4" $eve ser certifica$a pela 1racle# provan$o a sua compatibili$a$e. 0(o h& nem necessi$a$e $e recompilar nenhuma $e suas classes. 5l)m $e in$epen$!ncia $e har$ware e sistema operacional# voc! tem a in$epen$!ncia $e vendor 9fabricante:: %ra,as a i$eia $a .4" ser uma especifica,(o e n(o um software. Bova editora Casa do C*di#o com livros de uma -orma di-erente /$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos.

Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

2.C - Como o /J-11 est1 or#ani.ado


.ava ) uma lin%ua%em simples: e istem poucas re%ras# muito bem $efini$as. 2or)m quebrar o para$i%ma proce$ural para mer%ulhar na orienta,(o a objetos n(o ) simples. @uebrar o para$i%ma e %anhar flu!ncia com a lin%ua%em e 52' s(o os objetivos $o ;.-11. 1 come,o po$e ser um pouco frustrante: e emplos simples# controle $e flu o com o if# for# while e cria,(o $e pequenos pro%ramas que nem ao menos captam $a$os $o tecla$o. 5pesar $e isso tu$o ser necess&rio# ) s+ nos =BU finais $o curso que utilizaremos bibliotecas para# no final# criarmos um chat entre $uas m&quinas que transferem *trin%s por HC2/'2. 0este ponto# teremos tu$o que ) necess&rio para enten$er completamente como a 52' funciona# quem esten$e quem# e o porqu!. 3epois $esse captulo no qual o .ava# a .4" e primeiros conceitos s(o passa$os# veremos os coman$os b&sicos $o java para controle $e flu o e utiliza,(o $e vari&veis $o tipo primitivo. Criaremos classes para testar esse pequeno apren$iza$o# sem saber e atamente o que ) uma classe. 'sso $ificulta ain$a mais a curva $e apren$iza$o# por)m ca$a conceito ser& intro$uzi$o no momento consi$era$o mais apropria$o pelos instrutores. 2assamos para o captulo $e orienta,(o a objetos b&sico# mostran$o os problemas $o para$i%ma proce$ural e a necessi$a$e $e al%o $iferente para resolv!-los. 5tributos# m)to$os# vari&veis $o tipo refer!ncia e outros. 2assamos ent(o para um pouco $e arraDs. 1s captulos $e mo$ifica$ores $e acesso# heran,a# classes abstratas e interfaces $emonstram o conceito fun$amental que o curso quer passar: encapsule# e ponha o mnimo $e suas classes# foque no que elas fazem# no relacionamento entre elas. Com um bom $esi%n# a co$ifica,(o fica f&cil e a mo$ifica,(o e e pans(o $o sistema tamb)m. 0o $ecorrer $esses captulos# o /clipse ) intro$uzi$o $e forma natural# evitan$o-se ao m& imo wizar$s e menus# priorizan$o mostrar os chama$os code assists e quic! "i#es. 'sso faz com que o /clipse trabalhe $e forma simbi+tica com o $esenvolve$or# sem se intrometer# sem fazer m&%ica. 2acotes# java$oc# jars e java.lan% apresentam os 6ltimos conceitos fun$amentais $o .ava# $an$o to$a a fun$a,(o para# ent(o# passarmos a estu$ar as principais e mais utiliza$as 52's $o .ava */. 5s 52's estu$a$as ser(o java.util# java.io e java.net. Ho$as elas usam e abusam $os conceitos vistos no $ecorrer $o curso# aju$an$o a se$iment&-los. .untamente# temos os conceitos b&sicos $o uso $e Hhrea$s# e os problemas e peri%os $a pro%rama,(o concorrente quan$o $a$os s(o compartilha$os. Eesumin$o: o objetivo $o curso ) apresentar o .ava ao mesmo tempo que os fun$amentos $a orienta,(o a objetos s(o intro$uzi$os. Bateremos muito no ponto $e $izer que o importante ) como as classes se relacionam e qual ) o papel $e ca$a uma# e n(o em como elas realizam as suas obri%a,-es. $rograme voltado % inter"ace& e no % implementao.

2.1D - Compilando o primeiro pro#rama


4amos para o nosso primeiro c+$i%oO 1 pro%rama que imprime uma linha simples. 2ara mostrar uma linha# po$emos fazer:
System.out.println("Minha primeira aplicao Java!");

"as esse c+$i%o n(o ser& aceito pelo compila$or java. 1 .ava ) uma lin%ua%em bastante

burocr&tica# e precisa $e mais $o que isso para iniciar uma e ecu,(o. 4eremos os $etalhes e os porqu!s $urante os pr+ imos captulos. 1 mnimo que precisaramos escrever ) al%o como:
class MeuPro rama ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("Minha primeira aplicao Java!"); & &

Botao Ho$os os c+$i%os apresenta$os na apostila est(o formata$os com recursos visuais para au iliar a leitura e compreens(o $os mesmos. @uan$o for $i%itar os c+$i%os no computa$or# trate os c+$i%os como te to simples. 5 numera,(o $as linhas no faz parte $o c+$i%o e n(o $eve ser $i%ita$a? ) apenas um recurso $i$&tico. 1 .ava ) case sensitive: tome cui$a$o com mai6sculas e min6sculas. 5p+s $i%itar o c+$i%o acima# %rave-o como 0euEro#rama.java em al%um $iret+rio. 2ara compilar# voc! $eve pe$ir para que o compila$or $e .ava $a 1racle# chama$o 'avac# %ere o bDteco$e correspon$ente ao seu c+$i%o .ava.

3epois $e compilar# o b2tecode foi %era$o. @uan$o o sistema operacional listar os arquivos conti$os no $iret+rio atual# voc! po$er& ver que um arquivo .class foi %era$o# com o mesmo nome $a sua classe .ava. Assustado com o c*di#o? 2ara quem j& tem uma e peri!ncia com .ava# esse primeiro c+$i%o ) muito simples. "as# se ) seu primeiro c+$i%o em .ava# po$e ser um pouco traumatizante. 0(o $ei e $e ler o pref&cio $o curso# que $ei ar& voc! mais tranquilo em rela,(o a curva $e apren$iza$o $a lin%ua%em# conhecen$o como o curso est& or%aniza$o. Ereciso sempre pro#ramar usando o Botepad ou similar? 0(o ) necess&rio $i%itar sempre seu pro%rama em um simples aplicativo como o 0otepa$. 4oc! po$e usar um e$itor que tenha s2nta! $i#$li#$tin# e outros benefcios. "as# no come,o# ) interessante voc! usar al%o que n(o possua ferramentas# para que voc! possa se acostumar com os erros $e compila,(o# sinta e e outros. 3epois $o captulo $e polimorfismo e heran,a su%erimos a utiliza,(o $o /clipse 9http://www.eclipse.or%:# a '3/ l$er no merca$o# e %ratuita. / iste um captulo a parte para o uso $o /clipse nesta apostila. 0o Finu # recomen$amos o uso $o %e$it ou $o Gate. 0o Pin$ows# voc! po$e usar o 0otepa$VV ou o He t2a$. 0o "ac# He tPran%ler ou He t"ate.

2.11 - =!ecutando seu primeiro pro#rama


1s proce$imentos para e ecutar seu pro%rama s(o muito simples. 1 javac ) o compila$or .ava# e o java ) o respons&vel por invocar a m&quina virtual para interpretar o seu pro%rama.

5o e ecutar# po$e ser que a acentua,(o resultante saia erra$a $evi$o a al%umas confi%ura,-es que $ei amos $e fazer. *em problemas. J1 con$ece os cursos online Alura?

2.12 - O que aconteceu?


class MeuPro rama ! pu"lic static voi# main(Strin $% ar s) ! (( miolo #o pro rama comea a)ui! System.out.println("Minha primeira aplicao Java!!"); (( fim #o miolo #o pro rama & &

1 miolo $o pro%rama ) o que ser& e ecuta$o quan$o chamamos a m&quina virtual. 2or enquanto# to$as as linhas anteriores# on$e h& a $eclara,(o $e uma classe e a $e um m)to$o# n(o importam para n+s nesse momento. "as $evemos saber que to$a aplica,(o .ava come,a por um ponto $e entra$a# e este ponto $e entra$a ) o m)to$o main. 5in$a n(o sabemos o que ) m)to$o# mas veremos no captulo K. 5t) l&# n(o se preocupe com essas $eclara,-es. *empre que um e erccio for feito# o c+$i%o que nos importa sempre estar& nesse miolo. 0o caso $o nosso c+$i%o# a linha $o System.out.println faz com que o conte6$o entre aspas seja coloca$o na tela.

2.1% - Eara saber maisF como o b2tecode?


1 MeuPro rama.class %era$o n(o ) le%vel por seres humanos 9n(o que seja impossvel:. /le est& escrito no formato que a virtual machine sabe enten$er e que foi especifica$o que ela enten$esse. L como um assemblD# escrito para esta m&quina em especfico. 2o$emos ler os mnemInicos utilizan$o a ferramenta javap que acompanha o .3T:
'avap *c MeuPro rama

/ a sa$a:
MeuPro rama(); +o#e, -, aloa#./, invo0especial 6, return

1/; ((Metho# 'ava(lan (2"'ect."3init4",()5

pu"lic static voi# main('ava.lan .Strin $%);

+o#e, -, etstatic 17; ((8iel# 'ava(lan (System.out,9'ava(io(PrintStream; :, l#c 1:; ((Strin Minha primeira aplicao Java!! ;, invo0evirtual 16; ((Metho# 'ava(io(PrintStream.println, (9'ava(lan (Strin ;)5 <, return &

L o c+$i%o acima# que a .4" sabe ler. L o "c+$i%o $e m&quina"# $a m&quina virtual. 8m bDteco$e po$e ser reverti$o para o .java ori%inal 9com per$a $e coment&rios e nomes $e vari&veis locais:. Caso seu software v& virar um pro$uto $e prateleira# ) fun$amental usar um ofusca$or no seu c+$i%o# que vai embaralhar classes# m)to$os e um monte $e outros recursos 9in$icamos o http://pro%uar$.sf.net:.

2.16 - =!erc"ciosF 0odi-icando o 7ello 3orld


1. 5ltere seu pro%rama para imprimir uma mensa%em $iferente. =. 5ltere seu pro%rama para imprimir $uas linhas $e te to usan$o $uas linhas $e c+$i%o *Dstem.out. R. *aben$o que os caracteres =n representam uma quebra $e linhas# imprima $uas linhas $e te to usan$o uma 6nica linha $e c+$i%o System.out.

2.19 - O que pode dar errado?


"uitos erros po$em ocorrer no momento que voc! ro$ar seu primeiro c+$i%o. 4amos ver al%uns $eles: C+$i%o:
class > ! pu"lic static voi# main (Strin $% ar s) ! System.out.println("8alta ponto e v?r ula") & &

/rro:
>.'ava,6, @;@ eApecte# & B / error

/sse ) o erro $e compila,(o mais comum: aquele on$e um ponto e vr%ula fora esqueci$o. Eepare que o compila$or ) e plcito em $izer que a linha 6 ) a com problemas. 1utros erros $e compila,(o po$em ocorrer se voc! escreveu palavras chaves 9as que colocamos em ne%rito: em mai6sculas# esqueceu $e abrir e fechar as !&# etc. 3urante a e ecu,(o# outros erros po$em aparecer: - *e voc! $eclarar a classe como M# compil&-la e $epois tentar us&-la como .ava te avisa:
CAception in threa# "main" 'ava.lan .Do+lassEef8oun#Crror,

min6sculo 9java :# o

> (wron

name, A)

- *e tentar acessar uma classe no $iret+rio ou classpath erra$o# ou se o nome estiver erra$o# ocorrer& o se%uinte erro:
CAception in threa# "main" 'ava.lan .Do+lassEef8oun#Crror, >

- *e esquecer $e colocar static ou o ar%umento Strin $% ar s no m)to$o main:


CAception in threa# "main" 'ava.lan .DoSuchMetho#Crror, main

2or e emplo:
class > ! pu"lic voi# main (Strin $% ar s) ! System.out.println("8altou o staticF tente eAecutar!"); & &

- *e n(o colocar o m)to$o main como pu"lic:


Main metho# not pu"lic.

2or e emplo:
class > ! static voi# main (Strin $% ar s) ! System.out.println("8altou o pu"lic"); & &

2.1< - )m pouco mais...


1. 2rocure um cole%a# ou al%um conheci$o# que esteja em um projeto .ava. 3escubra porque .ava foi escolhi$o como tecnolo%ia. 1 que ) importante para esse projeto e o que acabou fazen$o $o .ava a melhor escolhaC

2.1@ - =!erc"cios adicionais


1. 8m arquivo fonte .ava $eve sempre ter a e tens(o .'ava# ou o compila$or o rejeitar&. 5l)m $isso# e istem al%umas outras re%ras na hora $e $ar o nome $e um arquivo .ava. / perimente %ravar o c+$i%o $este captulo com 2utroDome.'ava ou al%o similar. Compile e verifique o nome $o arquivo %era$o. Como e ecutar a sua aplica,(oC Captulo R

+ari1veis primitivas e Controle de -lu!o


"2)ssima i$eia# a $e que n(o se po$e mu$ar" 5pren$eremos a trabalhar com os se%uintes recursos $a lin%ua%em .ava: $eclara,(o# atribui,(o $e valores# castin% e compara,(o $e vari&veis? controle $e flu o atrav)s $e if e else? instru,-es $e la,o for e while# controle $e flu o com breaG e continue.

%.1 - >eclarando e usando vari1veis


>entro de um bloco# po$emos $eclarar vari&veis e us&-las. /m .ava# to$a vari&vel tem um tipo que n(o po$e ser mu$a$o# uma vez que $eclara$o:
tipoEa5ariavel nomeEa5ariavel;

2or e emplo# ) possvel ter uma i#a#e que %uar$a um n6mero inteiro:
int i#a#e;

Com isso# voc! $eclara a vari&vel i#a#e# que passa a e istir a partir $aquela linha. /la ) $o tipo int# que %uar$a um n6mero inteiro. 5 partir $a# voc! po$e us&-la# primeiramente atribuin$o valores. 5 linha a se%uir ) a tra$u,(o $e: Gi#a#e deve valer quin.eG.
i#a#e G /;;

Coment1rios em Java 2ara fazer um coment&rio em java# voc! po$e usar o (( para comentar at) o final $a linha# ou ent(o usar o (H H( para comentar o que estiver entre eles.
(H comentIrio #a)uiF ate a)ui H( (( uma linha #e comentIrio so"re a i#a#e int i#a#e;

5l)m $e atribuir# voc! po$e utilizar esse valor. 1 c+$i%o a se%uir $eclara novamente a vari&vel i#a#e com valor 1J e imprime seu valor na sa$a pa$r(o atrav)s $a chama$a a System.out.println.
(( #eclara a i#a#e int i#a#e; i#a#e G /;; (( imprime a i#a#e System.out.println(i#a#e);

2or fim# po$emos utilizar o valor $e uma vari&vel para al%um outro prop+sito# como alterar ou $efinir uma se%un$a vari&vel. 1 c+$i%o a se%uir cria uma vari&vel chama$a i#a#eDoJnoKue5em com valor $e idade mais um.
(( calcula a i#a#e no ano se uinte int i#a#eDoJnoKue5em; i#a#eDoJnoKue5em G i#a#e L /;

0o mesmo momento que voc! $eclara uma vari&vel# tamb)m ) possvel inicializ&-la por pratici$a$e:
int i#a#e G /;;

4oc! po$e usar os opera$ores V# -# / e W para operar com n6meros# sen$o eles respons&veis pela a$i,(o# subtra,(o# $ivis(o e multiplica,(o# respectivamente. 5l)m $esses opera$ores b&sicos# h& o opera$or U 9m+$ulo: que na$a mais ) que o resto de uma diviso inteira. 4eja al%uns e emplos:
int )uatro G 7 L 7; int tres G ; * 7;

int oito G 6 H 7; int #eMesseis G N6 ( 6; int um G ; O 7; (( ; #ivi#i#o por 7 #I 7 e tem resto /; (( o opera#or O pe a o resto #a #iviso inteira

Como rodar esses c*di#os? 4oc! $eve colocar esses trechos $e c+$i%o $entro $o bloco main que vimos no captulo anterior. 'sto )# isso $eve ficar no miolo $o pro%rama. 8se bastante System.out.println# $essa forma voc! po$e ver al%um resulta$o# caso contr&rio# ao e ecutar a aplica,(o# na$a aparecer&. 2or e emplo# para imprimir a i#a#e e a i#a#eDoJnoKue5em po$emos escrever o se%uinte pro%rama $e e emplo:
class PestaQ#a#e ! pu"lic static voi# main(Strin $% ar s) ! (( imprime a i#a#e int i#a#e G 7-; System.out.println(i#a#e); (( era uma i#a#e no ano se uinte int i#a#eDoJnoKue5em; i#a#eDoJnoKue5em G i#a#e L /; (( imprime a i#a#e System.out.println(i#a#eDoJnoKue5em);

& &

Eepresentar n6meros inteiros ) f&cil# mas como %uar$ar valores reais# tais como fra,-es $e n6meros inteiros e outrosC 1utro tipo $e vari&vel muito utiliza$o ) o #ou"le# que armazena um n6mero com ponto flutuante 9e que tamb)m po$e armazenar um n6mero inteiro:.
#ou"le pi G :./6; #ou"le A G ; H /-;

1 tipo boolean armazena um valor ver$a$eiro ou falso# e s+: na$a $e n6meros# palavras ou en$ere,os# como em al%umas outras lin%ua%ens.
"oolean ver#a#e G true;

true e false s(o palavras reserva$as $o .ava. L comum que um "oolean seja $etermina$o atrav)s $e uma e!presso booleana# isto )# um trecho $e c+$i%o que retorna um booleano# como o e emplo:
int i#a#e G :-; "oolean menorEeQ#a#e G i#a#e 3 /<;

1 tipo char %uar$a um# e apenas um# caractere. /sse caractere $eve estar entre aspas simples. 0(o se esque,a $essas $uas caractersticas $e uma vari&vel $o tipo charO 2or e emplo# ela n(o po$e %uar$ar um c+$i%o como @@ pois o vazio n(o ) um caractereO
char letra G @a@; System.out.println(letra);

4ari&veis $o tipo char s(o pouco usa$as no $ia a $ia. 4eremos mais a frente o uso $as Strin s#

que usamos constantemente# por)m estas n(o s(o $efini$as por um tipo primitivo.

%.2 - &ipos primitivos e valores


/sses tipos $e vari&veis s(o tipos primitivos $o .ava: o valor que elas %uar$am s(o o real conte6$o $a vari&vel. @uan$o voc! utilizar o operador de atribuioG o valor ser& copiado.
int i G ;; (( i rece"e uma cRpia #o valor ; int ' G i; (( ' rece"e uma cRpia #o valor #e i i G i L /; (( i vira NF ' continua ;

5qui# i fica com o valor $e Q. "as e 'C 0a se%un$a linha# ' est& valen$o J. @uan$o i passa a valer Q# ser& que ' tamb)m mu$a $e valorC 0(o# pois o valor $e um tipo primitivo sempre ) copia$o. 5pesar $a linha = fazer ' G i# a partir $esse momento essas vari&veis n(o tem rela,(o nenhuma: o que acontece com uma# n(o reflete em na$a com a outra. Outros tipos primitivos 4imos aqui os tipos primitivos que mais aparecem. 1 .ava tem outros# que s(o o "yte# short# lon e float. Ca$a tipo possui caractersticas especiais que# para um pro%rama$or avan,a$o# po$em fazer muita $iferen,a.

%.% - =!erc"ciosF +ari1veis e tipos primitivos


1. 0a empresa on$e trabalhamos# h& tabelas com o quanto foi %asto em ca$a m!s. 2ara fechar o balan,o $o primeiro trimestre# precisamos somar o %asto total. *aben$o que# em .aneiro# foram %astos 1JBBB reais# em ;evereiro# =RBBB reais e em "ar,o# 1NBBB reais# fa,a um pro%rama que calcule e imprima o %asto total no trimestre. *i%a esses passos: 1. Crie uma classe chama$a SalancoPrimestral com um bloco main# como nos e emplos anteriores? =. 3entro $o main 9o miolo $o pro%rama:# $eclare uma vari&vel inteira chama$a astosJaneiro e inicialize-a com 1JBBB? R. Crie tamb)m as vari&veis astos8evereiro e astosMarco# inicializan$o-as com =RBBB e 1NBBB# respectivamente# utilize uma linha para ca$a $eclara,(o? K. Crie uma vari&vel chama$a astosPrimestre e inicialize-a com a soma $as outras R vari&veis:
int astosPrimestre G astosJaneiro L astos8evereiro L astosMarco;

J. 'mprima a vari&vel astosPrimestre. =. 5$icione c+$i%o 9sem alterar as linhas que j& e istem: na classe anterior para imprimir a m)$ia mensal $e %asto# crian$o uma vari&vel me#iaMensal junto com uma mensa%em. 2ara isso# concatene a Strin com o valor# usan$o "5alor #a mT#ia mensal G " L me#iaMensal.

%.6 - >iscusso em aulaF conven:es de c*di#o e c*di#o le#"vel


3iscuta com o instrutor e seus cole%as sobre conven,-es $e c+$i%o .ava. 2or que e istemC 2or que s(o importantesC 3iscuta tamb)m as vanta%ens $e se escrever c+$i%o f&cil $e ler e se evitar coment&rios em e cesso. 93ica: procure por java code conventions:.

%.9 - Castin# e promoo


5l%uns valores s(o incompatveis se voc! tentar fazer uma atribui,(o $ireta. /nquanto um n6mero real costuma ser representa$o em uma vari&vel $o tipo #ou"le# tentar atribuir ele a uma vari&vel int n(o funciona porque ) um c+$i%o que $iz: Gi deve valer dG# mas n(o se sabe se # realmente ) um n6mero inteiro ou n(o.
#ou"le # G :./6/;; int i G #; (( no compila

1 mesmo ocorre no se%uinte trecho:


int i G :./6;

1 mais interessante# ) que nem mesmo o se%uinte c+$i%o compila:


#ou"le # G ;; (( o0F o #ou"le po#e conter um nUmero inteiro int i G #; (( no compila

5pesar $e J ser um bom valor para um int# o compila$or n(o tem como saber que valor estar& $entro $esse #ou"le no momento $a e ecu,(o. /sse valor po$e ter si$o $i%ita$o pelo usu&rio# e nin%u)m vai %arantir que essa convers(o ocorra sem per$a $e valores. .& no caso a se%uir# ) o contr&rio:
int i G ;; #ou"le #7 G i;

1 c+$i%o acima compila sem problemas# j& que um #ou"le po$e %uar$ar um n6mero com ou sem ponto flutuante. Ho$os os inteiros representa$os por uma vari&vel $o tipo int po$em ser %uar$a$os em uma vari&vel $ouble# ent(o n(o e istem problemas no c+$i%o acima. Xs vezes# precisamos que um n6mero quebra$o seja arre$on$a$o e armazena$o num n6mero inteiro. 2ara fazer isso sem que haja o erro $e compila,(o# ) preciso or$enar que o n6mero quebra$o seja moldado HcastedI como um n6mero inteiro. /sse processo recebe o nome $e castin#.
#ou"le #: G :./6; int i G (int) #:;

1 castin% foi feito para mol$ar a vari&vel #: como um int. 1 valor $e i a%ora ) R. 1 mesmo ocorre entre valores int e lon .
lon A G /----; int i G A; (( no compilaF pois po#e estar per#en#o informao

/# se quisermos realmente fazer isso# fazemos o castin%:


lon A G /----;

int i G (int) A;

Casos no to comuns de castin# e atribuio 5l%uns castin#s aparecem tamb)m:


float A G -.-;

1 c+$i%o acima n(o compila pois to$os os literais com ponto flutuante s(o consi$era$os #ou"le pelo .ava. / float n(o po$e receber um #ou"le sem per$a $e informa,(o# para fazer isso funcionar po$emos escrever o se%uinte:
float A G -.-f;

5 letra f# que po$e ser mai6scula ou min6scula# in$ica que aquele literal $eve ser trata$o como float. 1utro caso# que ) mais comum:
#ou"le # G ;; float f G :; float A G f L (float) #;

4oc! precisa $o castin% porque o .ava faz as contas e vai armazenan$o sempre no maior tipo que apareceu $urante as opera,-es# no caso o #ou"le. /# uma observa,(o: no mnimo# o .ava armazena o resulta$o em um int# na hora $e fazer as contas. 5t) castin% com vari&veis $o tipo char po$em ocorrer. 1 6nico tipo primitivo que n(o po$e ser atribu$o a nenhum outro tipo ) o "oolean. Castin#s poss"veis 5bai o est(o relaciona$os to$os os casts possveis na lin%ua%em .ava# mostran$o a convers(o de um valor para outro. 5 in$ica,(o 8mpl. quer $izer que aquele cast ) implcito e autom&tico# ou seja# voc! n(o precisa in$icar o cast e plicitamente 9lembran$o que o tipo boolean n(o po$e ser converti$o para nenhum outro tipo:.

&aman$o dos tipos 0a tabela abai o# est(o os tamanhos $e ca$a tipo primitivo $o .ava.

%.< - O i- e o else
5 sinta e $o if no .ava ) a se%uinte:
if (con#icaoSooleana) ! co#i o; &

8ma condio booleana ) qualquer e press(o que retorne true ou false. 2ara isso# voc! po$e usar os opera$ores 3# 4# 3G# 4G e outros. 8m e emplo:
int i#a#e G /;; if (i#a#e 3 /<) ! System.out.println("Do po#e entrar"); &

5l)m $isso# voc! po$e usar a cl&usula else para in$icar o comportamento que $eve ser e ecuta$o no caso $a e press(o booleana ser falsa:
int i#a#e G /;; if (i#a#e 3 /<) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &

4oc! po$e concatenar e press-es booleanas atrav)s $os opera$ores l+%icos G=G e GO)G. 1 G=G ) representa$o pelo VV e o GO)G ) representa$o pelo WW. 8m e emplo seria verificar se ele tem menos $e 1Y anos e se ele n(o ) ami%o $o $ono:
int i#a#e G /;; "oolean ami oEoEono G true; if (i#a#e 3 /< VV ami oEoEono GG false) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &

/sse c+$i%o po$eria ficar ain$a mais le%vel# utilizan$o-se o opera$or $e ne%a,(o# o !. /sse opera$or transforma o resulta$o $e uma e press(o booleana $e false para true e vice versa.
int i#a#e G /;; "oolean ami oEoEono G true; if (i#a#e 3 /< VV !ami oEoEono) ! System.out.println("Do po#e entrar"); & else ! System.out.println("Po#e entrar"); &

Eepare na linha R que o trecho ami oEoEono GG false virou !ami oEoEono. =les t,m o mesmo valor. 2ara comparar se uma vari&vel tem o mesmo valor que outra vari&vel ou valor# utilizamos o opera$or GG. Eepare que utilizar o opera$or G $entro $e um if vai retornar um erro $e compila,(o# j& que o opera$or G ) o $e atribui,(o.

int mes G /; if (mes GG /) ! System.out.println("5ocX #everia estar #e fTrias"); &

%.@ - O 3$ile
1 while ) um coman$o usa$o para fazer um lao HloopI# isto )# repetir um trecho $e c+$i%o al%umas vezes. 5 i$eia ) que esse trecho $e c+$i%o seja repeti$o enquanto uma $etermina$a con$i,(o permanecer ver$a$eira.
int i#a#e G /;; while (i#a#e 3 /<) ! System.out.println(i#a#e); i#a#e G i#a#e L /; &

1 trecho $entro $o bloco $o while ser& e ecuta$o at) o momento em que a con$i,(o i#a#e 3 /< passe a ser falsa. / isso ocorrer& e atamente no momento em que i#a#e GG /<# o que n(o o far& imprimir /<.
int i G -; while (i 3 /-) ! System.out.println(i); i G i L /; &

.& o while acima imprime $e B a A.

%.A - O /or
1utro coman$o $e loop e tremamente utiliza$o ) o for. 5 i$eia ) a mesma $o while: fazer um trecho $e c+$i%o ser repeti$o enquanto uma con$i,(o continuar ver$a$eira. "as al)m $isso# o for isola tamb)m um espa,o para inicializa,(o $e vari&veis e o mo$ifica$or $essas vari&veis. 'sso faz com que fiquem mais le%veis# as vari&veis que s(o relaciona$as ao loop:
for (inicialiMacao; con#icao; incremento) ! co#i o; &

8m e emplo ) o a se%uir:
for (int i G -; i 3 /-; i G i L /) ! System.out.println("olI!"); &

Eepare que esse for po$eria ser troca$o por:


int i G -; while (i 3 /-) ! System.out.println("olI!"); i G i L /; &

2or)m# o c+$i%o $o for in$ica claramente que a vari&vel i serve# em especial# para controlar a quanti$a$e $e la,os e ecuta$os. @uan$o usar o forC @uan$o usar o whileC 3epen$e $o %osto e $a ocasi(o.

E*s incremento JJ i G i L / po$e realmente ser substitu$o por iLL quan$o isola$o# por)m# em al%uns casos# temos essa instru,(o envolvi$a em# por e emplo# uma atribui,(o:
int i G ;; int A G iLL;

@ual ) o valor $e AC 1 $e i# ap+s essa linha# ) Q. 1 opera$or LL# quan$o vem ap+s a vari&vel# retorna o valor anti%o# e incrementa 9p+s incremento:# fazen$o A valer J. *e voc! tivesse usa$o o LL antes $a vari&vel 9pr) incremento:# o resulta$o seria Q:
int i G ;; int A G LLi; (( a)ui A valera N

%.C - Controlando loops


5pesar $e termos con$i,-es booleanas nos nossos la,os# em al%um momento# po$emos $eci$ir parar o loop por al%um motivo especial sem que o resto $o la,o seja e ecuta$o.
for (int i G A; i 3 y; iLL) ! if (i O /Y GG -) ! System.out.println("Jchei um nUmero #ivis?vel por /Y entre A e y"); "rea0; & &

1 c+$i%o acima vai percorrer os n6meros $e a D e parar quan$o encontrar um n6mero $ivisvel por 1A# uma vez que foi utiliza$a a palavra chave "rea0. 3a mesma maneira# ) possvel obri%ar o loop a e ecutar o pr+ imo la,o. 2ara isso usamos a palavra chave continue.
for (int i G -; i 3 /--; iLL) ! if (i 4 ;- VV i 3 N-) ! continue; & System.out.println(i); &

1 c+$i%o acima n(o vai imprimir al%uns n6meros. 9@uais e atamenteC:

%.1D - =scopo das vari1veis


0o .ava# po$emos $eclarar vari&veis a qualquer momento. 2or)m# $epen$en$o $e on$e voc! as $eclarou# ela vai valer $e um $etermina$o ponto a outro.
(( a)ui a variIvel i no eAiste int i G ;; (( a partir #a)ui ela eAiste

1 escopo da vari1vel ) o nome $a$o ao trecho $e c+$i%o em que aquela vari&vel e iste e on$e ) possvel acess&-la.

@uan$o abrimos um novo bloco com as chaves# as vari&veis $eclara$as ali $entro s* valem at o -im daquele bloco.
(( a)ui a variIvel i no eAiste int i G ;; (( a partir #a)ui ela eAiste while (con#icao) ! (( o i ain#a vale a)ui int ' G Z; (( o ' passa a eAistir & (( a)ui o ' no eAiste maisF mas o i continua #entro #o escopo

0o bloco acima# a vari&vel ' p&ra $e e istir quan$o termina o bloco on$e ela foi $eclara$a. *e voc! tentar acessar uma vari&vel fora $e seu escopo# ocorrer& um erro $e compila,(o.

1 mesmo vale para um if:


if (al umSooleano) ! int i G ;; & else ! int i G /-; & System.out.println(i); (( cui#a#o!

5qui a vari&vel i n(o e iste fora $o if e $o elseO *e voc! $eclarar a vari&vel antes $o if# vai haver outro erro $e compila,(o: $entro $o if e $o else a vari&vel est& sen$o re$eclara$aO /nt(o o c+$i%o para compilar e fazer senti$o fica:
int i; if (al umSooleano) ! i G ;; & else ! i G /-; & System.out.println(i);

8ma situa,(o pareci$a po$e ocorrer com o for:


for (int i G -; i 3 /-; iLL) ! System.out.println("olI!"); & System.out.println(i); (( cui#a#o!

0este for# a vari&vel i morre ao seu t)rmino# n(o po$en$o ser acessa$a $e fora $o for# %eran$o um erro $e compila,(o. *e voc! realmente quer acessar o conta$or $epois $o loop terminar# precisa $e al%o como:
int i; for (i G -; i 3 /-; iLL) ! System.out.println("olI!"); & System.out.println(i);

%.11 - )m bloco dentro do outro


8m bloco tamb)m po$e ser $eclara$o $entro $e outro. 'sto )# um if $entro $e um for# ou um for $entro $e um for# al%o como:
while (con#icao) ! for (int i G -; i 3 /-; iLL) ! (( cR#i o & &

Bova editora Casa do C*di#o com livros de uma -orma di-erente /$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

%.12 - Eara saber mais


1. 4imos apenas os coman$os mais usa$os para controle $e flu o. 1 .ava ain$a possui o #o..while e o switch. 2esquise sobre eles e $i%a quan$o ) interessante usar ca$a um $eles. =. 5l%umas vezes# temos v&rios la,os enca$ea$os. 2o$emos utilizar o "rea0 para quebrar o la,o mais interno. "as# se quisermos quebrar um la,o mais e terno# teremos $e enca$ear $iversos ifs e seu c+$i%o ficar& uma ba%un,a. 1 .ava possui um artifcio chama$o labeled loops? pesquise sobre eles. R. 1 que acontece se voc! tentar $ivi$ir um n6mero inteiro por BC / por B.BC K. / iste um caminho entre os tipos primitivos que in$icam se h& a necessi$a$e ou n(o $e castin% entre os tipos. 2or e emplo# int -Z lon -Z #ou"le 9um int po$e ser trata$o como um #ou"le# mas n(o o contr&rio:. 2esquise 9ou teste:# e posicione os outros tipos primitivos nesse flu o. J. 5l)m $os opera$ores $e incremento# e istem os $e $ecremento# como **i e i**. 5l)m $esses# voc! po$e usar instru,-es $o tipo i LG A e i *G A# o que essas instru,-es fazemC Heste.

%.1% - =!erc"ciosF /i!ao de sinta!e


"ais e erccios $e fi a,(o $e sinta e. 2ara quem j& conhece um pouco $e .ava# po$e ser muito simples? mas recomen$amos fortemente que voc! fa,a os e erccios para se acostumar com erros $e compila,(o# mensa%ens $o javac# conven,(o $e c+$i%o# etc... 5pesar $e e tremamente simples# precisamos praticar a sinta e que estamos apren$en$o. 2ara ca$a e erccio# crie um novo arquivo com e tens(o .java# e $eclare aquele estranho cabe,alho# $an$o nome a uma classe e com um bloco main $entro $ele:
class CAercicio> ! pu"lic static voi# main(Strin $% ar s) ! (( seu eAerc?cio vai a)ui & &

0(o copie e cole $e um e erccio j& e istenteO 5proveite para praticar. 1. 'mprima to$os os n6meros $e 1JB a RBB. =. 'mprima a soma $e 1 at) 1BBB. R. 'mprima to$os os m6ltiplos $e R# entre 1 e 1BB. K. 'mprima os fatoriais $e 1 a 1B. 1 fatorial $e um n6mero n ) n W n-1 W n-= ... at) n S 1. Fembre-se $e utilizar os par!nteses. 1 fatorial $e B ) 1 1 fatorial $e 1 ) 9BO: W 1 S 1 1 fatorial $e = ) 91O: W = S = 1 fatorial $e R ) 9=O: W R S Q 1 fatorial $e K ) 9RO: W K S =K ;a,a um for que inicie uma vari&vel n 9n6mero: como 1 e fatorial 9resulta$o: como 1 e varia n $e 1 at) 1B:
int fatorial G /; for (int n G /; n 3G /-; nLL) ! &

J. 0o c+$i%o $o e erccio anterior# aumente a quanti$a$e $e n6meros que ter(o os fatoriais impressos# at) =B# RB# KB. /m um $etermina$o momento# al)m $esse c&lculo $emorar# vai come,ar a mostrar respostas completamente erra$as. 2or qu!C "u$e $e int para lon para ver al%uma mu$an,a. Q. 9opcional: 'mprima os primeiros n6meros $a s)rie $e ;ibonacci at) passar $e 1BB. 5 s)rie $e ;ibonacci ) a se%uinte: B# 1# 1# =# R# J# Y# 1R# =1# etc... 2ara calcul&-la# o primeiro elemento vale B# o se%un$o vale 1# $a por $iante# o n-)simo elemento vale o 9n-1:-)simo elemento soma$o ao 9n-=:-)simo elemento 9e : Y S J V R:. N. 9opcional: /screva um pro%rama que# $a$a uma vari&vel A com al%um valor inteiro# temos um novo A $e acor$o com a se%uinte re%ra: se A ) par# A G A ( 7 se A ) impar# A G : H A L / imprime A 1 pro%rama $eve parar quan$o A tiver o valor final $e 1. 2or e emplo# para A G /:# a sa$a ser&:KB -Z =B -Z 1B -Z J -Z 1Q -Z Y -Z K -Z = -Z 1 8mprimindo sem pular lin$a 8m $etalhe importante ) que uma quebra $e linha ) impressa to$a vez que chamamos println. 2ara n(o pular uma linha# usamos o c+$i%o a se%uir:
System.out.print(variavel);

Y. 9opcional: 'mprima a se%uinte tabela# usan$o fors enca$ea$os:


/ 7 : 6 n 6 N Y < /7 /N nH7 nH: .... nHn

%.16 - >esa-iosF /ibonacci


1. ;a,a o e erccio $a s)rie $e ;ibonacci usan$o apenas $uas vari&veis. Captulo K

Orientao a objetos b1sica


"2ro%rama,(o orienta$a a objetos ) uma p)ssima i$eia# que s+ po$eria ter nasci$o na Calif+rnia." 5o t)rmino $este captulo# voc! ser& capaz $e: $izer o que ) e para que serve orienta,(o a objetos? conceituar classes# atributos e comportamentos? enten$er o si%nifica$o $e vari&veis e objetos na mem+ria.

6.1 - 0otivaoF problemas do paradi#ma procedural


1rienta,(o a objetos ) uma maneira $e pro%ramar que aju$a na or%aniza,(o e resolve muitos problemas enfrenta$os pela pro%rama,(o proce$ural. Consi$eremos o cl&ssico problema $a vali$a,(o $e um C2;. 0ormalmente# temos um formul&rio# no qual recebemos essa informa,(o# e $epois temos que enviar esses caracteres para uma fun,(o que vai vali$&-lo# como no pseu$oc+$i%o abai o:
cpf G formulario*4campo.cpf vali#a(cpf)

5l%u)m te obri%a a sempre vali$ar esse C2;C 4oc! po$e# in6meras vezes# esquecer $e chamar esse vali$a$or. "ais: consi$ere que voc! tem JB formul&rios e precise vali$ar em to$os eles o C2;. *e sua equipe tem R pro%rama$ores trabalhan$o nesses formul&rios# quem fica respons&vel por essa vali$a,(oC Ho$osO 5 situa,(o po$e piorar: na entra$a $e um novo $esenvolve$or# precisaramos avis&-lo que sempre $evemos vali$ar o cpf $e um formul&rio. L nesse momento que nascem aqueles %uias $e pro%rama,(o para o $esenvolve$or que for entrar nesse projeto - <s vezes# ) um $ocumento enorme. /m outras palavras# todo $esenvolve$or precisa ficar saben$o $e uma quanti$a$e enorme $e informa,-es# que# na maioria $as vezes# n(o est& realmente relaciona$o < sua parte no sistema# mas ele precisa ler tu$o isso# resultan$o um entrave muito %ran$eO 1utra situa,(o on$e ficam claros os problemas $a pro%rama,(o proce$ural# ) quan$o nos encontramos na necessi$a$e $e ler o c+$i%o que foi escrito por outro $esenvolve$or e $escobrir como ele funciona internamente. 8m sistema bem encapsula$o n(o $everia %erar essa necessi$a$e. /m um sistema %ran$e# simplesmente n(o temos tempo $e ler to$o o c+$i%o e istente. Consi$eran$o que voc! n(o erre nesse ponto e que sua equipe tenha uma comunica,(o muito boa 9perceba que comunica,(o e cessiva po$e ser preju$icial e atrapalhar o an$amento:# ain$a temos outro problema: ima%ine que# em to$o formul&rio# voc! tamb)m quer que a i$a$e $o cliente seja vali$a$a - o cliente precisa ter mais $e 1Y anos. 4amos ter $e colocar um if... mas on$eC /spalha$o por to$o seu c+$i%o... "esmo que se crie outra fun,(o para vali$ar# precisaremos incluir isso nos nossos JB formul&rios j& e istentes. @ual ) a chance $e esquecermos em um $elesC L muito %ran$e. 5 responsabili$a$e $e verificar se o cliente tem ou n(o tem 1Y anos ficou espalha$a por to$o o seu c+$i%o. *eria interessante po$er concentrar essa responsabili$a$e em um lu%ar s+# para n(o ter chances $e esquecer isso.

"elhor ain$a seria se conse%ussemos mu$ar essa vali$a,(o e os outros pro%rama$ores nem precisassem ficar saben$o $isso. /m outras palavras# eles criariam formul&rios e um 6nico pro%rama$or seria respons&vel pela vali$a,(o: os outros nem sabem $a e ist!ncia $esse trecho $e c+$i%o. 'mpossvelC 0(o# o para$i%ma $a orienta,(o a objetos facilita tu$o isso. 1 problema $o para$i%ma proce$ural ) que n(o e iste uma forma simples $e criar cone (o forte entre $a$os e funcionali$a$es. 0o para$i%ma orienta$o a objetos ) muito f&cil ter essa cone (o atrav)s $os recursos $a pr+pria lin%ua%em. Kuais as vanta#ens? 1rienta,(o a objetos vai te aju$ar em muito em se or%anizar e escrever menos# al)m $e concentrar as responsabili$a$es nos pontos certos# fle ibilizan$o sua aplica,(o# encapsulando a l+%ica $e ne%+cios. 1utra enorme vanta%em# on$e voc! realmente vai economizar montanhas $e c+$i%o# ) o polimor-ismo das re-er,ncias# que veremos em um posterior captulo. 0os pr+ imos captulos# conse%uiremos en er%ar to$a essa vanta%em# mas# primeiramente ) necess&rio conhecer um pouco mais $a sinta e e $a cria,(o $e tipos e refer!ncias em .ava.

6.2 - Criando um tipo


Consi$ere um pro%rama para um banco# ) bem f&cil perceber que uma enti$a$e e tremamente importante para o nosso sistema ) a conta. 0ossa i$eia aqui ) %eneralizarmos al%uma informa,(o# juntamente com funcionali$a$es que to$a conta $eve ter. 1 que to$a conta tem e ) importante para n+sC n6mero $a conta nome $o $ono $a conta sal$o limite saca uma quanti$a$e $eposita uma quanti$a$e imprime o nome $o $ono $a conta $evolve o sal$o atual transfere uma quanti$a$e para uma outra conta D $evolve o tipo $e conta

1 que to$a conta faz e ) importante para n+sC 'sto )# o que %ostaramos $e "pe$ir < conta"C

Com isso# temos o projeto $e uma conta banc&ria. 2o$emos pe%ar esse projeto e acessar seu sal$oC 0(o. 1 que temos ain$a ) o projeto. 5ntes# precisamos construir uma conta# para po$er acessar o que ela tem# e pe$ir a ela que fa,a al%o.

Eepare na fi%ura: apesar $o papel $o la$o esquer$o especificar uma Conta# essa especifica,(o ) uma ContaC 0+s $epositamos e sacamos $inheiro $esse papelC 0(o. 8tilizamos a especifica,(o $a Conta para po$er criar inst[ncias que realmente s(o contas# on$e po$emos realizar as opera,-es que criamos. 5pesar $e $eclararmos que to$a conta tem um sal$o# um n6mero e uma a%!ncia no pe$a,o $e papel 9como < esquer$a na fi%ura:# s(o nas inst[ncias $esse projeto que realmente h& espa,o para armazenar esses valores.

5o projeto $a conta# isto )# a $efini,(o $a conta# $amos o nome $e classe. 5o que po$emos construir a partir $esse projeto# as contas $e ver$a$e# $amos o nome $e objetos. 5 palavra classe vem $a ta onomia $a biolo%ia. Ho$os os seres vivos $e uma mesma classe biol+%ica t!m uma s)rie $e atributos e comportamentos em comum# mas n(o s(o i%uais# po$em variar nos valores $esses atributos e como realizam esses comportamentos. 7omo apiens $efine um %rupo $e seres que possuem caractersticas em comum# por)m a $efini,(o 9a i$eia# o conceito: $e um 7omo apiens ) um ser humanoC 0(o. Hu$o est& especifica$o na classe >omo *apiens# mas se quisermos man$ar al%u)m correr# comer# pular# precisaremos $e uma inst[ncia $e 7omo apiens# ou ent(o $e um objeto $o tipo 7omo apiens. 8m outro e emplo: uma receita $e bolo. 5 per%unta ) certeira: voc! come uma receita $e boloC 0(o. 2recisamos instanci1-la# criar um objeto bolo a partir $essa especifica,(o 9a classe: para utiliz&-la. 2o$emos criar centenas $e bolos a partir $essa classe 9a receita# no caso:# eles po$em ser bem semelhantes# al%uns at) i$!nticos# mas s(o objetos $iferentes. 2o$emos fazer milhares $e analo%ias semelhantes. 5 planta $e uma casa ) uma casaC 3efinitivamente n(o. 0(o po$emos morar $entro $a planta $e uma casa# nem po$emos abrir sua porta ou pintar suas pare$es. 2recisamos# antes# construir inst[ncias a partir $essa planta. /ssas inst[ncias# sim# po$emos pintar# $ecorar ou morar $entro. 2o$e parecer +bvio# mas a $ificul$a$e inicial $o para$i%ma $a orienta,(o a objetos ) justo saber $istin%uir o que ) classe e o que ) objeto. L comum o iniciante utilizar# obviamente $e forma erra$a# essas $uas palavras como sinInimos.

6.% - )ma classe em Java


4amos come,ar apenas com o que uma +onta tem# e n(o com o que ela faz 9veremos lo%o em se%ui$a:. 8m tipo $esses# como o especifica$o $e +onta acima# po$e ser facilmente tra$uzi$o para .ava:
class +onta ! int numero; Strin #ono; #ou"le sal#o; #ou"le limite; (( .. &

trin# *trin% ) uma classe em .ava. /la %uar$a uma ca$eia $e caracteres# uma frase completa. Como estamos ain$a apren$en$o o que ) uma classe# enten$eremos com $etalhes a classe Strin apenas em captulos posteriores. 2or enquanto# $eclaramos o que to$a conta $eve ter. /stes s(o os atributos que to$a conta# quan$o cria$a# vai ter. Eepare que essas vari&veis foram $eclara$as fora $e um bloco# $iferente $o que fazamos quan$o tinha aquele main. @uan$o uma vari&vel ) $eclara$a $iretamente $entro $o escopo $a classe# ) chama$a $e vari&vel $e objeto# ou atributo.

6.6 - Criando e usando um objeto


.& temos uma classe em .ava que especifica o que to$o objeto $essa classe $eve ter. "as como us&laC 5l)m $essa classe# ain$a teremos o Ero#rama.java e a partir $ele ) que vamos utilizar a classe +onta. 2ara criar 9construir# instanciar: uma +onta# basta usar a palavra chave new. 3evemos utilizar tamb)m os par!nteses# que $escobriremos o que fazem e atamente em um captulo posterior:
class Pro rama ! pu"lic static voi# main(Strin $% ar s) ! new +onta(); & &

Bem# o c+$i%o acima cria um objeto $o tipo +onta# mas como acessar esse objeto que foi cria$oC 2recisamos ter al%uma forma $e nos referenciarmos a esse objeto. 2recisamos $e uma vari&vel:
class Pro rama ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); & &

2o$e parecer estranho escrevermos $uas vezes +onta: uma vez na $eclara,(o $a vari&vel e outra vez no uso $o new. "as h& um motivo# que em breve enten$eremos. 5trav)s $a vari&vel minha+onta# po$emos acessar o objeto rec)m cria$o para alterar seu #ono# seu sal#o# etc:
class Pro rama ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); minha+onta.#ono G "Eu0e"; minha+onta.sal#o G /---.-; System.out.println("Sal#o atual, " L minha+onta.sal#o); & &

L importante fi ar que o ponto foi utiliza$o para acessar al%o em minha+onta. 5 minha+onta pertence ao 3uGe# e tem sal$o $e mil reais.

6.9 - 0todos
3entro $a classe# tamb)m $eclararemos o que ca$a conta faz e como isto ) feito - os comportamentos que ca$a classe tem# isto )# o que ela faz. 2or e emplo# $e que maneira que uma Conta saca $inheiroC /specificaremos isso $entro $a pr+pria classe +onta# e n(o em um local $esatrela$o $as informa,-es $a pr+pria Conta. L por isso que essas "fun,-es" s(o chama$as $e mtodos. 2ois ) a maneira $e fazer uma opera,(o com um objeto. @ueremos criar um m)to$o que saca uma $etermina$a quantidade e n(o $evolve nen$uma in-ormao para quem acionar esse m)to$o:
class +onta ! #ou"le salario; (( ... outros atri"utos ...

voi# saca(#ou"le )uanti#a#e) ! #ou"le novoSal#o G this.sal#o * )uanti#a#e; this.sal#o G novoSal#o; & &

5 palavra chave voi# $iz que# quan$o voc! pe$ir para a conta sacar uma quantia# nenhuma informa,(o ser& envia$a $e volta a quem pe$iu. @uan$o al%u)m pe$ir para sacar# ele tamb)m vai $izer quanto quer sacar. 2or isso precisamos $eclarar o m)to$o com al%o $entro $os par!nteses - o que vai a $entro ) chama$o $e ar#umento $o m)to$o 9ou parLmetro:. /ssa vari&vel ) uma vari&vel comum# chama$a tamb)m $e tempor&ria ou local# pois# ao final $a e ecu,(o $esse m)to$o# ela $ei a $e e istir. 3entro $o m)to$o# estamos $eclaran$o uma nova vari&vel. /ssa vari&vel# assim como o ar%umento# vai morrer no fim $o m)to$o# pois este ) seu escopo. 0o momento que vamos acessar nosso atributo# usamos a palavra chave this para mostrar que esse ) um atributo# e n(o uma simples vari&vel. 9veremos $epois que ) opcional: Eepare que# nesse caso# a conta po$e estourar o limite fi a$o pelo banco. "ais para frente# evitaremos essa situa,(o# e $e uma maneira muito ele%ante. 3a mesma forma# temos o m)to$o para $epositar al%uma quantia:
class +onta ! (( ... outros atri"utos e mTto#os ... voi# #eposita(#ou"le )uanti#a#e) ! this.sal#o LG )uanti#a#e; & &

1bserve que n(o usamos uma vari&vel au iliar e# al)m $isso# usamos a abrevia,(o LG para $ei ar o m)to$o bem simples. 1 LG soma quanti$a$e ao valor anti%o $o sal$o e %uar$a no pr+prio sal$o# o valor resultante. 2ara man$ar uma mensa%em ao objeto e pe$ir que ele e ecute um m)to$o# tamb)m usamos o ponto. 1 termo usa$o para isso ) invocao de mtodo. 1 c+$i%o a se%uir saca $inheiro e $epois $eposita outra quantia na nossa conta:
class PestaJl unsMeto#os ! pu"lic static voi# main(Strin $% ar s) ! (( crian#o a conta +onta minha+onta; minha+onta G new +onta(); (( alteran#o os valores #e minha+onta minha+onta.#ono G "Eu0e"; minha+onta.sal#o G /---; (( saca 7-- reais minha+onta.saca(7--); (( #eposita ;-- reais minha+onta.#eposita(;--); System.out.println(minha+onta.sal#o); & &

8ma vez que seu sal$o inicial ) 1BBB reais# se sacarmos =BB reais# $epositarmos JBB reais e imprimirmos o valor $o sal$o# o que ser& impressoC eus livros de tecnolo#ia parecem do sculo passado? Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

6.< - 0todos com retorno


8m m)to$o sempre tem que $efinir o que retorna# nem que $efina que n(o h& retorno# como nos e emplos anteriores on$e est&vamos usan$o o voi#. 8m m)to$o po$e retornar um valor para o c+$i%o que o chamou. 0o caso $o nosso m)to$o saca # po$emos $evolver um valor booleano in$ican$o se a opera,(o foi bem suce$i$a.
class +onta ! (( ... outros mTto#os e atri"utos ... "oolean saca(#ou"le valor) ! if (this.sal#o 3 valor) ! return false; & else ! this.sal#o G this.sal#o * valor; return true; & &

&

5 $eclara,(o $o m)to$o mu$ouO 1 m)to$o saca n(o tem voi# na frente. 'sto quer $izer que# quan$o ) acessa$o# ele $evolve al%um tipo $e informa,(o. 0o caso# um "oolean. 5 palavra chave return in$ica que o m)to$o vai terminar ali# retornan$o tal informa,(o.

/ emplo $e uso:
minha+onta.sal#o G /---; "oolean conse ui G minha+onta.saca(7---); if (conse ui) ! System.out.println("+onse ui sacar"); & else ! System.out.println("Do conse ui sacar"); &

1u ent(o# posso eliminar a vari&vel tempor&ria# se $eseja$o:


minha+onta.sal#o G /---; if (minha+onta.saca(7---)) ! System.out.println("+onse ui sacar"); & else ! System.out.println("Do conse ui sacar"); &

"ais a$iante# veremos que al%umas vezes ) mais interessante lan,ar uma e ce,(o 9e#ception: nesses casos. "eu pro%rama po$e manter na mem+ria n(o apenas uma conta# como mais $e uma:
class PestaEuas+ontas ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta; minha+onta G new +onta(); minha+onta.sal#o G /---; +onta meuSonho; meuSonho G new +onta(); meuSonho.sal#o G /;-----; & &

6.@ - Objetos so acessados por re-er,ncias


@uan$o $eclaramos uma vari&vel para associar a um objeto# na ver$a$e# essa vari&vel n(o %uar$a o objeto# e sim uma maneira $e acess&-lo# chama$a $e re-er,ncia. L por esse motivo que# $iferente $os tipos primitivos como int e lon # precisamos $ar new $epois $e $eclara$a a vari&vel:
pu"lic static voi# main(Strin +onta c/; c/ G new +onta(); +onta c7; c7 G new +onta(); & ar s$%) !

1 correto aqui# ) $izer que c/ se refere a um objeto. Bo correto $izer que c/ ) um objeto# pois c/ ) uma vari&vel refer!ncia# apesar $e# $epois $e um tempo# os pro%rama$ores .ava falarem "Henho um objeto c $o tipo Conta"# mas apenas para encurtar a frase "Henho uma re-er,ncia c a um objeto $o tipo Conta". Basta lembrar que# em .ava# uma vari1vel nunca um objeto. 0(o h&# no .ava# uma maneira $e criarmos o que ) conheci$o como "objeto pilha" ou "objeto local"# pois to$o objeto em .ava# sem e ce,(o# ) acessa$o por uma vari&vel refer!ncia. /sse c+$i%o nos $ei a na se%uinte situa,(o:
+onta c/; c/ G new +onta(); +onta c7; c7 G new +onta();

'nternamente# c/ e c7 v(o %uar$ar um n6mero que i$entifica em que posi,(o $a mem+ria aquela +onta se encontra. 3essa maneira# ao utilizarmos o "." para nave%ar# o .ava vai acessar a +onta que se encontra naquela posi,(o $e mem+ria# e n(o uma outra. 2ara quem conhece# ) pareci$o com um ponteiro# por)m voc! n(o po$e manipul&-lo como um n6mero e nem utiliz&-lo para aritm)tica# ela ) tipa$a. 8m outro e emplo:
class Pesta[eferencias ! pu"lic static voi# main(Strin +onta c/ G new +onta(); c/.#eposita(/--); ar s$%) !

+onta c7 G c/; (( linha importante! c7.#eposita(7--); System.out.println(c/.sal#o); System.out.println(c7.sal#o); & &

@ual ) o resulta$o $o c+$i%o acimaC 1 que aparece ao ro$arC 1 que acontece aquiC 1 opera$or G copia o valor $e uma vari&vel. "as qual ) o valor $a vari&vel c/C L o objetoC 0(o. 0a ver$a$e# o valor %uar$a$o ) a refer!ncia 9endereo: $e on$e o objeto se encontra na mem+ria principal. 0a mem+ria# o que acontece nesse caso:
+onta c/ G new +onta(); +onta c7 G c/;

@uan$o fizemos c7 G c/# c7 passa a fazer refer!ncia para o mesmo objeto que c/ referencia nesse instante. /nt(o# nesse c+$i%o em especfico# quan$o utilizamos c/ ou c7 estamos nos referin$o e atamente ao mesmo objetoO /las s(o $uas refer!ncias $istintas# por)m apontam para o mesmo objetoO Compar&-las com "GG" vai nos retornar true# pois o valor que elas carre%am ) o mesmoO

1utra forma $e perceber# ) que $emos apenas um new# ent(o s+ po$e haver um objeto +onta na mem+ria. AtenoF n(o estamos $iscutin$o aqui a utili$a$e $e fazer uma refer!ncia apontar pro mesmo objeto que outra. /ssa utili$a$e ficar& mais clara quan$o passarmos vari&veis $o tipo refer!ncia como ar%umento para m)to$os. ne5 1 que e atamente faz o newC 1 new e ecuta uma s)rie $e tarefas# que veremos mais a$iante. "as# para melhor enten$er as refer!ncias no .ava# saiba que o new# $epois $e alocar a mem+ria para esse objeto# $evolve uma "flecha"# isto )# um valor $e refer!ncia. @uan$o voc! atribui isso a uma vari&vel# essa vari&vel passa a se referir para esse mesmo objeto. 2o$emos ent(o ver outra situa,(o:
pu"lic static voi# main(Strin +onta c/ G new +onta(); c/.#ono G "Eu0e"; c/.sal#o G 77Z; +onta c7 G new +onta(); c7.#ono G "Eu0e"; c7.sal#o G 77Z; if (c/ GG c7) ! System.out.println("+ontas i uais"); & ar s$%) !

&

1 opera$or GG compara o conte6$o $as vari&veis# mas essas vari&veis n(o %uar$am o objeto# e sim o en$ere,o em que ele se encontra. Como em ca$a uma $essas vari&veis %uar$amos $uas contas cria$as $iferentemente# elas est(o em espa,os $iferentes $a mem+ria# o que faz o teste no if valer false. 5s contas po$em ser equivalentes no nosso crit)rio $e i%ual$a$e# por)m elas n(o s(o o mesmo objeto. @uan$o se trata $e objetos# po$e ficar mais f&cil pensar que o GG compara se os objetos 9refer!ncias# na ver$a$e: s(o o mesmo# e n(o se s(o i%uais.

2ara saber se $ois objetos t!m o mesmo conte6$o# voc! precisa comparar atributo por atributo. 4eremos uma solu,(o mais ele%ante para isso tamb)m.

6.A - O mtodo trans-ereHI


/ se quisermos ter um m)to$o que transfere $inheiro entre $uas contasC 2o$emos ficar tenta$os a criar um m)to$o que recebe $ois par[metros: conta/ e conta7 $o tipo +onta. "as cui$a$o: assim estamos pensan$o $e maneira proce$ural. 5 i$eia ) que# quan$o chamarmos o m)to$o transfere# j& teremos um objeto $o tipo +onta 9o this:# portanto o m)to$o recebe apenas um par[metro $o tipo +onta# a Conta $estino 9al)m $o valor::
class +onta ! (( atri"utos e mTto#os...

&

voi# transfere(+onta #estinoF #ou"le valor) ! this.sal#o G this.sal#o * valor; #estino.sal#o G #estino.sal#o L valor; &

2ara $ei ar o c+$i%o mais robusto# po$eramos verificar se a conta possui a quanti$a$e a ser transferi$a $isponvel. 2ara ficar ain$a mais interessante# voc! po$e chamar os m)to$os #eposita e saca j& e istentes para fazer essa tarefa:
class +onta ! (( atri"utos e mTto#os... "oolean transfere(+onta #estinoF #ou"le valor) ! "oolean retirou G this.saca(valor); if (retirou GG false) ! (( no #eu pra sacar! return false; & else ! #estino.#eposita(valor); return true; & &

&

@uan$o passamos uma +onta como ar%umento# o que ser& que acontece na mem+riaC *er& que o objeto ) clonadoC 0o .ava# a passa%em $e par[metro funciona como uma simples atribui,(o como no uso $o "S". /nt(o# esse par[metro vai copiar o valor $a vari&vel $o tipo +onta que for passa$o como ar%umento. / qual ) o valor $e uma vari&vel $essasC *eu valor ) um en$ere,o# uma refer!ncia# nunca um objeto. 2or isso n(o h& c+pia $e objetos aqui. /sse 6ltimo c+$i%o po$eria ser escrito com uma sinta e muito mais sucinta. ComoC &rans-ere Eara 2erceba que o nome $este m)to$o po$eria ser transferePara ao inv)s $e s+ transfere. 5 chama$a $o m)to$o fica muito mais natural# ) possvel ler a frase em portu%u!s que ela tem um senti$o:
conta/.transferePara(conta7F ;-);

5 leitura $este c+$i%o seria "+onta/ transfere para conta7 JB reais". A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade

Caelum. Conhe,a a 5lura.

6.C - Continuando com atributos


5s vari&veis $o tipo atributo# $iferentemente $as vari&veis tempor&rias 9$eclara$as $entro $e um m)to$o:# recebem um valor pa$r(o. 0o caso num)rico# valem B# no caso $e "oolean# valem false. 4oc! tamb)m po$e $ar valores de-ault# como se%ue:
class +onta ! int numero G /7:6; Strin #ono G "Eu0e"; Strin cpf G "/7:.6;N.Z<Y*/-"; #ou"le sal#o G /---; #ou"le limite G /---; &

0esse caso# quan$o voc! criar uma conta# seus atributos j& est(o "popula$os" com esses valores coloca$os. 'ma%ine que comecemos a aumentar nossa classe +onta e a$icionar nomeF so"renome e cpf $o cliente $ono $a conta. Come,aramos a ter muitos atributos... e# se voc! pensar $ireito# uma +onta n(o tem nome# nem so"renome nem cpf# quem tem esses atributos ) um +liente. /nt(o po$emos criar uma nova classe e fazer uma composi,(o *eus atributos tamb)m po$em ser refer!ncias para outras classes. *uponha a se%uinte classe +liente:
class +liente ! Strin nome; Strin so"renome; Strin cpf; & class +onta ! int numero; #ou"le sal#o; #ou"le limite; +liente titular; (( .. &

/ $entro $o main $a classe $e teste:


class Peste ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta G new +onta(); +liente c G new +liente(); minha+onta.titular G c; (( ... & &

5qui# simplesmente houve uma atribui,(o. 1 valor $a vari&vel c ) copia$o para o atributo titular $o objeto ao qual minha+onta se refere. /m outras palavras# minha+onta tem uma refer!ncia ao mesmo +liente que c se refere# e po$e ser acessa$o atrav)s $e minha+onta.titular. 4oc! po$e realmente nave%ar sobre to$a essa estrutura $e informa,(o# sempre usan$o o ponto:

+liente clienteEaMinha+onta G minha+onta.titular; clienteEaMinha+onta.nome G "Eu0e";

1u ain$a# po$e fazer isso $e uma forma mais $ireta e at) mais ele%ante:
minha+onta.titular.nome G "Eu0e";

8m sistema orienta$o a objetos ) um %ran$e conjunto $e classes que vai se comunicar# $ele%an$o responsabili$a$es para quem for mais apto a realizar $etermina$a tarefa. 5 classe Sanco usa a classe +onta que usa a classe +liente# que usa a classe Cn#ereco. 3izemos que esses objetos colaboram# trocan$o mensa%ens entre si. 2or isso acabamos ten$o muitas classes em nosso sistema# e elas costumam ter um tamanho relativamente curto. "as# e se $entro $o meu c+$i%o eu n(o $esse new em +liente e tentasse acess&-lo $iretamenteC
class Peste ! pu"lic static voi# main(Strin $% ar s) ! +onta minha+onta G new +onta(); minha+onta.titular.nome G "Manoel"; (( ...

& &

@uan$o $amos new em um objeto# ele o inicializa com seus valores $efault# B para n6meros# false para "oolean e null para refer!ncias. null ) uma palavra chave em java# que in$ica uma refer!ncia para nenhum objeto.

*e# em al%um caso# voc! tentar acessar um atributo ou m)to$o $e al%u)m que est& se referencian$o para null# voc! receber& um erro $urante a e ecu,(o 9DullPointerCAception# que veremos mais < frente:. 3a para perceber# ent(o# que o new n(o traz um efeito cascata# a menos que voc! $! um valor $efault 9ou use construtores# que tamb)m veremos mais a frente::
class +onta ! int numero; #ou"le sal#o; #ou"le limite; +liente titular G new +liente(); (( )uan#o chamarem new +ontaF ((havera um new +liente para ele. &

Com esse c+$i%o# to$a nova +onta cria$a j& ter& um novo +liente associa$o# sem necessi$a$e $e instanci&-lo lo%o em se%ui$a $a instancia,(o $e uma +onta. @ual alternativa voc! $eve usarC 3epen$e $o caso: para to$a nova +onta voc! precisa $e um novo +lienteC L essa per%unta que $eve ser respon$i$a. 0esse nosso caso a resposta ) n(o# mas $epen$e $o nosso problema. AtenoF para quem n(o est& acostuma$o com refer!ncias# po$e ser bastante confuso pensar sempre em como os objetos est(o na mem+ria para po$er tirar as conclus-es $e o que ocorrer& ao e ecutar $etermina$o c+$i%o# por mais simples que ele seja. Com tempo# voc! a$quire a habili$a$e $e rapi$amente saber o efeito $e atrelar as refer!ncias# sem ter $e %astar muito tempo para isso. L importante# nesse come,o# voc! estar sempre pensan$o no esta$o $a mem+ria. / realmente lembrar que# no .ava 'uma vari vel nunca carrega um objeto& e sim uma re"er(ncia para ele' facilita muito.

6.1D - Eara saber maisF )ma /1brica de Carros


5l)m $o Sanco que estamos crian$o# vamos ver como ficariam certas classes relaciona$as a uma f&brica $e carros. 4amos criar uma classe +arro# com certos atributos# que $escrevem suas caractersticas# e com certos m)to$os# que $escrevem seu comportamento.
class +arro ! Strin cor; Strin mo#elo; #ou"le veloci#a#eJtual; #ou"le veloci#a#eMaAima; ((li a o carro voi# li a() ! System.out.println("2 carro estI li a#o"); & ((acelera uma certa )uanti#a#e voi# acelera(#ou"le )uanti#a#e) ! #ou"le veloci#a#eDova G this.veloci#a#eJtual L )uanti#a#e; this.veloci#a#eJtual G veloci#a#eDova; & ((#evolve a marcha #o carro int pe aMarcha() ! if (this.veloci#a#eJtual 3 -) ! return */; & if (this.veloci#a#eJtual 4G - VV this.veloci#a#eJtual 3 6-) ! return /; & if (this.veloci#a#eJtual 4G 6- VV this.veloci#a#eJtual 3 <-) ! return 7; & return :; &

&

4amos testar nosso +arro em um novo pro%rama:


class Pesta+arro ! pu"lic static voi# main(Strin $% ar s) ! +arro meu+arro; meu+arro G new +arro(); meu+arro.cor G "5er#e"; meu+arro.mo#elo G "8usca"; meu+arro.veloci#a#eJtual G -; meu+arro.veloci#a#eMaAima G <-; (( li a o carro meu+arro.li a(); (( acelera o carro meu+arro.acelera(7-); System.out.println(meu+arro.veloci#a#eJtual);

& &

0osso carro po$e conter tamb)m um Motor:


class Motor ! int potencia;

Strin &

tipo;

class +arro ! Strin cor; Strin mo#elo; #ou"le veloci#a#eJtual; #ou"le veloci#a#eMaAima; Motor motor; (( .. &

2o$emos# criar $iversos Carros e me er com seus atributos e m)to$os# assim como fizemos no e emplo $o Sanco.

6.11 - )m pouco mais...


1. @uan$o $eclaramos uma classe# um m)to$o ou um atributo# po$emos $ar o nome que quisermos# se%uin$o uma re%ra. 2or e emplo# o nome $e um m)to$o n(o po$e come,ar com um n6mero. 2esquise sobre essas re%ras. =. Como voc! po$e ter repara$o# sempre $amos nomes <s vari&veis com letras min6sculas. L que e istem conven:es de c*di#o# $a$as pela 1racle# para facilitar a le%ibili$a$e $o c+$i%o entre pro%rama$ores. /ssa conven,(o ) muito seguida. Feia sobre ela pesquisan$o por "java code conventions". R. L necess&rio usar a palavra chave this quan$o for acessar um atributoC 2ara que# ent(o# utiliz&-laC K. 1 e erccio a se%uir pe$ir& para mo$elar um "funcion&rio". / iste um pa$r(o para representar suas classes em $ia%ramas# que ) amplamente utiliza$o# chama$o )0N. 2esquise sobre ele. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

6.12 - =!erc"ciosF Orientao a Objetos


1 mo$elo $e funcion&rios a se%uir ser& utiliza$o para os e erccios $e al%uns $os posteriores captulos. 1 objetivo aqui ) criar um sistema para %erenciar os funcion&rios $o Sanco. 1s e erccios $esse captulo s(o e tremamente importantes. 1. "o$ele um funcion&rio. /le $eve ter o nome $o funcion&rio# o $epartamento on$e trabalha# seu sal&rio 9#ou"le:# a $ata $e entra$a no banco 9Strin : e seu E7 9Strin :. 4oc! $eve criar al%uns m)to$os $e acor$o com sua necessi$a$e. 5l)m $eles# crie um m)to$o rece"eJumento que aumenta o salario $o funcion&rio $e acor$o com o par[metro

passa$o como ar%umento. Crie tamb)m um m)to$o calcula\anhoJnual# que n(o recebe par[metro al%um# $evolven$o o valor $o sal&rio multiplica$o por 1=.. 5 i$eia aqui ) apenas mo$elar# isto )# s+ i$entifique que informa,-es s(o importantes e o que um funcion&rio faz. 3esenhe no papel tu$o o que um 8uncionario tem e tu$o que ele faz. =. Hransforme o mo$elo acima em uma classe .ava. Heste-a# usan$o uma outra classe que tenha o main. 4oc! $eve criar a classe $o funcion&rio com o nome 8uncionario# mas po$e nomear como quiser a classe $e testes. 5 $e teste $eve possuir o m)to$o main. 8m esbo,o $a classe:
class 8uncionario ! #ou"le salario; (( seus outros atri"utos e mTto#os voi# rece"eJumento(#ou"le aumento) ! (( o )ue faMer a)ui #entro] & #ou"le calcula\anhoJnual() ! (( o )ue faMer a)ui #entro] &

&

4oc! po$e 9e $eve: compilar seu arquivo java sem que voc! ain$a tenha termina$o sua classe 8uncionario. 'sso evitar& que voc! receba $ezenas $e erros $e compila,(o $e uma vez s+. Crie a classe 8uncionario# coloque seus atributos e# antes $e colocar qualquer m)to$o# compile o arquivo java. 1 arquivo 8uncionario.class ser& %era$o# mas n(o po$emos "e ecut&-lo" j& que essa classe n(o tem um main. 3e qualquer forma# a vanta%em ) que assim verificamos que nossa classe 8uncionario j& est& toman$o forma e est& escrita em sinta e correta.

/sse ) um processo incremental. 2rocure $esenvolver assim seus e erccios# para n(o $escobrir s+ no fim $o caminho que al%o estava muito erra$o. 8m esbo,o $a classe que possui o main:
class Pesta8uncionario ! pu"lic static voi# main(Strin $% ar s) ! 8uncionario f/ G new 8uncionario(); f/.nome G "^u o"; f/.salario G /--; f/.rece"eJumento(;-); System.out.println("salario atual," L f/.salario); System.out.println(" anho anual," L f/.calcula\anhoJnual()); & &

'ncremente essa classe. ;a,a outros testes# imprima outros atributos e invoque os m)to$os que voc! criou a mais. Fembre-se $e se%uir a conven,(o java# isso ) importantssimo. 'sto )# preste aten,(o nas

mai6sculas e min6sculas# se%uin$o o se%uinte e emplo: nomeEeJtri"uto# nomeEeMeto#o# nomeEe5ariavel# DomeEe+lasse# etc... &odas as classes no mesmo arquivo? 4oc! at) po$e colocar to$as as classes no mesmo arquivo e apenas compilar esse arquivo. /le vai %erar um .class para ca$a classe presente nele. 2or)m# por uma quest(o $e or%aniza,(o# ) boa pr&tica criar um arquivo .'ava para ca$a classe. /m captulos posteriores# veremos tamb)m $etermina$os casos nos quais voc! ser& obri#ado a $eclarar ca$a classe em um arquivo separa$o. /ssa separa,(o n(o ) importante nesse momento $o apren$iza$o# mas se quiser ir pratican$o sem ter que compilar classe por classe# voc! po$e $izer para o 'avac compilar to$os os arquivos java $e uma vez:
'avac H.'ava

R. Crie um m)to$o mostra()# que n(o recebe nem $evolve par[metro al%um e simplesmente imprime to$os os atributos $o nosso funcion&rio. 3essa maneira# voc! n(o precisa ficar copian$o e colan$o um monte $e System.out.println() para ca$a mu$an,a e teste que fizer com ca$a um $e seus funcion&rios# voc! simplesmente vai fazer:
8uncionario f/ G new 8uncionario(); (( "rinca#eiras com f/.... f/.mostra();

4eremos mais a frente o m)to$o toStrin # que ) uma solu,(o muito mais ele%ante para mostrar a representa,(o $e um objeto como Strin # al)m $e n(o jo%ar tu$o pro System.out 9s+ se voc! $esejar:. 1 esqueleto $o m)to$o ficaria assim:
class 8uncionario ! (( seus outros atri"utos e mTto#os voi# mostra() ! System.out.println("Dome, " L this.nome); (( imprimir a)ui os outros atri"utos... (( tam"Tm po#e imprimir this.calcula\anhoJnual() & &

K. Construa $ois funcion&rios com o new e compare-os com o GG. / se eles tiverem os mesmos atributosC 2ara isso voc! vai precisar criar outra refer!ncia:
8uncionario f/ G new 8uncionario(); f/.nome G "Eanilo"; f/.salario G /--; 8uncionario f7 G new 8uncionario(); f7.nome G "Eanilo"; f7.salario G /--; if (f/ GG f7) ! System.out.println("i uais"); & else ! System.out.println("#iferentes"); &

J. Crie $uas refer!ncias para o mesmo funcion&rio# compare-os com o GG. Hire suas conclus-es. 2ara criar $uas refer!ncias pro mesmo funcion&rio:
8uncionario f/ G new 8uncionario(), f/.nome G "^u o"; f/.salario G /--; 8uncionario f7 G f/;

1 que acontece com o if $o e erccio anteriorC Q. 9opcional: /m vez $e utilizar uma Strin para representar a $ata# crie uma outra classe# chama$a Eata. /la possui R campos int# para $ia# m!s e ano. ;a,a com que seu funcion&rio passe a us&-la. 9) pareci$o com o 6ltimo e emplo# em que a +onta passou a ter refer!ncia para um +liente:.
class 8uncionario ! Eata #ataEeCntra#a; (( )ual T o valor #efault a)ui] (( seus outros atri"utos e mTto#os & class int int int & Eata ! #ia; mes; ano;

"o$ifique sua classe Pesta8uncionario para que voc! crie uma Eata e atribua ela ao 8uncionario:
8uncionario f/ G new 8uncionario(); ((... Eata #ata G new Eata(); (( li ao! f/.#ataEeCntra#a G #ata;

;a,a o $esenho $o esta$o $a mem+ria quan$o criarmos um 8uncionario. N. 9opcional: "o$ifique seu m)to$o mostra para que ele imprima o valor $a #ataEeCntra#a $aquele 8uncionario:
class 8uncionario ! (( seus outros atri"utos e mTto#os Eata #ataEeCntra#a; voi# mostra() ! System.out.println("Dome, " L this.nome); (( imprimir a)ui os outros atri"utos... System.out.println("Eia, " L this.#ataEeCntra#a.#ia); System.out.println("MXs, " L this.#ataEeCntra#a.mes); System.out.println("Jno, " L this.#ataEeCntra#a.ano); & &

Heste-o. 1 que acontece se chamarmos o m)to$o mostra antes $e atribuirmos uma $ata para este 8uncionarioC Y. 9opcional: 1 que acontece se voc! tentar acessar um atributo $iretamente na classeC Como# por e emplo:
8uncionario.salario G /7:6;

/sse c+$i%o faz senti$oC / este:


8uncionario.calcula\anhoJtual();

;az senti$o per%untar para o esquema $o ;uncionario seu valor anualC A. 9opcional-avan,a$o: Crie um m)to$o na classe Eata que $evolva o valor formata$o $a $ata# isto )# $evolva uma *trin% com "$ia/mes/ano". 'sso para que o m)to$o mostra $a classe 8uncionario possa ficar assim:
class 8uncionario ! (( atri"utos e meto#os voi# mostra() ! (( imprime outros atri"utos... System.out.println("Eata #e entra#a, " L this.#ataEeCntra#a.formata#a()); & &

6.1% - >esa-ios
1. 8m m)to$o po$e chamar ele mesmo. Chamamos isso $e recurso. 4oc! po$e resolver a s)rie $e ;ibonacci usan$o um m)to$o que chama ele mesmo. 1 objetivo ) voc! criar uma classe# que possa ser usa$a $a se%uinte maneira:
8i"onacci fi"onacci G new 8i"onacci(); for (int i G /; i 3G N; iLL) ! int resulta#o G fi"onacci.calcula8i"onacci(i); System.out.println(resulta#o); &

5qui imprimir& a sequ!ncia $e ;ibonacci at) a se ta posi,(o# isto ): 1# 1# =# R# J# Y. /ste m)to$o calcula8i"onacci n(o po$e ter nenhum la,o# s+ po$e chamar ele mesmo como m)to$o. 2ense nele como uma fun,(o# que usa a pr+pria fun,(o para calcular o resulta$o. =. 2or que o mo$o acima ) e tremamente mais lento para calcular a s)rie $o que o mo$o iterativo 9que se usa um la,o:C R. /screva o m)to$o recursivo novamente# usan$o apenas uma linha. 2ara isso# pesquise sobre o operador condicional tern1rio. 9ternarD operator:

6.16 - /i!ando o con$ecimento


1 objetivo $os e erccios a se%uir ) fi ar o conceito $e classes e objetos# m)to$os e atributos. 3a$a a estrutura $e uma classe# basta tra$uzi-la para a lin%ua%em .ava e fazer uso $e um objeto $a mesma em um pro%rama simples. *e voc! est& com $ificul$a$e em al%uma parte $esse captulo# aproveite e treine tu$o o que vimos nos pequenos pro%ramas abai o: 1. 2ro%rama 1
+lasse, Pessoa Jtri"utos, nomeF i#a#e. MTto#o, voi# faMJniversario()

Crie uma pessoa# coloque seu nome e i$a$e iniciais# fa,a al%uns anivers&rios 9aumentan$o a

i$a$e: e imprima seu nome e sua i$a$e. =. 2ro%rama =


+lasse, Porta Jtri"utos, a"ertaF corF #imensao>F #imensao_F #imensao` MTto#os, voi# a"re() voi# fecha() voi# pinta(Strin s) "oolean estaJ"erta()

Crie uma porta# abra e feche a mesma# pinte-a $e $iversas cores# altere suas $imens-es e use o m)to$o estaJ"erta para verificar se ela est& aberta. R. 2ro%rama R
+lasse, +asa Jtri"utos, corF porta/F porta7F porta: MTto#o, voi# pinta(Strin s)F int )uantasPortasCstaoJ"ertas()

Crie uma casa e pinte-a. Crie tr!s portas e coloque-as na casa? abra e feche as mesmas como $esejar. 8tilize o m)to$o )uantasPortasCstaoJ"ertas para imprimir o n6mero $e portas abertas. Captulo J

)m pouco de arra2s
"1 homem esquecer& antes a morte $o pai que a per$a $a proprie$a$e" 5o t)rmino $esse captulo# voc! ser& capaz $e: $eclarar e instanciar arraDs? popular e percorrer arraDs.

9.1 - O problema
3entro $e um bloco# po$emos $eclarar $iversas vari&veis e us&-las:
int int int int i#a#e/; i#a#e7; i#a#e:; i#a#e6;

'sso po$e se tornar um problema quan$o precisamos mu$ar a quanti$a$e $e vari&veis a serem $eclara$as $e acor$o com um par[metro. /sse par[metro po$e variar# como por e emplo# a quanti$a$e $e n6mero conti$os num bilhete $e loteria. 8m jo%o simples possui Q n6meros# mas po$emos comprar um bilhete mais caro# com N n6meros ou mais. 2ara facilitar esse tipo $e caso po$emos $eclarar um vetor Harra2I $e inteiros:
int$% i#a#es;

1 int$% ) um tipo. 8ma arraD ) sempre um objeto# portanto# a vari&vel i$a$es ) uma refer!ncia. 4amos precisar criar um objeto para po$er usar a arraD. Como criamos o objeto-arraDC
i#a#es G new int$/-%;

1 que fizemos foi criar uma arraD $e int $e 1B posi,-es e atribuir o en$ere,o no qual ela foi cria$a. 2o$emos ain$a acessar as posi,-es $o arraD:

i#a#es$;% G /-;

1 c+$i%o acima altera a se ta posi,(o $o arraD. 0o .ava# os n$ices $o arraD v(o $e B a n-1# on$e n ) o tamanho $a$o no momento em que voc! criou o arraD. *e voc! tentar acessar uma posi,(o fora $esse alcance# um erro ocorrer& $urante a e ecu,(o.

Arra2s - um problema no aprendi.ado de muitas lin#ua#ens 5pren$er a usar arraDs po$e ser um problema em qualquer lin%ua%em. 'sso porque envolve uma s)rie $e conceitos# sinta e e outros. 0o .ava# muitas vezes utilizamos outros recursos em vez $e arraDs# em especial os pacotes $e cole,-es $o .ava# que veremos no captulo 11. 2ortanto# fique tranquilo caso n(o consi%a $i%erir to$a sinta e $as arraDs num primeiro momento. 0o caso $o bilhete $e loteria# po$emos utilizar o mesmo recurso. "ais ain$a# a quanti$a$e $e n6meros $o nosso bilhete po$e ser $efini$o por uma vari&vel. Consi$ere que n in$ica quantos n6meros nosso bilhete ter&# po$emos ent(o fazer:
int numerosEoSilhete$% G new int$n%;

/ assim po$emos acessar e mo$ificar os inteiros com n$ice $e - a n*/.

9.2 - Arra2s de re-er,ncias


L comum ouvirmos "arraD $e objetos". 2or)m quan$o criamos uma arraD $e al%uma classe# ela possui refer!ncias. 1 objeto# como sempre# est& na mem+ria principal e# na sua arraD# s+ ficam %uar$a$as as re-er,ncias 9en$ere,os:.
+onta$% minhas+ontas; minhas+ontas G new +onta$/-%;

@uantas contas foram cria$as aquiC 0a ver$a$e# nen$uma. ;oram cria$os 1B espa,os que voc! po$e utilizar para %uar$ar uma refer!ncia a uma Conta. 2or enquanto# eles se referenciam para lu%ar nenhum 9null:. *e voc! tentar:
System.out.println(minhas+ontas$-%.sal#o);

8m erro $urante a e ecu,(o ocorrer&O 2ois# na primeira posi,(o $a arraD# n(o h& uma refer!ncia para uma conta# nem para lu%ar nenhum. 4oc! $eve popular sua arraD antes.
+onta contaDova G new +onta(); contaDova.sal#o G /---.-; minhas+ontas$-% G contaDova;

1u voc! po$e fazer isso $iretamente:


minhas+ontas$/% G new +onta(); minhas+ontas$/%.sal#o G :7--.-;

8ma arraD $e tipos primitivos %uar$a valores# uma arraD $e objetos %uar$a refer!ncias.

Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

9.% - Eercorrendo uma arra2


2ercorrer uma arraD ) muito simples quan$o fomos n+s que a criamos:
pu"lic static voi# main(Strin ar s$%) ! int$% i#a#es G new int$/-%; for (int i G -; i 3 /-; iLL) ! i#a#es$i% G i H /-; & for (int i G -; i 3 /-; iLL) ! System.out.println(i#a#es$i%); & &

2or)m# em muitos casos# recebemos uma arraD como ar%umento em um m)to$o:


voi# imprimeJrray(int$% array) ! (( no compila!! for (int i G -; i 3 ]]]]; iLL) ! System.out.println(array$i%); & &

5t) on$e o for $eve irC Ho$a arraD em .ava tem um atributo que se chama len th# e voc! po$e acess&-lo para saber o tamanho $o arraD ao qual voc! est& se referencian$o naquele momento:
voi# imprimeJrray(int$% array) ! for (int i G -; i 3 array.len th; iLL) ! System.out.println(array$i%); & &

Arra2s no podem mudar de taman$o 5 partir $o momento que uma arraD foi cria$a# ela no pode mu$ar $e tamanho. *e voc! precisar $e mais espa,o# ser& necess&rio criar uma nova arraD e# antes $e se referir ela# copie os elementos $a arraD velha.

9.6 - Eercorrendo uma arra2 no Java 9.D


1 .ava J.B traz uma nova sinta e para percorremos arraDs 9e cole,-es# que veremos mais a frente:. 0o caso $e voc! n(o ter necessi$a$e $e manter uma vari&vel com o n$ice que in$ica a posi,(o $o elemento no vetor 9que ) uma %ran$e parte $os casos:# po$emos usar o en$anced--or.
class Jl uma+lasse! pu"lic static voi# main(Strin ar s$%) !

int$% i#a#es G new int$/-%; for (int i G -; i 3 /-; iLL) ! i#a#es$i% G i H /-; & (( imprimin#o to#a a array for (int A , i#a#es) ! System.out.println(A); & & &

0(o precisamos mais $o len th para percorrer matrizes cujo tamanho n(o conhecemos:
class Jl uma+lasse ! voi# imprimeJrray(int$% array) ! for (int A , array) ! System.out.println(A); & & &

1 mesmo ) v&li$o para arraDs $e refer!ncias. /sse for na$a mais ) que um truque $e compila,(o para facilitar essa tarefa $e percorrer arraDs e torn&-la mais le%vel.

9.9 - =!erc"ciosF Arra2s


1. 4olte ao nosso sistema $e ;uncionario e crie uma classe Cmpresa $entro $o mesmo arquivo .'ava. 5 Cmpresa tem um nome# cnpj e uma refer!ncia a uma arraD $e 8uncionario# al)m $e outros atributos que voc! jul%ar necess&rio.
class Cmpresa ! (( outros atri"utos 8uncionario$% empre a#os; Strin cnp'; &

=. 5 Cmpresa $eve ter um m)to$o a#iciona# que recebe uma refer!ncia a 8uncionario como ar%umento e %uar$a esse funcion&rio. 5l%o como:
voi# a#iciona(8uncionario f) ! (( al o tipo, (( this.empre a#os$ ]]] % G f; (( mas )ue posio colocar] &

4oc! $eve inserir o 8uncionario em uma posi,(o $a arraD que esteja livre. / istem v&rias maneiras para voc! fazer isso: %uar$ar um conta$or para in$icar qual a pr+ ima posi,(o vazia ou procurar por uma posi,(o vazia to$a vez. 1 que seria mais interessanteC L importante reparar que o m)to$o a$iciona n(o recebe nome# r%# sal&rio# etc. /ssa seria uma maneira nem um pouco estrutura$a# muito menos orienta$a a objetos $e se trabalhar. 4oc! antes cria um 8uncionario e j& passa a refer!ncia $ele# que $entro $o objeto possui r%# sal&rio# etc. R. Crie uma classe PestaCmpresa que possuir& um m)to$o main. 3entro $ele crie al%umas inst[ncias $e 8uncionario e passe para a empresa pelo m)to$o a#iciona. Eepare que antes voc! vai precisar criar a arraD# pois inicialmente o atributo empre a#os $a classe Cmpresa n(o referencia lu%ar nenhum 9seu valor ) null::

Cmpresa empresa G new Cmpresa(); empresa.empre a#os G new 8uncionario$/-%; (( ....

1u voc! po$e construir a arraD $entro $a pr+pria $eclara,(o $a classe Cmpresa# fazen$o com que to$a vez que uma Cmpresa ) instancia$a# a arraD $e 8uncionario que ela necessita tamb)m ) cria$a. Crie al%uns funcion&rios e passe como ar%umento para o a#iciona $a empresa:
8uncionario f/ G new 8uncionario(); f/.salario G /---; empresa.a#iciona(f/); 8uncionario f7 G new 8uncionario(); f7.salario G /Z--; empresa.a#iciona(f7);

4oc! po$e criar esses funcion&rios $entro $e um loop e $ar a ca$a um $eles valores $iferentes $e sal&rios:
for (int i G -; i 3 ;; iLL) ! 8uncionario f G new 8uncionario(); f.salario G /--- L i H /--; empresa.a#iciona(f); &

Eepare que temos $e instanciar 8uncionario $entro $o la,o. *e a instancia,(o $e 8uncionario ficasse acima $o la,o# estaramos a$iciona$o cinco vezes a mesma inst[ncia $e 8uncionario nesta Cmpresa e apenas mu$an$o seu sal&rio a ca$a itera,(o# que nesse caso n(o ) o efeito $eseja$o. 1pcional: o m)to$o a#iciona po$e %erar uma mensa%em $e erro in$ican$o quan$o o arraD j& est& cheio. K. 2ercorra o atributo empre a#os $a sua inst[ncia $a Cmpresa e imprima os sal&rios $e to$os seus funcion&rios. 2ara fazer isso# voc! po$e criar um m)to$o chama$o mostraCmpre a#os $entro $a classe Cmpresa:
voi# mostraCmpre a#os() ! for (int i G -; i 3 this.empre a#os.len th; iLL) ! System.out.println("8uncionIrio na posio, " L i); (( preencher para mostrar outras informacoes #o funcionario & &

Cui$a$o ao preencher esse m)to$o: al%uns n$ices $o seu arraD po$em n(o conter refer!ncia para um 8uncionario constru$o# isto )# ain$a se referirem para null. *e preferir# use o for novo $o java J.B. 5# atrav)s $o seu main# $epois $e a$icionar al%uns funcion&rios# basta fazer:
empresa.mostraCmpre a#os();

J. 9opcional: /m vez $e mostrar apenas o sal&rio $e ca$a funcion&rio# voc! po$e chamar o m)to$o mostra() $e ca$a 8uncionario $a sua arraD. Q. 91pcional: Crie um m)to$o para verificar se um $etermina$o 8uncionario se encontra ou n(o como funcion&rio $esta empresa:
"oolean contem(8uncionario f) !

(( ... &

4oc! vai precisar fazer um for na sua arraD e verificar se a refer!ncia passa$a como ar%umento se encontra $entro $a arraD. /vite ao m& imo usar n6meros har$-co$e$# isto )# use o .len th ou o atributo livre. N. 91pcional: Caso a arraD j& esteja cheia no momento $e a$icionar um outro funcion&rio# criar uma nova maior e copiar os valores. 'sto )# fazer a realoca,(o j& que java n(o tem isso: uma arraD nasce e morre com o mesmo len%th. )sando o t$is para passar ar#umento 3entro $e um m)to$o# voc! po$e usar a palavra this para referenciar a si mesmo e po$e passar essa refer!ncia como ar%umento. J1 con$ece os cursos online Alura?

5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.

9.< - )m pouco mais...


5rraDs po$em ter mais $e uma $imens(o. 'sto )# em vez $e termos uma arraD $e 1B contas# po$emos ter uma arraD $e 1B por 1B contas e voc! po$e acessar a conta na posi,(o $a coluna e linha D. 0a ver$a$e# uma arraD bi$imensional em .ava ) uma arraD $e arraDs. 2esquise sobre isso. 8ma arraD bi$imensional n(o precisa ser retan%ular# isto )# ca$a linha po$e ter um n6mero $iferente $e colunas. ComoC 2orqueC 1 que acontece se criarmos uma arraD $e B elementosC e -1C 1 m)to$o main recebe uma arra2 de trin#s como ar%umento. /ssa arraD ) passa$a pelo usu&rio quan$o ele invoca o pro%rama:
a 'ava Peste ar umento/ outro maisoutro

/ nossa classe:
class Peste ! pu"lic static voi# main (Strin $% ar s) ! for(Strin ar umento, ar s) ! System.out.println(ar umento); & & &

'sso imprimir&:
ar umento/ outro

maisoutro

9.@ - >esa-ios
1. 0o captulo anterior# voc! $eve ter repara$o que a vers(o recursiva para o problema $e ;ibonacci ) lenta porque to$a hora estamos recalculan$o valores. ;a,a com que a vers(o recursiva seja t(o boa quanto a vers(o iterativa. 93ica: use arraDs para isso:

9.A - &estando o con$ecimento


1. 1 objetivo $os e erccios a se%uir ) fi ar os conceitos vistos. *e voc! est& com $ificul$a$e em al%uma parte $esse captulo# aproveite e treine tu$o o que vimos at) a%ora no pequeno pro%rama abai o: 2ro%rama:Classe: Casa 5tributos: cor# total3e2ortas# portas\] ")to$os: voi$ pinta9*trin% s:# int quantas2ortas/stao5bertas9:# voi$ a$iciona2orta92orta p:# int total3e2ortas9: Crie uma casa# pinte-a. Crie tr!s portas e coloque-as na casa atrav)s $o m)to$o a#icionaPorta# abra e feche-as como $esejar. 8tilize o m)to$o )uantasPortasCstaoJ"ertas para imprimir o n6mero $e portas abertas e o m)to$o totalEePortas para imprimir o total $e portas em sua casa. Captulo Q

0odi-icadores de acesso e atributos de classe


"5 marca $o homem imaturo ) que ele quer morrer nobremente por uma causa# enquanto a marca $o homem ma$uro ) querer viver mo$estamente por uma." 5o t)rmino $esse captulo# voc! ser& capaz $e: controlar o acesso aos seus m)to$os# atributos e construtores atrav)s $os mo$ifica$ores private e public? escrever m)to$os $e acesso a atributos $o tipo %etters e setters? escrever construtores para suas classes? utilizar vari&veis e m)to$os est&ticos.

<.1 - Controlando o acesso


8m $os problemas mais simples que temos no nosso sistema $e contas ) que o m)to$o saca permite sacar mesmo que o limite tenha si$o atin%i$o. 5 se%uir voc! po$e lembrar como est& a classe +onta:
class +onta ! int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( .. voi# saca(#ou"le )uanti#a#e) ! this.sal#o G this.sal#o * )uanti#a#e; & &

5 classe a se%uir mostra como ) possvel ultrapassar o limite usan$o o m)to$o saca:
class Pesta+ontaCstouro/ ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); minha+onta.sal#o G /---.-; minha+onta.limite G /---.-; minha+onta.saca(;----); (( sal#o L limite T sR 7---!! & &

2o$emos incluir um if $entro $o nosso m)to$o saca() para evitar a situa,(o que resultaria em uma conta em esta$o inconsistente# com seu sal$o abai o $o limite. ;izemos isso no captulo $e orienta,(o a objetos b&sica. 5pesar $e melhorar bastante# ain$a temos um problema mais %rave: nin%u)m %arante que o usu&rio $a classe vai sempre utilizar o m)to$o para alterar o sal$o $a conta. 1 c+$i%o a se%uir ultrapassa o limite $iretamente:
class Pesta+ontaCstouro7 ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); minha+onta.limite G /--; minha+onta.sal#o G *7--; ((sal#o estI a"aiAo #os /-- #e limite & &

Como evitar issoC 8ma i$eia simples seria testar se n(o estamos ultrapassan$o o limite to$a vez que formos alterar o sal$o:
class Pesta+ontaCstouro: ! pu"lic static voi# main(Strin ar s$%) ! (( a +onta +onta minha+onta G new +onta(); minha+onta.limite G /--; minha+onta.sal#o G /--; (( )uero mu#ar o sal#o para *7-#ou"le novoSal#o G *7--; (( testa se o novoSal#o ultrapassa o limite #a conta if (novoSal#o 3 *minha+onta.limite) ! (( System.out.println("Do posso mu#ar para esse sal#o"); & else ! minha+onta.sal#o G novoSal#o; &

& &

/sse c+$i%o iria se repetir ao lon%o $e to$a nossa aplica,(o e# pior# al%u)m po$e esquecer $e fazer essa compara,(o em al%um momento# $ei an$o a conta na situa,(o inconsistente. 5 melhor forma $e resolver isso seria for,ar quem usa a classe +onta a invocar o m)to$o saca e n(o permitir o acesso $ireto ao atributo. L o mesmo caso $a vali$a,(o $e C2;. 2ara fazer isso no .ava# basta $eclarar que os atributos n(o po$em ser acessa$os $e fora $a classe atrav)s $a palavra chave private:
class +onta ! private #ou"le sal#o; private #ou"le limite;

(( ... &

private ) um modi-icador de acesso 9tamb)m chama$o $e modi-icador de visibilidade:. "arcan$o um atributo como priva$o# fechamos o acesso ao mesmo em rela,(o a to$as as outras classes# fazen$o com que o se%uinte c+$i%o n(o compile:
class PestaJcessoEireto ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); ((no compila! vocX no po#e acessar o atri"uto priva#o #e outra classe minha+onta.sal#o G /---; & & PesteJcessoEireto.'ava,; sal#o has private access in +onta minha+onta.sal#o G /---; B / error

0a orienta,(o a objetos# ) pr&tica quase que obri%at+ria prote%er seus atributos com private. 9$iscutiremos outros mo$ifica$ores $e acesso em outros captulos:. Ca$a classe ) respons&vel por controlar seus atributos# portanto ela $eve jul%ar se aquele novo valor ) v&li$o ou n(oO /sta vali$a,(o n(o $eve ser controla$a por quem est& usan$o a classe e sim por ela mesma# centralizan$o essa responsabili$a$e e facilitan$o futuras mu$an,as no sistema. "uitas outras vezes nem mesmo queremos que outras classes saibam $a e ist!ncia $e $etermina$o atributo# escon$en$o-o por completo# j& que ele $iz respeito ao funcionamento interno $o objeto. Eepare que# quem invoca o m)to$o saca n(o faz a menor i$eia $e que e iste um limite que est& sen$o checa$o. 2ara quem for usar essa classe# basta saber o que o m)to$o faz e n(o como e atamente ele o faz 9o que um m)to$o faz ) sempre mais importante $o que como ele faz: mu$ar a implementa,(o ) f&cil# j& mu$ar a assinatura $e um m)to$o vai %erar problemas:. 5 palavra chave private tamb)m po$e ser usa$a para mo$ificar o acesso a um m)to$o. Hal funcionali$a$e ) utiliza$a em $iversos cen&rios: quan$o e iste um m)to$o que serve apenas para au iliar a pr+pria classe e quan$o h& c+$i%o repeti$o $entro $e $ois m)to$os $a classe s(o os mais comuns. *empre $evemos e pIr o mnimo possvel $e funcionali$a$es# para criar um bai o acoplamento entre as nossas classes. 3a mesma maneira que temos o private# temos o mo$ifica$or pu"lic# que permite a to$os acessarem um $etermina$o atributo ou m)to$o :
class +onta ! ((... pu"lic voi# saca(#ou"le )uanti#a#e) ! ((posso sacar atT sal#oLlimite if ()uanti#a#e 4 this.sal#o L this.limite)! System.out.println("Do posso sacar fora #o limite!"); & else ! this.sal#o G this.sal#o * )uanti#a#e; & & &

= quando no $1 modi-icador de acesso? 5t) a%ora# tnhamos $eclara$o vari&veis e m)to$os sem nenhum mo$ifica$or como private e

pu"lic. @uan$o isto acontece# o seu m)to$o ou atributo fica num esta$o $e visibili$a$e interme$i&rio entre o private e o pu"lic# que veremos mais pra frente# no captulo $e pacotes. L muito comum# e faz to$o senti$o# que seus atributos sejam private e quase to$os seus m)to$os sejam pu"lic 9n(o ) uma re%raO:. 3esta forma# to$a conversa $e um objeto com outro ) feita por troca $e mensa%ens# isto )# acessan$o seus m)to$os. 5l%o muito mais e$uca$o que me er $iretamente em um atributo que n(o ) seuO "elhor ain$aO 1 $ia em que precisarmos mu$ar como ) realiza$o um saque na nossa classe +onta# a$ivinhe on$e precisaramos mo$ificarC 5penas no m)to$o saca# o que faz pleno senti$o. Como e emplo# ima%ine cobrar C2"; $e ca$a saque: basta voc! mo$ificar ali# e nenhum outro c+$i%o# fora a classe +onta# precisar& ser recompila$o. "ais: as classes que usam esse m)to$o nem precisam ficar saben$o $e tal mo$ifica,(oO 4oc! precisa apenas recompilar aquela classe e substituir aquele arquivo .class. 7anhamos muito em escon$er o funcionamento $o nosso m)to$o na hora $e $ar manuten,(o e fazer mo$ifica,-es.

<.2 - =ncapsulamento
1 que come,amos a ver nesse captulo ) a i$eia $e encapsular# isto )# escon$er to$os os membros $e uma classe 9como vimos acima:# al)m $e escon$er como funcionam as rotinas 9no caso m)to$os: $o nosso sistema. /ncapsular ) -undamental para que seu sistema seja suscetvel a mu$an,as: n(o precisaremos mu$ar uma re%ra $e ne%+cio em v&rios lu%ares# mas sim em apenas um 6nico lu%ar# j& que essa re%ra est& encapsulada. 9veja o caso $o m)to$o saca:

1 conjunto $e m)to$os p6blicos $e uma classe ) tamb)m chama$o $e inter-ace da classe# pois esta ) a 6nica maneira a qual voc! se comunica com objetos $essa classe. Ero#ramando voltado para a inter-ace e no para a implementao L sempre bom pro%ramar pensan$o na interface $a sua classe# como seus usu&rios a estar(o utilizan$o# e n(o somente em como ela vai funcionar. 5 implementa,(o em si# o conte6$o $os m)to$os# n(o tem tanta import[ncia para o usu&rio $essa classe# uma vez que ele s+ precisa saber o que ca$a m)to$o preten$e fazer# e n(o como ele faz# pois isto po$e mu$ar com o tempo. /ssa frase vem $o livro 3esi%n 2atterns# $e /ric 7amma et al. 8m livro cultua$o no meio $a orienta,(o a objetos. *empre que vamos acessar um objeto# utilizamos sua interface. / istem $iversas analo%ias f&ceis no mun$o real: @uan$o voc! $iri%e um carro# o que te importa s(o os pe$ais e o volante 9interface: e n(o o motor que voc! est& usan$o 9implementa,(o:. L claro que um motor $iferente po$e te $ar melhores resulta$os# mas o que ele -a. ) o mesmo que um motor menos potente# a $iferen,a est& em como ele -a.. 2ara trocar um carro a &lcool para um a %asolina voc! n(o precisa reapren$er a $iri%irO 9trocar a implementa,(o $os m)to$os n(o precisa mu$ar a interface# fazen$o com que as outras classes continuem usan$o eles $a mesma maneira:. Ho$os os celulares fazem a mesma coisa 9interface:# eles possuem maneiras 9m)to$os: $e $iscar# li%ar# $esli%ar# aten$er# etc. 1 que mu$a ) como eles fazem 9implementa,(o:# mas repare que para o usu&rio comum pouco importa se o celular ) 7*" ou C3"5# isso fica encapsula$o na implementa,(o 9que aqui s(o os circuitos:.

.& temos conhecimentos suficientes para resolver aquele problema $a vali$a,(o $e C2;:
class +liente ! private Strin nome; private Strin en#ereco; private Strin cpf; private int i#a#e; pu"lic voi# mu#a+P8(Strin vali#a+P8(cpf); this.cpf G cpf; & cpf) !

private voi# vali#a+P8(Strin cpf) ! (( sTrie #e re ras a)uiF falha caso no se'a vIli#o & & (( ..

*e al%u)m tentar criar um +liente e n(o usar o mu#a+P8 para alterar um cpf $iretamente# vai receber um erro $e compila,(o# j& que o atributo +P8 ) privado. / o $ia que voc! n(o precisar verificar o C2; $e quem tem mais $e QB anosC *eu m)to$o fica o se%uinte:
pu"lic voi# mu#a+P8(Strin if (this.i#a#e 3G N-) ! vali#a+P8(cpf); & this.cpf G cpf; & cpf) !

1 controle sobre o +P8 est& centraliza$o: nin%u)m conse%ue acess&-lo sem passar por a# a classe +liente ) a 6nica respons&vel pelos seus pr+prios atributosO eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

<.% - (etters e etters


1 mo$ifica$or private faz com que nin%u)m consi%a mo$ificar# nem mesmo ler# o atributo em quest(o. Com isso# temos um problema: como fazer para mostrar o sal#o $e uma +onta# j& que nem mesmo po$emos acess&-lo para leituraC 2recisamos ent(o arranjar uma maneira de fazer esse acesso. *empre que precisamos arrumar uma maneira de -a.er al#uma coisa com um objeto# utilizamos $e m)to$osO 4amos ent(o criar um m)to$o# $i%amos pe aSal#o# para realizar essa simples tarefa:
pu"lic class +onta ! private #ou"le sal#o;

(( outros atri"utos omiti#os private #ou"le pe aSal#o() ! return this.sal#o; & (( #eposita() saca() e transfere() omiti#os &

2ara acessarmos o sal$o $e uma conta# po$emos fazer:


class PestaJcesso+omPe aSal#o ! pu"lic static voi# main(Strin ar s$%) ! +onta minha+onta G new +onta(); minha+onta.#eposita(/---); System.out.println("Sal#o, " L minha+onta.pe aSal#o()); & &

2ara permitir o acesso aos atributos 9j& que eles s(o private: $e uma maneira controla$a# a pr&tica mais comum ) criar $ois m)to$os# um que retorna o valor e outro que mu$a o valor. 5 conven,(o para esses m)to$os ) $e colocar a palavra et ou set antes $o nome $o atributo. 2or e emplo# a nossa conta com sal#o# limite e titular fica assim# no caso $a %ente $esejar $ar acesso a leitura e escrita a to$os os atributos:
pu"lic class +onta ! private #ou"le sal#o; private #ou"le limite; private +liente titular; pu"lic #ou"le etSal#o() ! return this.sal#o; & pu"lic voi# setSal#o(#ou"le sal#o) ! this.sal#o G sal#o; & pu"lic #ou"le et9imite() ! return this.limite; & pu"lic voi# set9imite(#ou"le limite) ! this.limite G limite; & pu"lic +liente etPitular() ! return this.titular; & pu"lic voi# setPitular(+liente titular) ! this.titular G titular; & &

L uma m& pr&tica criar uma classe e# lo%o em se%ui$a# criar %etters e setters para to$os seus atributos. 4oc! s+ $eve criar um %etter ou setter se tiver a real necessi$a$e. Eepare que nesse e emplo setSal#o n(o $everia ter si$o cria$o# j& que queremos que to$os usem #eposita() e saca().

1utro $etalhe importante# um m)to$o et> n(o necessariamente retorna o valor $e um atributo que chama > $o objeto em quest(o. 'sso ) interessante para o encapsulamento. 'ma%ine a situa,(o: queremos que o banco sempre mostre como sal#o o valor $o limite soma$o ao sal$o 9uma pr&tica comum $os bancos que costuma ilu$ir seus clientes:. 2o$eramos sempre chamar c. et9imite() L c. etSal#o()# mas isso po$eria %erar uma situa,(o $e "replace all" quan$o precis&ssemos mu$ar como o sal$o ) mostra$o. 2o$emos encapsular isso em um m)to$o e# porque n(o# $entro $o pr+prio etSal#oC Eepare:
pu"lic class +onta ! private #ou"le sal#o; private #ou"le limite; private +liente titular; pu"lic #ou"le etSal#o() ! return this.sal#o L this.limite; & (( #eposita() saca() e transfere() omiti#os pu"lic +liente etPitular() ! return this.titular; & pu"lic voi# setPitular(+liente titular) ! this.titular G titular; &

&

1 c+$i%o acima nem possibilita a chama$a $o m)to$o et9imite()# ele n(o e iste. / nem $eve e istir enquanto n(o houver essa necessi$a$e. 1 m)to$o etSal#o() n(o $evolve simplesmente o sal#o... e sim o que queremos que seja mostra$o como se fosse o sal#o. 8tilizar %etters e setters n(o s+ aju$a voc! a prote%er seus atributos# como tamb)m possibilita ter $e mu$ar al%o em um s+ lu%ar... chamamos isso $e encapsulamento# pois escon$e a maneira como os objetos %uar$am seus $a$os. L uma pr&tica muito importante. 0ossa classe est& totalmente prontaC 'sto )# e iste a chance $ela ficar com menos $inheiro $o que o limiteC 2o$e parecer que n(o# mas# e se $epositarmos um valor ne%ativo na contaC ;icaramos com menos $inheiro que o permiti$o# j& que n(o esper&vamos por isso. 2ara nos prote%er $isso basta mu$armos o m)to$o #eposita() para que ele verifique se o valor ) necessariamente positivo. 3epois $isso precisaramos mu$ar mais al%um outro c+$i%oC 5 resposta ) n(o# %ra,as ao encapsulamento $os nossos $a$os. Cuidado com os #etters e settersO Como j& $ito# n(o $evemos criar %etters e setters sem um motivo e plicito. 0o blo% $a Caelum h& um arti%o que ilustra bem esses casos: http://blo%.caelum.com.br/=BBQ/BA/1K/nao-apren$er-oo-%etters-e-setters/

<.6 - Construtores
@uan$o usamos a palavra chave new# estamos construin$o um objeto. *empre quan$o o new ) chama$o# ele e ecuta o construtor da classe. 1 construtor $a classe ) um bloco $eclara$o com o mesmo nome que a classe:
class +onta !

int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta() ! System.out.println("+onstruin#o uma conta."); & (( .. &

/nt(o# quan$o fizermos:


+onta c G new +onta();

5 mensa%em "construin$o uma conta" aparecer&. L como uma rotina $e inicializa,(o que ) chama$a sempre que um novo objeto ) cria$o. 8m construtor po$e parecer# mas no um m)to$o. O construtor de-ault 5t) a%ora# as nossas classes n(o possuam nenhum construtor. /nt(o como ) que era possvel $ar new# se to$o new chama um construtor obri#atoriamenteC @uan$o voc! n(o $eclara nenhum construtor na sua classe# o .ava cria um para voc!. /sse construtor ) o construtor de-ault# ele n(o recebe nenhum ar%umento e o corpo $ele ) vazio. 5 partir $o momento que voc! $eclara um construtor# o construtor $efault n(o ) mais forneci$o. 1 interessante ) que um construtor po$e receber um ar%umento# po$en$o assim inicializar al%um tipo $e informa,(o:
class +onta ! int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta(+liente titular) ! this.titular G titular; & & (( ..

/sse construtor recebe o titular $a conta. 5ssim# quan$o criarmos uma conta# ela j& ter& um $etermina$o titular.
+liente carlos G new +liente(); carlos.nome G "+arlos"; +onta c G new +onta(carlos); System.out.println(c.titular.nome);

<.9 - A necessidade de um construtor


Hu$o estava funcionan$o at) a%ora. 2ara que utilizamos um construtorC

5 i$eia ) bem simples. *e to$a conta precisa $e um titular# como obri%ar to$os os objetos que forem cria$os a ter um valor $esse tipoC Basta criar um 6nico construtor que recebe essa *trin%O 1 construtor se resume a issoO 3ar possibili$a$es ou obri%ar o usu&rio $e uma classe a passar ar%umentos para o objeto $urante o processo $e cria,(o $o mesmo. 2or e emplo# n(o po$emos abrir um arquivo para leitura sem $izer qual ) o nome $o arquivo que $esejamos lerO 2ortanto# na$a mais natural que passar uma Strin representan$o o nome $e um arquivo na hora $e criar um objeto $o tipo $e leitura $e arquivo# e que isso seja obri%at+rio. 4oc! po$e ter mais $e um construtor na sua classe e# no momento $o new# o construtor apropria$o ser& escolhi$o. ConstrutorF um mtodo especial? 8m construtor n(o ) um m)to$o. 5l%umas pessoas o chamam $e um m)to$o especial# mas $efinitivamente n(o )# j& que n(o possui retorno e s+ ) chama$o $urante a constru,(o $o objeto. C$amando outro construtor 8m construtor s+ po$e ro$ar $urante a constru,(o $o objeto# isto )# voc! nunca conse%uir& chamar o construtor em um objeto j& constru$o. 2or)m# $urante a constru,(o $e um objeto# voc! po$e fazer com que um construtor chame outro# para n(o ter $e ficar copian$o e colan$o:
class +onta ! int numero; +liente titular; #ou"le sal#o; #ou"le limite; (( construtor +onta (+liente titular) ! (( faM mais uma sTrie #e inicialiMabes e confi urabes this.titular G titular; & +onta (int numeroF +liente titular) ! this(titular); (( chama o construtor )ue foi #eclara#o acima this.numero G numero; & & ((..

/ iste um outro motivo# o outro la$o $os construtores: facili$a$e. Xs vezes# criamos um construtor que recebe $iversos ar%umentos para n(o obri%ar o usu&rio $e uma classe a chamar $iversos m)to$os $o tipo @set@. 0o nosso e emplo $o C2;# po$emos for,ar que a classe +liente receba no mnimo o C2;# $essa maneira um +liente j& ser& constru$o e com um C2; v&li$o. Java Pean @uan$o criamos uma classe com to$os os atributos priva$os# seus %etters e setters e um construtor vazio 9pa$r(o:# na ver$a$e estamos crian$o um .ava Bean 9mas n(o confun$a com /.B# que ) /nterprise .ava Beans:.

A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.

<.< - Atributos de classe


0osso banco tamb)m quer controlar a quanti$a$e $e contas e istentes no sistema. Como po$eramos fazer istoC 5 i$eia mais simples:
+onta c G new +onta(); totalEe+ontas G totalEe+ontas L /;

5qui# voltamos em um problema pareci$o com o $a vali$a,(o $e C2;. /stamos espalhan$o um c+$i%o por to$a aplica,(o# e quem %arante que vamos conse%uir lembrar $e incrementar a vari&vel totalEe+ontas to$a vezC Hentamos ent(o# passar para a se%uinte proposta:
class +onta ! private int totalEe+ontas; ((... +onta() ! this.totalEe+ontas G this.totalEe+ontas L /; & &

@uan$o criarmos $uas contas# qual ser& o valor $o totalEe+ontas $e ca$a uma $elasC 4ai ser 1. 2ois ca$a uma tem essa vari&vel. O atributo de cada objeto. *eria interessante ent(o# que essa vari&vel fosse 'nica# compartilha$a por to$os os objetos $essa classe. 3essa maneira# quan$o mu$asse atrav)s $e um objeto# o outro en er%aria o mesmo valor. 2ara fazer isso em java# $eclaramos a vari&vel como static.
private static int totalEe+ontas;

@uan$o $eclaramos um atributo como static# ele passa a n(o ser mais um atributo $e ca$a objeto# e sim um atributo da classe# a informa,(o fica %uar$a$a pela classe# n(o ) mais in$ivi$ual para ca$a objeto. 2ara acessarmos um atributo est&tico# n(o usamos a palavra chave this# mas sim o nome $a classe:
class +onta ! private static int totalEe+ontas; ((... +onta() ! +onta.totalEe+ontas G +onta.totalEe+ontas L /; &

&

.& que o atributo ) priva$o# como po$emos acessar essa informa,(o a partir $e outra classeC

2recisamos $e um %etter para eleO


class +onta ! private static int totalEe+ontas; ((... +onta() ! +onta.totalEe+ontas G +onta.totalEe+ontas L /; & pu"lic int etPotalEe+ontas() ! return +onta.totalEe+ontas; & &

Como fazemos ent(o para saber quantas contas foram cria$asC


+onta c G new +onta(); int total G c. etPotalEe+ontas();

2recisamos criar uma conta antes $e chamar o m)to$oO 'sso n(o ) le%al# pois %ostaramos $e saber quantas contas e istem sem precisar ter acesso a um objeto conta. 5 i$eia aqui ) a mesma# transformar esse m)to$o que to$o objeto conta tem em um m)to$o $e to$a a classe. 8samos a palavra static $e novo# mu$an$o o m)to$o anterior.
pu"lic static int etPotalEe+ontas() ! return +onta.totalEe+ontas; &

2ara acessar esse novo m)to$o:


int total G +onta. etPotalEe+ontas();

Eepare que estamos chaman$o um m)to$o n(o com uma refer!ncia para uma +onta# e sim usan$o o nome $a classe. 0todos e atributos est1ticos ")to$os e atributos est&ticos s+ po$em acessar outros m)to$os e atributos est&ticos $a mesma classe# o que faz to$o senti$o j& que $entro $e um m)to$o est&tico n(o temos acesso < refer!ncia this# pois um m)to$o est&tico ) chama$o atrav)s $a classe# e n(o $e um objeto. 1 static realmente traz um "cheiro" proce$ural# por)m em muitas vezes ) necess&rio.

<.@ - )m pouco mais...


1. /m al%umas empresas# o 8"F ) amplamente utiliza$o. Xs vezes# o pro%rama$or recebe o 8"F j& pronto# completo# e s+ $eve preencher a implementa,(o# $even$o se%uir < risca o 8"F. 1 que voc! acha $essa pr&ticaC @uais as vanta%ens e $esvanta%ens. =. *e uma classe s+ tem atributos e m)to$os est&ticos# que conclus-es po$emos tirarC 1 que lhe parece um m)to$o est&tico em casos como essesC R. 0o caso $e atributos booleanos# po$e-se usar no lu%ar $o et o sufi o is. 3essa maneira# caso tiv)ssemos um atributo booleano li a#o# em vez $e et9i a#o po$eramos ter is9i a#o.

<.A - =!erc"ciosF =ncapsulamento4 construtores e static


1. 5$icione o mo$ifica$or $e visibili$a$e 9private# se necess&rio: para ca$a atributo e m)to$o $a classe 8uncionario. Hente criar um 8uncionario no main e mo$ificar ou ler um $e seus atributos priva$os. 1 que aconteceC =. Crie os %etters e setters necess&rios $a sua classe 8uncionario. 2or e emplo:
class 8uncionario ! private #ou"le salario; (( ... pu"lic #ou"le etSalario() ! return this.salario; & pu"lic voi# setSalario(#ou"le salario) ! this.salario G salario; & &

0(o copie e coleO 5proveite para praticar sinta e. Fo%o passaremos a usar o /clipse e a sim teremos proce$imentos mais simples para este tipo $e tarefa. Eepare que o m)to$o calcula\anhoJnual parece tamb)m um %etter. 5li&s# seria comum al%u)m nome&-lo $e et\anhoJnual. 7etters n(o precisam apenas retornar atributos. /les po$em trabalhar com esses $a$os. R. "o$ifique suas classes que acessam e mo$ificam atributos $e um 8uncionario para utilizar os %etters e setters rec)m cria$os. 2or e emplo# on$e voc! encontra:
f.salario G /--; System.out.println(f.salario);

passa para:
f.setSalario(/--); System.out.println(f. etSalario());

K. ;a,a com que sua classe 8uncionario possa receber# opcionalmente# o nome $o 8uncionario $urante a cria,(o $o objeto. 8tilize construtores para obter esse resulta$o. 3ica: utilize um construtor sem ar%umentos tamb)m# para o caso $e a pessoa n(o querer passar o nome $o 8uncionario. *eria al%o como:
class 8uncionario ! pu"lic 8uncionario() ! (( construtor sem ar umentos & pu"lic 8uncionario(Strin nome) ! (( construtor )ue rece"e o nome & &

2or que voc! precisa $o construtor sem ar%umentos para que a passa%em $o nome seja opcionalC

J. 9opcional: 5$icione um atributo na classe 8uncionario $e tipo int que se chama i$entifica$or. /sse i$entifica$or $eve ter um valor 6nico para ca$a inst[ncia $o tipo 8uncionario. 1 primeiro 8uncionario instancia$o tem i$entifica$or 1# o se%un$o =# e assim por $iante. 4oc! $eve utilizar os recursos apren$i$os aqui para resolver esse problema. Crie um %etter para o i$entifica$or. 3evemos ter um setterC Q. 9opcional: Crie os %etters e setters $a sua classe Cmpresa e coloque seus atributos como private. Fembre-se $e que n(o necessariamente to$os os atributos $evem ter %etters e setters. 2or e emplo# na classe Cmpresa# seria interessante ter um setter e %etter para a sua arraD $e funcion&riosC 0(o seria mais interessante ter um m)to$o como esteC
class Cmpresa ! (( ... pu"lic 8uncionario et8uncionario (int posicao) ! return this.empre a#os$posicao%; & &

N. 9opcional: 0a classe Cmpresa# em vez $e criar um arraD $e tamanho fi o# receba como par[metro no construtor o tamanho $o arraD $e 8uncionario. Com esse construtor# o que acontece se tentarmos $ar new Cmpresa() sem passar ar%umento al%umC 2or qu!C Y. 9opcional: Como %arantir que $atas como R1/=/=B1= n(o sejam aceitas pela sua classe EataC A. 9opcional: Crie a classe Pessoa8isica. @ueremos ter a %arantia $e que pessoa fsica al%uma tenha C2; invali$o# nem seja cria$a Pessoa8isica sem cpf inicial. 9voc! n(o precisa escrever o al%oritmo $e vali$a,(o $e cpf# basta passar o cpf por um m)to$o vali#a(Strin A)...: +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

<.C - >esa-ios
1. 2orque esse c+$i%o n(o compilaC
class Peste ! int A G :Z; pu"lic static voi# main(Strin System.out.println(A); & & $% ar s) !

=. 'ma%ine que tenha uma classe 8a"ricaEe+arro e quero %arantir que s+ e iste um objeto $esse tipo em to$a a mem+ria. 0(o e iste uma palavra chave especial para isto em .ava# ent(o teremos $e fazer nossa classe $e tal maneira que ela respeite essa nossa necessi$a$e. Como fazer issoC 9pesquise: sin%leton $esi%n pattern: Captulo N

7erana4 reescrita e polimor-ismo


"1 homem absur$o ) aquele que nunca mu$a." 5o t)rmino $esse captulo# voc! ser& capaz $e: $izer o que ) heran,a e quan$o utiliz&-la? reutilizar c+$i%o escrito anteriormente? criar classes filhas e reescrever m)to$os? usar to$o o po$er que o polimorfismo $&.

@.1 - ;epetindo c*di#o?


Como to$a empresa# nosso Banco possui funcion&rios. 4amos mo$elar a classe 8uncionario:
class 8uncionario ! Strin nome; Strin cpf; #ou"le salario; (( mTto#os #evem vir a)ui &

5l)m $e um funcion&rio comum# h& tamb)m outros car%os# como os %erentes. 1s %erentes %uar$am a mesma informa,(o que um funcion&rio comum# mas possuem outras informa,-es# al)m $e ter funcionali$a$es um pouco $iferentes. 8m %erente no nosso banco possui tamb)m uma senha num)rica que permite o acesso ao sistema interno $o banco# al)m $o n6mero $e funcion&rios que ele %erencia:
class \erente ! Strin nome; Strin cpf; #ou"le salario; int senha; int numeroEe8uncionarios\erencia#os; pu"lic "oolean autentica(int senha) ! if (this.senha GG senha) ! System.out.println("Jcesso Permiti#o!"); return true; & else ! System.out.println("Jcesso De a#o!"); return false; & & (( outros mTto#os &

Erecisamos mesmo de outra classe? 2o$eramos ter $ei a$o a classe 8uncionario mais %en)rica# manten$o nela senha $e acesso# e o

n6mero $e funcion&rios %erencia$os. Caso o funcion&rio n(o fosse um %erente# $ei aramos estes atributos vazios. /ssa ) uma possibili$a$e# por)m po$emos come,ar a ter muito atributos opcionais# e a classe ficaria estranha. / em rela,(o aos m)to$osC 5 classe \erente tem o m)to$o autentica# que n(o faz senti$o e istir em um funcion&rio que n(o ) %erente. *e tiv)ssemos um outro tipo $e funcion&rio que tem caractersticas $iferentes $o funcion&rio comum# precisaramos criar uma outra classe e copiar o c+$i%o novamenteO 5l)m $isso# se um $ia precisarmos a$icionar uma nova informa,(o para to$os os funcion&rios# precisaremos passar por to$as as classes $e funcion&rio e a$icionar esse atributo. 1 problema acontece novamente por n(o centralizarmos as informa,-es principais $o funcion&rio em um 6nico lu%arO / iste um jeito# em .ava# $e relacionarmos uma classe $e tal maneira que uma $elas $erda tu$o que a outra tem. 'sto ) uma rela,(o $e classe m(e e classe filha. 0o nosso caso# %ostaramos $e fazer com que o \erente tivesse tu$o que um 8uncionario tem# %ostaramos que ela fosse uma e!tenso $e 8uncionario. ;azemos isto atrav)s $a palavra chave eAten#s.
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic "oolean autentica(int senha) ! if (this.senha GG senha) ! System.out.println("Jcesso Permiti#o!"); return true; & else ! System.out.println("Jcesso De a#o!"); return false; & & & (( setter #a senha omiti#o

/m to$o momento que criarmos um objeto $o tipo \erente# este objeto possuir& tamb)m os atributos $efini$os na classe 8uncionario# pois um \erente um8uncionario:

class Pesta\erente ! pu"lic static voi# main(Strin $% ar s) ! \erente erente G new \erente(); (( po#emos chamar mTto#os #o 8uncionario, erente.setDome("Joo #a Silva"); (( e tam"Tm mTto#os #o \erente! erente.setSenha(67:/); & &

3izemos que a classe \erente$erda to$os os atributos e m)to$os $a classe m(e# no nosso caso# a 8uncionario. 2ara ser mais preciso# ela tamb)m her$a os atributos e m)to$os priva$os# por)m n(o conse%ue acess&-los $iretamente. 2ara acessar um membro priva$o na filha in$iretamente# seria necess&rio que a m(e e pusesse um outro m)to$o visvel que invocasse esse atributo ou m)to$o priva$o.

uper e ub classe 5 nomenclatura mais encontra$a ) que 8uncionario ) a superclasse $e \erente# e \erente ) a subclasse $e 8uncionario. 3izemos tamb)m que to$o \erente um8uncionIrio. 1utra forma ) $izer que 8uncionario ) classe me $e \erente e \erente ) classe -il$a $e 8uncionario. / se precisamos acessar os atributos que her$amosC 0(o %ostaramos $e $ei ar os atributos $e 8uncionario# pu"lic# pois $essa maneira qualquer um po$eria alterar os atributos $os objetos $este tipo. / iste um outro mo$ifica$or $e acesso# o protecte## que fica entre o private e o pu"lic. 8m atributo protecte# s+ po$e ser acessa$o 9visvel: pela pr+pria classe e por suas subclasses 9e mais al%umas outras classes# mas veremos isso em outro captulo:.
class 8uncionario ! protecte# Strin nome; protecte# Strin cpf; protecte# #ou"le salario; (( mTto#os #evem vir a)ui &

empre usar protected? /nt(o porque usar privateC 3epois $e um tempo pro%raman$o orienta$o a objetos# voc! vai come,ar a sentir que nem sempre ) uma boa i$eia $ei ar que a classe filha acesse os atributos $a classe m(e# pois isso quebra um pouco a i$eia $e que s+ aquela classe $everia manipular seus atributos. /ssa ) uma $iscuss(o um pouco mais avan,a$a. 5l)m $isso# n(o s+ as subclasses# mas tamb)m as outras classes# po$em acessar os atributos protecte## que veremos mais a frente 9mesmo pacote:. 4eja outras alternativas ao protecte# no e erccio $e $iscuss(o em sala $e aula juntamente com o instrutor. 3a mesma maneira# po$emos ter uma classe Eiretor que esten$a \erente e a classe Presi#ente po$e esten$er $iretamente $e 8uncionario. ;ique claro que essa ) uma $ecis(o $e ne%+cio. *e 3iretor vai esten$er $e 7erente ou n(o# vai $epen$er se# para voc!# 3iretor um 7erente. 8ma classe po$e ter v&rias filhas# mas po$e ter apenas uma m(e# ) a chama$a heran,a simples $o java.

@.2 - ;eescrita de mtodo


Ho$o fim $e ano# os funcion&rios $o nosso banco recebem uma bonifica,(o. 1s funcion&rios comuns recebem 1BU $o valor $o sal&rio e os %erentes# 1JU. 4amos ver como fica a classe 8uncionario:
class 8uncionario ! protecte# Strin nome; protecte# Strin cpf; protecte# #ou"le salario; pu"lic #ou"le etSonificacao() ! return this.salario H -./-; & (( mTto#os

&

*e $ei armos a classe \erente como ela est&# ela vai her$ar o m)to$o etSonificacao.
\erente erente G new \erente(); erente.setSalario(;---.-); System.out.println( erente. etSonificacao());

1 resulta$o aqui ser& JBB. 0(o queremos essa resposta# pois o %erente $everia ter NJB $e bInus nesse caso. 2ara consertar isso# uma $as op,-es seria criar um novo m)to$o na classe \erente# chama$o# por e emplo# etSonificacaoEo\erente. 1 problema ) que teramos $ois m)to$os em \erente# confun$in$o bastante quem for usar essa classe# al)m $e que ca$a um $a uma resposta $iferente. 0o .ava# quan$o her$amos um m)to$o# po$emos alterar seu comportamento. 2o$emos reescrever 9reescrever# sobrescrever# override: este m)to$o:
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic #ou"le etSonificacao() ! return this.salario H -./;; & (( ...

&

5%ora o m)to$o est& correto para o \erente. Eefa,a o teste e veja que o valor impresso ) o correto 9NJB::
\erente erente G new \erente(); erente.setSalario(;---.-); System.out.println( erente. etSonificacao());

&ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

@.% - 8nvocando o mtodo reescrito


3epois $e reescrito# n(o po$emos mais chamar o m)to$o anti%o que fora her$a$o $a classe m(e: realmente alteramos o seu comportamento. "as po$emos invoc&-lo no caso $e estarmos $entro $a classe. 'ma%ine que para calcular a bonifica,(o $e um \erente $evemos fazer i%ual ao c&lculo $e um 8uncionario porem a$icionan$o E^ 1BBB. 2o$eramos fazer assim:
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic #ou"le etSonificacao() ! return this.salario H -./- L /---; &

(( ... &

5qui teramos um problema: o $ia que o etSonificacao $o 8uncionario mu$ar# precisaremos mu$ar o m)to$o $o \erente para acompanhar a nova bonifica,(o. 2ara evitar isso# o etSonificacao $o \erente po$e chamar o $o 8uncionario utilizan$o a palavra chave super.
class \erente eAten#s 8uncionario ! int senha; int numeroEe8uncionarios\erencia#os; pu"lic #ou"le etSonificacao() ! return super. etSonificacao() L /---; & (( ... &

/ssa invoca,(o vai procurar o m)to$o com o nome etSonificacao $e uma super classe $e \erente. 0o caso ele lo%o vai encontrar esse m)to$o em 8uncionario. /ssa ) uma pr&tica comum# pois muitos casos o m)to$o reescrito %eralmente faz "al%o a mais" que o m)to$o $a classe m(e. Chamar ou n(o o m)to$o $e cima ) uma $ecis(o sua e $epen$e $o seu problema. 5l%umas vezes n(o faz senti$o invocar o m)to$o que reescrevemos.

@.6 - Eolimor-ismo
1 que %uar$a uma vari&vel $o tipo 8uncionarioC 8ma refer!ncia para um 8uncionario# nunca o objeto em si. 0a heran,a# vimos que to$o \erente ) um 8uncionario# pois ) uma e tens(o $este. 2o$emos nos referir a um \erente como sen$o um 8uncionario. *e al%u)m precisa falar com um 8uncionario $o banco# po$e falar com um \erenteO 2orqueC 2ois \erente um8uncionario. /ssa ) a sem[ntica $a heran,a.
\erente erente G new \erente(); 8uncionario funcionario G erente; funcionario.setSalario(;---.-);

2olimorfismo ) a capaci$a$e $e um objeto po$er ser referencia$o $e v&rias formas. 9cui$a$o# polimorfismo n(o quer $izer que o objeto fica se transforman$o# muito pelo contr&rio# um objeto nasce $e um tipo e morre $aquele tipo# o que po$e mu$ar ) a maneira como nos referimos a ele:. 5t) aqui tu$o bem# mas e se eu tentar:
funcionario. etSonificacao();

@ual ) o retorno $esse m)to$oC JBB ou NJBC 0o .ava# a invoca,(o $e m)to$o sempre vai ser decidida em tempo de e!ecuo. 1 .ava vai procurar o objeto na mem+ria e# a sim# $eci$ir qual m)to$o $eve ser chama$o# sempre relacionan$o com sua classe $e ver$a$e# e n(o com a que estamos usan$o para referenci&-lo. 5pesar $e estarmos nos referencian$o a esse \erente como sen$o um 8uncionario# o m)to$o e ecuta$o ) o $o \erente. 1 retorno ) NJB. 2arece estranho criar um %erente e referenci&-lo como apenas um funcion&rio. 2or que faramos issoC 0a ver$a$e# a situa,(o que costuma aparecer ) a que temos um m)to$o que recebe um ar%umento $o tipo 8uncionario:

class +ontroleEeSonificacoes ! private #ou"le totalEeSonificacoes G -; pu"lic voi# re istra(8uncionario funcionario) ! this.totalEeSonificacoes LG funcionario. etSonificacao(); & pu"lic #ou"le etPotalEeSonificacoes() ! return this.totalEeSonificacoes; &

&

/# em al%um lu%ar $a minha aplica,(o 9ou no main# se for apenas para testes::
+ontroleEeSonificacoes controle G new +ontroleEeSonificacoes(); \erente funcionario/ G new \erente(); funcionario/.setSalario(;---.-); controle.re istra(funcionario/); 8uncionario funcionario7 G new 8uncionario(); funcionario7.setSalario(/---.-); controle.re istra(funcionario7); System.out.println(controle. etPotalEeSonificacoes());

Eepare que conse%uimos passar um \erente para um m)to$o que recebe um 8uncionario como ar%umento. 2ense como numa porta na a%!ncia banc&ria com o se%uinte aviso: "2ermiti$a a entra$a apenas $e ;uncion&rios". 8m %erente po$e passar nessa portaC *im# pois \erente um8uncionario. @ual ser& o valor resultanteC 0(o importa que $entro $o m)to$o re%istra $o +ontroleEeSonificacoes receba 8uncionario. @uan$o ele receber um objeto que realmente ) um \erente# o seu m)to$o reescrito ser& invoca$o. Eeafirman$o: no importa como nos re-erenciamos a um objeto4 o mtodo que ser1 invocado sempre o que dele. 0o $ia em que criarmos uma classe Secretaria# por e emplo# que ) filha $e 8uncionario# precisaremos mu$ar a classe $e +ontroleEeSonificacoesC 0(o. Basta a classe Secretaria reescrever os m)to$os que lhe parecerem necess&rios. L e atamente esse o po$er $o polimorfismo# juntamente com a reescrita $e m)to$o: $iminuir o acoplamento entre as classes# para evitar que novos c+$i%os resultem em mo$ifica,-es em in6meros lu%ares. Eepare que quem criou +ontroleEeSonificacoes po$e nunca ter ima%ina$o a cria,(o $a classe Secretaria ou Cn enheiro. Contu$o# n(o ser& necess&rio reimplementar esse controle em ca$a nova classe: reaproveitamos aquele c+$i%o. 7erana versus acoplamento 0ote que o uso $e heran,a aumenta o acoplamento entre as classes# isto )# o quanto uma classe $epen$e $e outra. 5 rela,(o entre classe m(e e filha ) muito forte e isso acaba fazen$o com que o pro%rama$or $as classes filhas tenha que conhecer a implementa,(o $a classe pai e vice-versa - fica $ifcil fazer uma mu$an,a pontual no sistema. 2or e emplo# ima%ine se tivermos que mu$ar al%o na nossa classe 8uncionario# mas n(o quis)ssemos que to$os os funcion&rios sofressem a mesma mu$an,a. 2recisaramos passar por ca$a uma $as filhas $e 8uncionario verifican$o se ela se comporta como $everia ou se $evemos sobrescrever o tal m)to$o mo$ifica$o. /sse ) um problema $a heran,a# e n(o $o polimorfismo# que resolveremos mais tar$e com a aju$a

$e 'nterfaces.

@.9 - )m outro e!emplo


'ma%ine que vamos mo$elar um sistema para a facul$a$e que controle as $espesas com funcion&rios e professores. 0osso funcion&rio fica assim:
class Cmpre a#oEa8acul#a#e ! private Strin nome; private #ou"le salario; #ou"le et\astos() ! return this.salario; & Strin etQnfo() ! return "nome, " L this.nome L " com salIrio " L this.salario; & (( mTto#os #e etF set e outros &

1 %asto que temos com o professor n(o ) apenas seu sal&rio. Hemos $e somar um bInus $e 1B reais por hora/aula. 1 que fazemos ent(oC Eeescrevemos o m)to$o. 5ssim como o et\astos ) $iferente# o etQnfo tamb)m ser&# pois temos $e mostrar as horas/aula tamb)m.
class ProfessorEa8acul#a#e eAten#s Cmpre a#oEa8acul#a#e ! private int horasEeJula; #ou"le et\astos() ! return this. etSalario() L this.horasEeJula H /-; & Strin etQnfo() ! Strin informacaoSasica G super. etQnfo(); Strin informacao G informacaoSasica L " horas #e aula, " L this.horasEeJula; return informacao; & (( mTto#os #e etF set e outros )ue forem necessIrios &

5 novi$a$e# aqui# ) a palavra chave super. 5pesar $o m)to$o ter si$o reescrito# %ostaramos $e acessar o m)to$o $a classe m(e# para n(o ter $e copiar e colocar o conte6$o $esse m)to$o e $epois concatenar com a informa,(o $as horas $e aula. Como tiramos proveito $o polimorfismoC 'ma%ine que temos uma classe $e relat+rio:
class \era#orEe[elatorio ! pu"lic voi# a#iciona(Cmpre a#oEa8acul#a#e f) ! System.out.println(f. etQnfo()); System.out.println(f. et\astos()); & &

2o$emos passar para nossa classe qualquer Cmpre a#oEa8acul#a#eO 4ai funcionar tanto para professor# quanto para funcion&rio comum. 8m certo $ia# muito $epois $e terminar essa classe $e relat+rio# resolvemos aumentar nosso sistema# e colocar uma classe nova# que representa o [eitor. Como ele tamb)m ) um Cmpre a#oEa8acul#a#e# ser& que vamos precisar alterar al%o na nossa classe $e [elatorioC 0(o. /ssa ) a i$eiaO @uem pro%ramou a classe \era#orEe[elatorio nunca ima%inou que e istiria uma classe Eeitor e# mesmo assim# o sistema funciona.
class [eitor eAten#s Cmpre a#oEa8acul#a#e !

(( informabes eAtras Strin etQnfo() ! return super. etQnfo() L " e ele T um reitor"; & (( no so"rescrevemos o et\astos!!! &

Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

@.< - )m pouco mais...


1. *e n(o houvesse heran,a em .ava# como voc! po$eria reaproveitar o c+$i%o $e outra classeC =. 8ma $iscuss(o muito atual ) sobre o abuso no uso $a heran,a. 5l%umas pessoas usam heran,a apenas para reaproveitar o c+$i%o# quan$o po$eriam ter feito uma composio. 2rocure sobre heran,a versus composi,(o. R. "esmo $epois $e reescrever um m)to$o $a classe m(e# a classe filha ain$a po$e acessar o m)to$o anti%o. 'sto ) feito atrav)s $a palavra chave super.mTto#o(). 5l%o pareci$o ocorre entre os construtores $as classes# o queC 0ais sobre o mau uso da $erana 0o blo% $a Caelum e iste um arti%o interessante abor$an$o esse t+pico: http://blo%.caelum.com.br/=BBQ/1B/1K/como-nao-apren$er-orientacao-a-objetos-heranca/ .ames 7oslin%# um $os cria$ores $o .ava# ) um crtico $o mau uso $a heran,a. 0esta entrevista ele $iscute a possibili$a$e $e se utilizar apenas interfaces e composi,(o# eliminan$o a necessi$a$e $a heran,a: http://www.artima.com/intv/%oslin%R2.html

@.@ - =!erc"ciosF 7erana e Eolimor-ismo


1. 4amos criar uma classe +onta# que possua um sal#o os m)to$os para pe%ar sal$o# $epositar e sacar. 1. Crie a classe +onta:
pu"lic class +onta ! &

=. 5$icione o atributo sal#o


pu"lic class +onta ! private #ou"le sal#o; &

R. Crie os m)to$os etSal#o()# #eposita(#ou"le) e saca(#ou"le)

pu"lic class +onta ! private #ou"le sal#o; pu"lic voi# #eposita(#ou"le valor) ! this.sal#o LG valor; & pu"lic voi# saca(#ou"le valor) ! this.sal#o *G valor; & pu"lic #ou"le etSal#o() ! return this.sal#o; &

&

=. 5$icione um m)to$o na classe +onta# que atualiza essa conta $e acor$o com uma ta a percentual forneci$a.
class +onta ! private #ou"le sal#o; (( outros mTto#os a)ui tam"Tm ... voi# atualiMa(#ou"le taAa) ! this.sal#o LG this.sal#o H taAa; & &

R. Crie $uas subclasses $a classe +onta: +onta+orrente e +ontaPoupanca. 5mbas ter(o o m)to$o atualiza reescrito: 5 +onta+orrente $eve atualizar-se com o $obro $a ta a e a +ontaPoupanca $eve atualizar-se com o triplo $a ta a. 5l)m $isso# a +onta+orrente $eve reescrever o m)to$o #eposita# a fim $e retirar uma ta a banc&ria $e $ez centavos $e ca$a $ep+sito. 1. Crie as classes +onta+orrente e +ontaPoupanca. 5mbas s(o filhas $a classe +onta:
pu"lic class +onta+orrente eAten#s +onta ! & pu"lic class +ontaPoupanca eAten#s +onta ! &

=. Eeescreva o m)to$o atualiMa na classe +onta+orrente# se%uin$o o enuncia$o:


pu"lic class +onta+orrente eAten#s +onta ! pu"lic voi# atualiMa(#ou"le taAa) ! this.sal#o LG this.sal#o H taAa H 7; & &

Eepare que# para acessar o atributo sal$o her$a$o $a classe +onta# voc, vai precisar trocar o modi-icador de visibilidade de saldo para protecte# . R. Eeescreva o m)to$o atualiMa na classe +ontaPoupanca# se%uin$o o enuncia$o:
pu"lic class +ontaPoupanca eAten#s +onta ! pu"lic voi# atualiMa(#ou"le taAa) !

this.sal#o LG this.sal#o H taAa H :; & &

K. 0a classe +onta+orrente# reescreva o m)to$o #eposita para $escontar a ta a banc&ria $e $ez centavos:
pu"lic class +onta+orrente eAten#s +onta ! pu"lic voi# atualiMa(#ou"le taAa) ! this.sal#o LG this.sal#o H taAa H 7; & pu"lic voi# #eposita(#ou"le valor) ! this.sal#o LG valor * -./-; & &

K. Crie uma classe com m)to$o main e instancie essas classes# atualize-as e veja o resulta$o. 5l%o como:
pu"lic class Pesta+ontas ! pu"lic static voi# main(Strin $% ar s) ! +onta c G new +onta(); +onta+orrente cc G new +onta+orrente(); +ontaPoupanca cp G new +ontaPoupanca(); c.#eposita(/---); cc.#eposita(/---); cp.#eposita(/---); c.atualiMa(-.-/); cc.atualiMa(-.-/); cp.atualiMa(-.-/); System.out.println(c. etSal#o()); System.out.println(cc. etSal#o()); System.out.println(cp. etSal#o()); & &

5p+s imprimir o sal$o 9 etSal#o(): $e ca$a uma $as contas# o que aconteceC J. 1 que voc! acha $e ro$ar o c+$i%o anterior $a se%uinte maneira:
+onta c G new +onta(); +onta cc G new +onta+orrente(); +onta cp G new +ontaPoupanca();

CompilaC Eo$aC 1 que mu$aC @ual ) a utili$a$e $issoC Eealmente# essa n(o ) a maneira mais 6til $o polimorfismo - veremos o seu real po$er no pr+ imo e erccio. 2or)m e iste uma utili$a$e $e $eclararmos uma vari&vel $e um tipo menos especfico $o que o objeto realmente ). L e!tremamente importante perceber que n(o importa como nos referimos a um objeto# o m)to$o que ser& invoca$o ) sempre o mesmoO 5 .4" vai $escobrir em tempo $e e ecu,(o qual $eve ser invoca$o# $epen$en$o $e que tipo ) aquele objeto# n(o importan$o como nos referimos a ele.

Q. 9opcional: 4amos criar uma classe que seja respons&vel por fazer a atualiza,(o $e to$as as contas banc&rias e %erar um relat+rio com o sal$o anterior e sal$o novo $e ca$a uma $as contas. 5l)m $isso# conforme atualiza as contas# o banco quer saber quanto $o $inheiro $o banco foi atualiza$o at) o momento. 2or isso# precisamos ir %uar$an$o o sal#oPotal e a$icionar um %etter < classe.
pu"lic class JtualiMa#orEe+ontas ! private #ou"le sal#oPotal G -; private #ou"le selic; pu"lic JtualiMa#orEe+ontas(#ou"le selic) ! this.selic G selic; & pu"lic voi# ro#a(+onta c) ! (( a)ui vocX imprime o sal#o anteriorF atualiMa a contaF (( e #epois imprime o sal#o final (( lem"ran#o #e somar o sal#o final ao atri"uto sal#oPotal & & (( outros mTto#osF colocar o etter para sal#oPotal!

N. 9opcional: 0o m)to$o main# vamos criar al%umas contas e ro$&-las:


pu"lic class PestaJtualiMa#orEe+ontas ! pu"lic static voi# main(Strin $% ar s) ! +onta c G new +onta(); +onta cc G new +onta+orrente(); +onta cp G new +ontaPoupanca(); c.#eposita(/---); cc.#eposita(/---); cp.#eposita(/---); JtualiMa#orEe+ontas a#c G new JtualiMa#orEe+ontas(-.-/); a#c.ro#a(c); a#c.ro#a(cc); a#c.ro#a(cp); & & System.out.println("Sal#o Potal, " L a#c. etSal#oPotal());

Y. 91pcional: 8se a palavra chave super nos m)to$os atualiMa reescritos# para n(o ter $e refazer o trabalho. A. 91pcional: *e voc! precisasse criar uma classe +ontaQnvestimento# e seu m)to$o atualiMa fosse complica$ssimo# voc! precisaria alterar a classe JtualiMa#orEe+ontasC 1B.91pcional# Hrabalhoso: Crie uma classe Sanco que possui um arraD $e +onta. Eepare que num arraD $e +onta voc! po$e colocar tanto +onta+orrente quanto +ontaPoupanca. Crie um m)to$o pu"lic voi# a#iciona(+onta c)# um m)to$o pu"lic +onta pe a+onta(int A) e outro pu"lic int pe aPotalEe+ontas()# muito similar a rela,(o anterior $e /mpresa-;uncionario.

;a,a com que seu m)to$o main crie $iversas contas# insira-as no Sanco e $epois# com um for# percorra to$as as contas $o Sanco para pass&-las como ar%umento para o JtualiMa#orEe+ontas.

@.A - >iscuss:es em aulaF Alternativas ao atributo protected


3iscuta com o instrutor e seus cole%as alternativas ao uso $o atributo protecte# na heran,a. 2reciso realmente afrou ar o encapsulamento $o atributo por causa $a heran,aC Como fazer para o atributo continuar private na m(e e as filhas conse%uirem $e al%uma formar trabalhar com eleC Captulo Y

=clipse 8>=
"3&-se import[ncia aos antepassa$os quan$o j& n(o temos nenhum." 0este captulo# voc! ser& apresenta$o ao 5mbiente $e 3esenvolvimento /clipse e suas principais funcionali$a$es.

A.1 - O =clipse
1 /clipse 9http://www.eclipse.or%: ) uma '3/ 9inte%rate$ $evelopment environment:. 3iferente $e uma E53# on$e o objetivo ) $esenvolver o mais r&pi$o possvel atrav)s $o arrastar)e)soltar do mouse# on$e montanhas $e c+$i%o s(o %era$os em bacG%roun$# uma '3/ te au ilia no $esenvolvimento# evitan$o se intrometer e fazer muita m&%ica. 1 /clipse ) a '3/ l$er $e merca$o. ;orma$a por um cons+rcio li$era$o pela 'B"# possui seu c+$i%o livre. 5 6ltima vers(o ) a K.=# mas com qualquer vers(o posterior a $o R.1 voc! ter& suporte ao .ava J# Q e N. 4eremos aqui os principais recursos $o /clipse. 4oc! perceber& que ele evita ao m& imo te atrapalhar e apenas %era trechos $e c+$i%os +bvios# sempre ao seu coman$o. / istem tamb)m centenas $e plu%ins %ratuitos para %erar $ia%ramas 8"F# suporte a servi$ores $e aplica,(o# visualiza$ores $e banco $e $a$os e muitos outros. Bai e o /clipse $o site oficial http://www.eclipse.or%. 5pesar $e ser escrito em .ava# a biblioteca %r&fica usa$a no /clipse# chama$a *PH# usa componentes nativos $o sistema operacional. 2or isso voc! $eve bai ar a vers(o correspon$ente ao seu sistema operacional. 3escompacte o arquivo e pronto# basta ro$ar o e ecut&vel. Outras 8>=s 8ma outra '3/ open source famosa ) o 0etbeans# $a 1racle. 9http://www.netbeans.or%:. 5l)m $essas# 1racle# Borlan$ e a pr+pria 'B" possuem '3/s comerciais e al%umas vers-es mais restritas $e uso livre. 5 empresa .etBrains $esenvolve o 'ntelli. '3/5# uma '3/ pa%a que tem %anho muitos a$eptos.

A.2 - Apresentando o =clipse


Clique no cone $o /clipse no seu 3esGtop. 5 primeira per%unta que ele te faz ) que worGspace voc! vai usar. PorGspace $efine o $iret+rio em que as suas confi%ura,-es pessoais e seus projetos ser(o %rava$os.

4oc! po$e $ei ar o $iret+rio pr)-$efini$o. Fo%o em se%ui$a# uma tela $e Pelcome ser& aberta# on$e voc! tem $iversos linGs para tutoriais e aju$a. Clique em PorGbench. 5 tela $e Pelcome $o /clipse K ) um pouco $iferente# ams possui e atamente os mesmos recursos nos mesmos locais.

+oc, no est1 nessa p1#ina a toa

4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

A.% - +ie5s e Eerspective


;eche a tela $e Pelcome e voc! ver& a tela abai o. 0esta tela# $estacamos as 4iews 9em linha contnua: e as 2erspectives 9em linha pontilha$a: $o /clipse.

"u$e para a perspectiva Eesource# clican$o no cone ao la$o $a perspectiva .ava# selecionan$o 1ther e $epois Eesource. 0este momento# trabalharemos com esta perspectiva# antes $a $e .ava# pois ela possui um conjunto $e 4iews mais simples.

5 4iew 0avi%ator mostra a estrutura $e $iret+rio assim como est& no sistema $e arquivos. 5 4iew 1utline mostra um resumo $as classes# interfaces e enumera,-es $eclara$as no arquivo java atualmente e$ita$o 9serve tamb)m para outros tipos $e arquivos:. 0o menu 3indo5 -Q $o5 +ie5 -Q Ot$er# voc! po$e ver as $ezenas $e 4iews que j& vem embuti$as no /clipse. 5costume-se a sempre procurar novas 4iews# elas po$em te aju$ar em $iversas tarefas.

A.6 - Criando um projeto novo


4& em /ile -Q Be5 -Q Eroject. *eleciona .ava 2roject e clique em 0e t.

Crie um projeto chama$o "anco. 4oc! po$e che%ar nessa mesma tela clican$o com o bot(o $a $ireta no espa,o $a 4iew 0avi%ator e se%uin$o o mesmo menu. 0esta tela# confi%ure seu projeto como na tela abai o:

'sto )# marque "create separate source an$ output fol$ers"# $esta maneira seus arquivos java e arquivos class estar(o em $iret+rios $iferentes# para voc! trabalhar $e uma maneira mais or%aniza$a. Clique em ;inish. 1 /clipse pe$ir& para trocar a perspectiva para .ava? escolha "Bo" para permanecer em Eesource. 0a 4iew *avigator# voc! ver& o novo projeto e suas pastas e arquivos:

4amos iniciar nosso projeto crian$o a classe Conta. 2ara isso# v& em ;ile -Z 0ew -Z 1ther -Z Class. Clique em 0e t e crie a classe se%uin$o a tela abai o:

Clique em ;inish. 1 /clipse possui $iversos wizar$s# mas usaremos o mnimo $eles. 1 interessante ) usar o code assist e quic! "i#es que a ferramenta possui e veremos em se%ui$a. 0(o se atente <s milhares $e op,-es $e ca$a wizar$# a parte mais interessante $o /clipse n(o ) essa. /screva o m)to$o #eposita como abai o e note que o /clipse reclama $e erro em this.sal#o pois este atributo n(o e iste.

4amos usar o recurso $o /clipse $e quicM -i!. Coloque o cursor em cima $o erro e aperte Ctrl V 1.

1 /clipse su%erir& possveis formas $e consertar o erro? uma $elas )# justamente# criar o campo sal#o na classe +onta# que ) nosso objetivo. Clique nesta op,(o.

/ste recurso $e quicG fi es# acessvel pelo CtrlV1# ) uma $as %ran$es facili$a$es $o /clipse e ) e tremamente po$eroso. 5trav)s $ele ) possvel corri%ir boa parte $os erros na hora $e pro%ramar e# como fizemos# economizar a $i%ita,(o $e certos c+$i%os repetitivos. 0o nosso e emplo# n(o precisamos criar o campo antes? o /clipse faz isso para n+s. /le at) acerta a tipa%em# j& que estamos soman$o ele a um $ouble. 1 private ) coloca$o por motivos que j& estu$amos. 4& ao menu ;ile -Z *ave para %ravar. Control V * tem o mesmo efeito.

A.9 - Criando o main


Crie uma nova classe chama$a Principal. 4amos colocar um m)to$o main para testar nossa Conta. /m vez $e $i%itar to$o o m)to$o main# vamos usar o code assist $o /clipse. /screva s+ main e aperte Ctrl V /spa,o lo%o em se%ui$a.

1 /clipse su%erir& a cria,(o $o m)to$o main completo? selecione esta op,(o. 1 control V espa,o )

chama$o $e code assist. 5ssim como os quicG fi es s(o $e e trema import[ncia. / perimente usar o co$e assist em $iversos lu%ares. 3entro $o m)to$o main# comece a $i%itar o se%uinte c+$i%o:
+onta conta G new +onta(); conta.#eposita(/--.-);

1bserve que# na hora $e invocar o m)to$o sobre o objeto conta# o /clipse su%ere os m)to$os possveis. /ste recurso ) bastante 6til# principalmente quan$o estivermos pro%raman$o com classes que n(o s(o as nossas# como $a 52' $o .ava. 1 /clipse aciona este recurso quan$o voc! $i%ita o ponto lo%o ap+s um objeto 9e voc! po$e usar o CtrlV/spa,o para acion&-lo:. 4amos imprimir o sal$o com System.out.println. "as# mesmo nesse c+$i%o# o /clipse nos aju$a. /screva syso e aperte CtrlV/spa,o que o /clipse escrever& *Dstem.out.println9: para voc!. 2ara imprimir# chame o conta. etSal#o():
System.out.println(conta. etSal#o());

0ote que o /clipse acusar& erro em etSal#o() porque este m)to$o n(o e iste na classe +onta. 4amos usar CtrlV1 em cima $o erro para corri%ir o problema:

1 /clipse su%ere criar um m)to$o etSal#o() na classe +onta. *elecione esta op,(o e o m)to$o ser& inseri$o automaticamente.
pu"lic 2"'ect etSal#o() ! (( P2E2 Juto* enerate# metho# stu" return null; &

/le %era um m)to$o n(o e atamente como queramos# pois nem sempre h& como o /clipse ter $e antem(o informa,-es suficientes para que ele acerta a assinatura $o seu m)to$o. "o$ifique o m)to$o etSal#o como se%ue:
pu"lic #ou"le etSal#o() ! return this.sal#o; &

/sses pequenos recursos $o /clipse s(o $e e trema utili$a$e. 3essa maneira# voc! po$e pro%ramar sem se preocupar com m)to$os que ain$a n(o e istem# j& que a qualquer momento ele po$e %erar o esqueleto 9a parte $a assinatura $o m)to$o:. eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

A.< - =!ecutando o main


4amos ro$ar o m)to$o main $essa nossa classe. 0o /clipse# clique com o bot(o $ireito no arquivo Principal.'ava e v& em Eun as... .ava 5pplication.

1 /clipse abrir& uma 4iew chama$a Console on$e ser& apresenta$a a sa$a $o seu pro%rama:

@uan$o voc! precisar ro$ar $e novo# basta clicar no cone ver$e $e plaD na toolbar# que ro$a o pro%rama anterior. 5o la$o $esse cone tem uma setinha on$e s(o lista$os os 1B 6ltimos e ecuta$os.

A.@ - Eequenos truques


1 /clipse possui muitos atalhos 6teis para o pro%rama$or. *em $6vi$a os R mais importantes $e conhecer e $e praticar s(o: Ctrl J 1 5ciona o quicG fi es com su%est-es para corre,(o $e erros. Ctrl J =spao Completa c+$i%os Ctrl J % 5ciona mo$o $e $escoberta $e menu. / perimente $i%itar CtrlJ% e $epois $i%itar ##as e enter. 1u ent(o $e Ctrl J % e $i%ite ne+ class. 4oc! po$e ler muito mais $etalhes sobre esses atalhos no blo% $a Caelum: http://blo%.caelum.com.br/as-tres-principais-teclas-$e-atalho-$o-eclipse/ / istem $ezenas $e outros. 3entre os mais utiliza$os pelos $esenvolve$ores $a Caelum# escolhemos os se%uintes para comentar: Ctrl J /11 ro$a a 6ltima classe que voc! ro$ou. L o mesmo que clicar no cone ver$e que parece um bot(o $e plaD na barra $e ferramentas. Ctrl J E#)p e Ctrl J E#>o5n 0ave%a nas abas abertas. _til quan$o estiver e$itan$o v&rios arquivos ao mesmo tempo. Ctrl J $i-t J / ;ormata o c+$i%o se%un$o as conven,-es $o .ava Ctrl J 0 / pan$e a 4iew atual para a tela to$a 9mesmo efeito $e $ar $ois cliques no ttulo $a 4iew: Ctrl J $i-t J N / ibe to$os os atalhos possveis. Ctrl J O / ibe um outline para r&pi$a nave%a,(o Alt J $i-t J R e depois J Eo$a o main $a classe atual. 2)ssimo para pressionarO "ais f&cil voc! $i%itar ControlJ% e $epois $i%itar ,unO. 5buse $es$e j& $o ControlJ% 4eremos mais no $ecorrer $o curso# em especial quan$o virmos pacotes.

A.A - =!erc"ciosF =clipse


1. 3entro $o projeto "anco# crie as classes +onta+orrente e +ontaPoupanca no nosso projeto $o /clipse. 0a classe +onta# crie os m)to$os atualiMa e saca como no captulo anterior. 3esta vez# tente abusar $o control - espao e control - .. 2or e emplo: pu"l3ctrl espaco4 v3ctrl espaco4 atualiMa(#o3ctrl espao4 taAa)! Eepare que at) mesmo nomes $e vari&veis# ele cria para voc!O 5companhe as $icas $o

instrutor. "uitas vezes# ao criarmos um objeto# nem mesmo $eclaramos a vari&vel:


new +onta+orrente();

4& nessa linha e $! control - .. /le vai su%erir e $eclarar& a vari&vel pra voc!. =. 'ma%ine que queremos criar um setter $o sal$o para a classe +onta. 3entro $a classe +onta# $i%ite: setSa3ctrl L espaco4 1 mesmo vale no caso $e voc! querer reescrever um m)to$o. 3entro $e +onta+orrente fa,a: atua3+ontrolCspaco4 R. 4& na sua classe que tem o main e se%ure o C10HE1F aperta$o enquanto voc! passa o mouse sobre o seu c+$i%o. Eepare que tu$o virou hDperlinG. Clique em um m)to$o que voc! est& invocan$o na classe +onta. 4oc! po$e conse%uir o mesmo efeito# $e abrir o arquivo no qual o m)to$o foi $eclara$o# $e uma maneira ain$a mais pr&tica: sem usar o mouse# quan$o o cursor estiver sobre o que voc! quer analisar# simplesmente clique 8:. K. 3! um clique $a $ireita em um arquivo no navi%ator. /scolha Compare 3it$ -Q Nocal 7istor2. 1 que ) esta telaC

J. 8se o Control - /hi"t - 0 para formatar o seu c+$i%o. 3essa maneira# ele vai arrumar a ba%un,a $e espa,amento e enters $o seu c+$i%o.

Q. 9opcional: Crie no seu projeto a classe JtualiMa#orEe+ontas como no captulo anterior. N. 9opcional: 1 que s(o os arquivos .project e .classpathC Feia o conte6$o $eles. Y. 9opcional: Clique $a $ireita no projeto# proprie$a$es. L uma $as telas mais importantes $o /clipse# on$e voc! po$e confi%urar $iversas informa,-es para o seu projeto# como compila$or# vers-es# formata$or e outros.

Captulo A

Classes Abstratas
"3&-se import[ncia aos antepassa$os quan$o j& n(o temos nenhum." 5o t)rmino $esse captulo# voc! ser& capaz $e utilizar classes abstratas# quan$o necess&rio.

C.1 - ;epetindo mais c*di#o?


0este captulo# aconselhamos que voc! passe a usar o /clipse. 4oc! j& tem conhecimento suficiente $os erros $e compila,(o $o 'avac e a%ora po$e apren$er as facili$a$es que o /clipse te traz ao aju$ar voc! no c+$i%o com os chama$os quicG fi es e quicG assists. 4amos recor$ar em como po$e estar nossa classe 8uncionario:
class 8uncionario ! protecte# Strin nome; protecte# Strin cpf; protecte# #ou"le salario; pu"lic #ou"le etSonificacao() ! return this.salario H /.7; & (( outros mTto#os a)ui &

Consi$ere o nosso +ontroleEeSonificacao:


class +ontroleEeSonificacoes ! private #ou"le totalEeSonificacoes G -; pu"lic voi# re istra(8uncionario f) ! System.out.println("J#icionan#o "onificao #o funcionario, " L f); this.totalEeSonificacoes LG f. etSonificacao(); & pu"lic #ou"le etPotalEeSonificacoes() ! return this.totalEeSonificacoes; & &

0osso m)to$o re istra recebe qualquer refer!ncia $o tipo 8uncionario# isto )# po$em ser objetos $o tipo 8uncionario e qualquer $e seus subtipos: \erente# Eiretor e# eventualmente# al%uma nova subclasse que venha ser escrita# sem pr)vio conhecimento $o autor $a +ontroleEeSonificacao. /stamos utilizan$o aqui a classe 8uncionario para o polimorfismo. *e n(o fosse ela# teramos um %ran$e prejuzo: precisaramos criar um m)to$o re istra para receber ca$a um $os tipos $e 8uncionario# um para \erente# um para Eiretor# etc. Eepare que per$er esse po$er ) muito pior $o que a pequena vanta%em que a heran,a traz em her$ar c+$i%o. 2or)m# em al%uns sistemas# como ) o nosso caso# usamos uma classe com apenas esses intuitos: $e economizar um pouco c+$i%o e %anhar polimorfismo para criar m)to$os mais %en)ricos# que se encai em a $iversos objetos. ;az senti$o ter um objeto $o tipo 8uncionarioC /ssa per%unta ) $iferente $e saber se faz senti$o ter uma refer!ncia $o tipo 8uncionario: nesse caso# faz sim e ) muito 6til. Eeferencian$o 8uncionario temos o polimorfismo $e refer!ncia# j& que po$emos receber qualquer objeto que seja um 8uncionario. 2or)m# $ar new em 8uncionario po$e n(o fazer senti$o# isto )# n(o queremos receber um objeto $o tipo 8uncionario# mas sim que aquela refer!ncia seja ou um \erente# ou um Eiretor# etc. 5l%o mais concreto que um 8uncionario.

+ontroleEeSonificacoes c#" G new +ontroleEeSonificacoes(); 8uncionario f G new 8uncionario(); c#".a#iciona(f); (( faM senti#o]

4ejamos um outro caso em que n(o faz senti$o ter um objeto $aquele tipo# apesar $a classe e istir: ima%ine a classe Pessoa e $uas filhas# Pessoa8isica e PessoaJuri#ica. @uan$o pu amos um relat+rio $e nossos clientes 9uma arraD $e Pessoa por e emplo:# queremos que ca$a um $eles seja ou uma Pessoa8isica# ou uma PessoaJuri#ica. 5 classe Pessoa# nesse caso# estaria sen$o usa$a apenas para %anhar o polimorfismo e her$ar al%umas coisas: n(o faz senti$o permitir instanci&-la. 2ara resolver esses problemas# temos as classes abstratas.

C.2 - Classe abstrata


1 que# e atamente# vem a ser a nossa classe 8uncionarioC 0ossa empresa tem apenas Eiretores# \erentes# SecretIrias# etc. /la ) uma classe que apenas i$ealiza um tipo# $efine apenas um rascunho. 2ara o nosso sistema# ) ina$missvel que um objeto seja apenas $o tipo 8uncionario 9po$e e istir um sistema em que fa,a senti$o ter objetos $o tipo 8uncionario ou apenas Pessoa# mas# no nosso caso# n(o:. 8samos a palavra chave a"stract para impe$ir que ela possa ser instancia$a. /sse ) o efeito $ireto $e se usar o mo$ifica$or a"stract na $eclara,(o $e uma classe:
a"stract class 8uncionario ! protecte# #ou"le salario; pu"lic #ou"le etSonificacao() ! return this.salario H /.7; & (( outros atri"utos e mTto#os comuns a to#os 8uncionarios &

/# no meio $e um c+$i%o:
8uncionario f G new 8uncionario(); (( no compila!!!

1 c+$i%o acima n(o compila. 1 problema ) instanciar a classe - criar refer!ncia# voc! po$e. *e ela n(o po$e ser instancia$a# para que serveC *erve para o polimorfismo e heran,a $os atributos e m)to$os# que s(o recursos muito po$erosos# como j& vimos. 4amos ent(o her$ar $essa classe# reescreven$o o m)to$o etSonificacao:
class \erente eAten#s 8uncionario ! pu"lic #ou"le etSonificacao() ! return this.salario H /.6 L /---; & &

"as qual ) a real vanta%em $e uma classe abstrataC 2o$eramos ter feito isto com uma heran,a comum. 2or enquanto# a 6nica $iferen,a ) que n(o po$emos instanciar um objeto $o tipo 8uncionario# que j& ) $e %ran$e valia# $an$o mais consist!ncia ao sistema. ;ique claro que a nossa $ecis(o $e transformar 8uncionario em uma classe abstrata $epen$eu $o nosso $omnio. 2o$e ser que# em um sistema com classes similares# fa,a senti$o que uma classe an&lo%a a 8uncionario seja concreta. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

C.% - 0todos abstratos


*e o m)to$o etSonificacao n(o fosse reescrito# ele seria her$a$o $a classe m(e# fazen$o com que $evolvesse o sal&rio mais =BU. Fevan$o em consi$era,(o que ca$a funcion&rio em nosso sistema tem uma re%ra totalmente $iferente para ser bonifica$o# faz al%um senti$o ter esse m)to$o na classe 8uncionarioC *er& que e iste uma bonifica,(o pa$r(o para to$o tipo $e 8uncionarioC 2arece que n(o# ca$a classe filha ter& um m)to$o $iferente $e bonifica,(o pois# $e acor$o com nosso sistema# n(o e iste uma re%ra %eral: queremos que ca$a pessoa que escreve a classe $e um 8uncionario $iferente 9subclasses $e 8uncionario: reescreva o m)to$o etSonificacao $e acor$o com as suas re%ras. 2o$eramos# ent(o# jo%ar fora esse m)to$o $a classe 8uncionarioC 1 problema ) que# se ele n(o e istisse# n(o po$eramos chamar o m)to$o apenas com uma refer!ncia a um 8uncionario# pois nin%u)m %arante que essa refer!ncia aponta para um objeto que possui esse m)to$o. *er& que ent(o $evemos retornar um c+$i%o# como um n6mero ne%ativoC 'sso n(o resolve o problema: se esquecermos $e reescrever esse m)to$o# teremos $a$os erra$os sen$o utiliza$os como bInus. / iste um recurso em .ava que# em uma classe abstrata# po$emos escrever que $etermina$o m)to$o ser& sempre escrito pelas classes filhas. 'sto )# um mtodo abstrato. /le in$ica que to$as as classes filhas 9concretas# isto )# que n(o forem abstratas: $evem reescrever esse m)to$o ou n(o compilar(o. L como se voc! her$asse a responsabili$a$e $e ter aquele m)to$o. Como declarar um mtodo abstrato Xs vezes# n(o fica claro como $eclarar um m)to$o abstrato. Basta escrever a palavra chave a"stract na assinatura $o mesmo e colocar um ponto e vr%ula em vez $e abre e fecha chavesO
a"stract class 8uncionario ! a"stract #ou"le etSonificacao();

(( outros atri"utos e mTto#os &

Eepare que n(o colocamos o corpo $o m)to$o e usamos a palavra chave a"stract para $efinir o mesmo. 2or que n(o colocar corpo al%umC 2orque esse m)to$o nunca vai ser chama$o# sempre que al%u)m chamar o m)to$o etSonificacao# vai cair em uma $as suas filhas# que realmente escreveram o m)to$o. @ualquer classe que esten$er a classe 8uncionario ser& obri%a$a a reescrever este m)to$o# tornan$o-o "concreto". *e n(o reescreverem esse m)to$o# um erro $e compila,(o ocorrer&. 1 m)to$o $o +ontroleEeSonificacao estava assim:
pu"lic voi# re istra(8uncionario f) ! System.out.println("J#icionan#o "onificao #o funcionario, " L f); this.totalEeSonificacoes LG f. etSonificacao(); &

Como posso acessar o m)to$o etSonificacao se ele n(o e iste na classe 8uncionarioC .& que o m)to$o ) abstrato# com certe.a suas subclasses t!m esse m)to$o# o que %arante que essa invoca,(o $e m)to$o n(o vai falhar. Basta pensar que uma refer!ncia $o tipo 8uncionario nunca aponta para um objeto que n(o tem o m)to$o etSonificacao# pois n(o ) possvel instanciar uma classe abstrata# apenas as concretas. 8m m)to$o abstrato obri%a a classe em que ele se encontra ser abstrata# o que %arante a coer!ncia $o c+$i%o acima compilar.

C.6 - Aumentando o e!emplo


/ se# no nosso e emplo $e empresa# tiv)ssemos o se%uinte $ia%rama $e classes com os se%uintes m)to$os:

1u seja# tenho a classe abstrata 8uncionario# com o m)to$o abstrato etSonificacao? as classes \erente e Presi#ente esten$en$o 8uncionario e implementan$o o m)to$o etSonificacao? e# por fim# a classe Eiretor# que esten$e \erente# mas n(o implementa o m)to$o etSonificacao. /ssas classes v(o compilarC 4(o ro$arC 5 resposta ) sim. /# al)m $e tu$o# far(o e atamente o que n+s queremos# pois# quan$o \erente e Presi#ente possuem os m)to$os perfeitamente implementa$os# a classe Eiretor# que n(o possui o m)to$o implementa$o# vai usar a implementa,(o her$a$a $e \erente.

/ esse $ia%rama# no qual inclumos uma classe abstrata Secretaria sem o m)to$o etSonificacao# que ) esten$i$a por mais $uas classes 9SecretariaJ#ministrativa# SecretariaJ encia: que# por sua vez# implementam o m)to$o etSonificacao# vai compilarC 4ai ro$arC 3e novo# a resposta ) sim# pois Secretaria ) uma classe abstrata e# por isso# o .ava tem certeza $e que nin%u)m vai conse%uir instanci&-la e# muito menos# chamar o m)to$o etSonificacao $ela. Fembran$o que# nesse caso# n(o precisamos nem ao menos escrever o m)to$o abstrato etSonificacao na classe Secretaria.

*e eu n(o reescrever um m)to$o abstrato $a minha classe m(e# o c+$i%o n(o compilar&. "as posso# em vez $isso# $eclarar a classe como abstrataO java.io Classes abstratas n(o possuem nenhum se%re$o no apren$iza$o# mas quem est& apren$en$o orienta,(o a objetos po$e ter uma enorme $ificul$a$e para saber quan$o utiliz&-las# o que ) muito normal. /stu$aremos o pacote java.io# que usa bastantes classes abstratas# sen$o um e emplo real $e uso $esse recurso# que vai melhorar o enten$imento $elas. 9classe 'nput*tream e suas filhas:

C.9 - Eara saber mais...


8ma classe que esten$e uma classe normal tamb)m po$e ser abstrataO /la n(o po$er& ser instancia$a# mas sua classe pai simO 8ma classe abstrata n(o precisa necessariamente ter um m)to$o abstrato. &ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

C.< - =!erc"ciosF Classes Abstratas


1. Eepare que a nossa classe +onta ) uma e celente can$i$ata para uma classe abstrata. 2or qu!C @ue m)to$os seriam interessantes can$i$atos a serem abstratosC Hransforme a classe +onta em abstrata# repare o que acontece no seu main j& e istente $o Pesta+ontas.
pu"lic a"stract class +onta ! (( ... &

=. 2ara que o c+$i%o $o main volte a compilar# troque o new +onta() por new +onta+orrente(). *e n(o po$emos $ar new em +onta# qual ) a utili$a$e $e ter um m)to$o que recebe uma refer!ncia a +onta como ar%umentoC 5li&s# posso ter issoC R. 5penas para enten$er melhor o a"stract# comente o m)to$o atualiMa() $a +ontaPoupanca# $essa forma ele her$ar& o m)to$o $iretamente $e +onta. Hransforme o m)to$o atualiMa() $a classe +onta em abstrato. Eepare que# ao colocar a palavra chave a"stract ao la$o $o m)to$o# o /clipse rapi$amente vai su%erir que voc! $eve remover o corpo 9bo$D: $o m)to$o com um quicG fi :

*ua classe +onta $eve ficar pareci$a com:

pu"lic a"stract class +onta ! (( atri"utos e mTto#os )ue 'I eAistiam & pu"lic a"stract voi# atualiMa(#ou"le taAaSelic);

@ual ) o problema com a classe +ontaPoupancaC K. Eeescreva o m)to$o atualiMa() na classe +ontaPoupanca para que a classe possa compilar normalmente. 1 eclipse tamb)m su%ere isso como um quicG fi :

J. 9opcional: / iste outra maneira $e a classe +onta+orrente compilar se voc! n(o reescrever o m)to$o abstratoC Q. 9opcional: 2ra que ter o m)to$o atualiMa na classe +onta se ele n(o faz na$aC 1 que acontece se simplesmente apa%armos esse m)to$o $a classe +onta e $ei armos o m)to$o atualiMa nas filhasC N. 9opcional: 2osso chamar um m)to$o abstrato $e $entro $e um outro m)to$o $a pr+pria classe abstrataC 8m e emplo: o mostra $o 8uncionario po$e invocar this. etSonificacao()C

C.@ - >esa-ios
1. 0(o po$emos $ar new em +onta# mas por que# ent(o# po$emos $ar new em +onta$/-%# por e emploC Captulo 1B

8nter-aces
"8ma ima%em vale mil palavras. 8ma interface vale mil ima%ens." 5o t)rmino $esse captulo# voc! ser& capaz $e: $izer o que ) uma interface e as $iferen,as entre heran,a e implementa,(o? escrever uma interface em .ava? utiliz&-las como um po$eroso recurso para $iminuir acoplamento entre as classes.

1D.1 - Aumentando nosso e!emplo


'ma%ine que um *istema $e Controle $o Banco po$e ser acessa$o# al)m $e pelos 7erentes# pelos 3iretores $o Banco. /nt(o# teramos uma classe Eiretor:
class Eiretor eAten#s 8uncionario ! pu"lic "oolean autentica(int senha) ! (( verifica a)ui se a senha confere com a rece"i#a como parametro & &

/ a classe \erente:
class \erente eAten#s 8uncionario !

pu"lic "oolean autentica(int senha) ! (( verifica a)ui se a senha confere com a rece"i#a como parametro (( no caso #o erente verifica tam"Tm se o #epartamento #ele (( tem acesso & &

Eepare que o m)to$o $e autentica,(o $e ca$a tipo $e 8uncionario po$e variar muito. "as vamos aos problemas. Consi$ere o SistemaQnterno e seu controle: precisamos receber um Eiretor ou \erente como ar%umento# verificar se ele se autentica e coloc&-lo $entro $o sistema.
class SistemaQnterno ! voi# lo in(8uncionario funcionario) ! (( invocar o mTto#o autentica] (( no #a! Dem to#o 8uncionario tem & &

1 SistemaQnterno aceita qualquer tipo $e 8uncionario# ten$o ele acesso ao sistema ou n(o# mas note que nem to$o 8uncionario possui o m)to$o autentica. 'sso nos impe$e $e chamar esse m)to$o com uma refer!ncia apenas a 8uncionario 9haveria um erro $e compila,(o:. 1 que fazer ent(oC
class SistemaQnterno ! voi# lo in(8uncionario funcionario) ! funcionario.autentica(...); (( no compila & &

8ma possibili$a$e ) criar $ois m)to$os lo in no SistemaQnterno: um para receber Eiretor e outro para receber \erente. .& vimos que essa n(o ) uma boa escolha. 2or qu!C
class SistemaQnterno ! (( #esi n pro"lemItico voi# lo in(Eiretor funcionario) ! funcionario.autentica(...); & (( #esi n pro"lemItico voi# lo in(\erente funcionario) ! funcionario.autentica(...); & &

Ca$a vez que criarmos uma nova classe $e 8uncionario que ) autentic vel# precisaramos a$icionar um novo m)to$o $e lo%in no SistemaQnterno. 0todos com mesmo nome /m .ava# m)to$os po$em ter o mesmo nome $es$e que n(o sejam amb%uos# isto )# que e ista uma maneira $e $istin%uir no momento $a chama$a.

'sso se chama sobrecar#a $e m)to$o. 9Overloadin#. 0(o confun$ir com overridin## que ) um conceito muito mais po$eroso:. 8ma solu,(o mais interessante seria criar uma classe no meio $a &rvore $e heran,a# 8uncionarioJutenticavel:
class 8uncionarioJutenticavel eAten#s 8uncionario ! pu"lic "oolean autentica(int senha) ! (( faM autenticacao pa#ro & (( outros atri"utos e mTto#os &

5s classes Eiretor e \erente passariam a esten$er $e 8uncionarioJutenticavel# e o SistemaQnterno receberia refer!ncias $esse tipo# como a se%uir:
class SistemaQnterno ! voi# lo in(8uncionarioJutenticavel fa) ! int senha G ((pe a senha #e um lu arF ou #e um scanner #e pole ar (( a)ui eu posso chamar o autentica! (( Pois to#o 8uncionarioJutenticavel tem "oolean o0 G fa.autentica(senha); & &

Eepare que 8uncionarioJutenticavel ) uma forte can$i$ata a classe abstrata. "ais ain$a# o m)to$o autentica po$eria ser um m)to$o abstrato. 1 uso $e heran,a resolve esse caso# mas vamos a uma outra situa,(o um pouco mais comple a: precisamos que to$os os clientes tamb)m tenham acesso ao SistemaQnterno. 1 que fazerC 8ma op,(o ) criar outro m)to$o lo in em SistemaQnterno: mas j& $escartamos essa anteriormente. 8ma outra# que ) comum entre os novatos# ) fazer uma heran,a sem senti$o para resolver o problema# por e emplo# fazer +liente eAten#s 8uncionarioJutenticavel. Eealmente# resolve o problema# mas trar& $iversos outros. +liente $efinitivamente no 8uncionarioJutenticavel. *e voc! fizer isso# o +liente ter&# por e emplo# um m)to$o etSonificacao# um atributo salario e outros membros que n(o fazem o menor senti$o para esta classeO 0(o fa,a heran,a quan$o a rela,(o n(o ) estritamente ") um".

Como resolver essa situa,(oC 0ote que conhecer a sinta e $a lin%ua%em n(o ) o suficiente# precisamos estruturar/$esenhar bem a nossa estrutura $e classes.

1D.2 - 8nter-aces
1 que precisamos para resolver nosso problemaC 5rranjar uma forma $e po$er referenciar

Eiretor# \erente e +liente $e uma mesma maneira# isto )# achar um fator comum. *e e istisse uma forma na qual essas classes %arantissem a e ist!ncia $e um $etermina$o m)to$o# atrav)s $e um contrato# resolveramos o problema. Ho$a classe $efine = itens: o que uma classe faz 9as assinaturas $os m)to$os: como uma classe faz essas tarefas 9o corpo $os m)to$os e atributos priva$os: 2o$emos criar um "contrato" que $efine tu$o o que uma classe $eve fazer se quiser ter um $etermina$o status. 'ma%ine:
contrato Jutenticavel, )uem )uiser ser Jutenticavel precisa sa"er faMer, /.autenticar #a#a uma senhaF #evolven#o um "ooleano

@uem quiser# po$e "assinar" esse contrato# sen$o assim obri%a$o a e plicar como ser& feita essa autentica,(o. 5 vanta%em ) que# se um \erente assinar esse contrato# po$emos nos referenciar a um \erente como um Jutenticavel. 2o$emos criar esse contrato em .avaO
interface Jutenticavel ! "oolean autentica(int senha); &

Chama-se interface pois ) a maneira pela qual po$eremos conversar com um Jutenticavel. 'nterface ) a maneira atrav)s $a qual conversamos com um objeto. Femos a interface $a se%uinte maneira: 'quem desejar ser autentic vel precisa saber autenticar dado um inteiro e retornando um booleano'. /la ) um contrato on$e quem assina se responsabiliza por implementar esses m)to$os 9cumprir o contrato:. 8ma interface po$e $efinir uma s)rie $e m)to$os# mas nunca conter implementa,(o $eles. /la s+ e p-e o que o objeto deve -a.er# e n(o como ele -a.# nem o que ele tem. Como ele -a. vai ser $efini$o em uma implementao $essa interface. / o \erente po$e "assinar" o contrato# ou seja# implementar a interface. 0o momento em que ele implementa essa interface# ele precisa escrever os m)to$os pe$i$os pela interface 9muito pareci$o com o efeito $e her$ar m)to$os abstratos# ali&s# m)to$os $e uma interface s(o p6blicos e abstratos# sempre:. 2ara implementar usamos a palavra chave implements na classe:
class \erente eAten#s 8uncionario implements Jutenticavel ! private int senha; (( outros atri"utos e mTto#os pu"lic "oolean autentica(int senha) ! if(this.senha !G senha) ! return false; & (( po#e faMer outras poss?veis verificabesF como sa"er se esse (( #epartamento #o erente tem acesso ao Sistema & return true;

&

1 implements po$e ser li$o $a se%uinte maneira: "5 classe \erente se compromete a ser trata$a como Jutenticavel# sen$o obri%a$a a ter os m)to$os necess&rios# $efini$os neste contrato". 5 partir $e a%ora# po$emos tratar um \erente como sen$o um Jutenticavel. 7anhamos mais polimorfismoO Hemos mais uma forma $e referenciar a um \erente. @uan$o crio uma vari&vel $o tipo Jutenticavel# estou crian$o uma refer!ncia para qualquer objeto $e uma classe que implemente Jutenticavel# $ireta ou in$iretamente:
Jutenticavel a G new \erente(); (( posso a)ui chamar o mTto#o autentica!

0ovamente# a utiliza,(o mais comum seria receber por ar%umento# como no nosso SistemaQnterno:
class SistemaQnterno ! voi# lo in(Jutenticavel a) ! int senha G (( pe a senha #e um lu arF ou #e um scanner #e pole ar "oolean o0 G a.autentica(senha); (( a)ui eu posso chamar o autentica! (( no necessariamente T um 8uncionario! (( Mais ain#aF eu no sei )ue o"'eto a (( referXncia "a" estI apontan#o eAatamente! 8leAi"ili#a#e.

& &

2rontoO / j& po$emos passar qualquer Jutenticavel para o SistemaQnterno. /nt(o precisamos fazer com que o Eiretor tamb)m implemente essa interface.
class Eiretor eAten#s 8uncionario implements Jutenticavel ! (( mTto#os e atri"utosF alTm #e o"ri atoriamente ter o autentica &

2o$emos passar um Eiretor. 0o $ia em que tivermos mais um funcion&rio com acesso ao sistema# basta que ele implemente essa interface# para se encai ar no sistema. @ualquer Jutenticavel passa$o para o SistemaQnterno est& bom para n+s. Eepare que pouco importa quem o objeto referencia$o realmente )# pois ele tem um m)to$o autentica que ) o necess&rio para nosso SistemaQnterno funcionar corretamente. 5li&s# qualquer outra classe que futuramente implemente essa interface po$er& ser passa$a como ar%umento aqui.
Jutenticavel #iretor G new Eiretor(); Jutenticavel erente G new \erente();

1u# se achamos que o 8ornece#or precisa ter acesso# basta que ele implemente Jutenticavel. 1lhe s+ o tamanho $o $esacoplamento: quem escreveu o SistemaQnterno s+ precisa saber que ele ) Jutenticavel.

class SistemaQnterno ! voi# lo in(Jutenticavel a) ! (( no importa se ele T um erente ou #iretor (( serI )ue T um fornece#or] (( CuF o pro rama#or #o SistemaQnternoF no me preocupo (( Qnvocarei o mTto#o autentica & &

0(o faz $iferen,a se ) um Eiretor# \erente# +liente ou qualquer classe que venha por a. Basta se%uir o contratoO "ais ain$a# ca$a Jutenticavel po$e se autenticar $e uma maneira completamente $iferente $e outro. Fembre-se: a interface $efine que to$os v(o saber se autenticar 9o que ele faz:# enquanto a implementa,(o $efine como e atamente vai ser feito 9como ele faz:. 5 maneira como os objetos se comunicam num sistema orienta$o a objetos ) muito mais importante $o que como eles e ecutam. O que um objeto -a. ) mais importante $o que como ele -a.. 5queles que se%uem essa re%ra# ter(o sistemas mais f&ceis $e manter e mo$ificar. Como voc! j& percebeu# esta ) uma $as i$eias principais que queremos passar e# provavelmente# a mais importante $e to$o esse curso. 7erana entre inter-aces 3iferentemente $as classes# uma interface po$e her$ar $e mais $e uma interface. L como um contrato que $epen$e que outros contratos sejam fecha$os antes $este valer. 4oc! n(o her$a m)to$os e atributos# mas sim responsabili$a$es. Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

1D.% - >i-iculdade no aprendi.ado de inter-aces


'nterfaces representam uma barreira no apren$iza$o $o .ava: parece que estamos escreven$o um c+$i%o que n(o serve pra na$a# j& que teremos essa linha 9a assinatura $o m)to$o: escrita nas nossas classes implementa$oras. /ssa ) uma maneira erra$a $e se pensar. 1 objetivo $o uso $e uma interface ) $ei ar seu c+$i%o mais fle vel e possibilitar a mu$an,a $e implementa,(o sem maiores traumas. Bo apenas um c*di#o de prototipao4 um cabeal$oO 1s mais ra$icais $izem que to$a classe $eve ser "interfacea$a"# isto )# s+ $evemos nos referir a objetos atrav)s $e suas interfaces. *e $etermina$a classe n(o tem uma interface# ela $everia ter. 1s autores $este material acham tal me$i$a ra$ical $emais# por)m o uso $e interfaces em vez $e heran,a ) amplamente aconselha$o. 4oc! po$e encontrar mais informa,-es sobre o assunto nos livros 1esign $atterns# ,e"actoring e 2""ective Java. 0o livro 3esi%n 2atterns# lo%o no incio# os autores citam = re%ras "$e ouro". 8ma ) "evite heran,a#

prefira composi,(o" e a outra# "pro%rame volta$o a interface e n(o < implementa,(o". 4eremos o uso $e interfaces no captulo $e cole,-es# o que melhora o enten$imento $o assunto. 1 e emplo $a interface +ompara"le tamb)m ) muito esclarece$or# on$e en er%amos o reaproveitamento $e c+$i%o atrav)s $as interfaces# al)m $o encapsulamento. 2ara o m)to$o +ollections.sort()# pouco importa quem vai ser passa$o como ar%umento. 2ara ele# basta que a cole,(o seja $e objetos compar&veis. /le po$e or$enar Clefante# +oneAao ou +onta+orrente# $es$e que implementem +ompara"le.

1D.6 - =!emplo interessanteF cone!:es com o banco de dados


Como fazer com que to$as as chama$as para bancos $e $a$os $iferentes respeitem a mesma re%raC 8san$o interfacesO 'ma%ine uma interface +oneAao conten$o to$os os m)to$os necess&rios para a comunica,(o e troca $e $a$os com um banco $e $a$os. Ca$a banco $e $a$os fica encarre%a$o $e criar a sua implementa,(o para essa interface. @uem for usar uma +oneAao n(o precisa se importar com qual objeto e atamente est& trabalhan$o# j& que ele vai cumprir o papel que to$a +oneAao $eve ter. 0(o importa se ) uma cone (o com um 1racle ou "D*@F.

5pesar $o 'ava.s)l.+onnection n(o trabalhar bem assim# a i$eia ) muito similar# por)m as cone -es v!m $e uma "actor3 chama$a EriverMana er. Cone (o a banco $e $a$os est& fora $o escopo $esse treinamento# mas ) um $os primeiros t+picos abor$a$os no curso ;.-=1# juntamente com 351. )m pouco mais... 2osso substituir to$a minha heran,a por interfacesC @ual ) a vanta%em e a $esvanta%emC

1D.9 - =!erc"ciosF 8nter-aces


1. 5 sinta e $o uso $e interfaces po$e parecer muito estranha# < primeira vista. 4amos come,ar com um e erccio para praticar a sinta e. Crie um projeto interfaces e crie a interface Jrea+alculavel:
interface Jrea+alculavel ! #ou"le calculaJrea(); &

@ueremos criar al%umas classes que s(o Jrea+alculavel:


class Kua#ra#o implements Jrea+alculavel ! private int la#o; pu"lic Kua#ra#o(int la#o) ! this.la#o G la#o; & pu"lic #ou"le calculaJrea() ! return this.la#o H this.la#o; & &

class [etan ulo implements Jrea+alculavel ! private int lar ura; private int altura; pu"lic [etan ulo(int lar uraF int altura) ! this.lar ura G lar ura; this.altura G altura; & pu"lic #ou"le calculaJrea() ! return this.lar ura H this.altura; &

&

Eepare que# aqui# se voc! tivesse usa$o heran,a# n(o iria %anhar muito# j& que ca$a implementa,(o ) totalmente $iferente $a outra: um Kua#ra#o# um [etan ulo e um +irculo t!m atributos e m)to$os bem $iferentes. "as# mesmo que eles tivessem atributos em comum# utilizar interfaces ) uma maneira muito mais ele%ante $e mo$elar suas classes. /las tamb)m trazem vanta%ens em n(o acoplar as classes. 8ma vez que heran,a atrav)s $e classes traz muito acoplamento# muitos autores renoma$os $izem que# na maioria $os casos# $erana quebra o encapsulamento# pensamento com o qual a equipe $a Caelum concor$a plenamente. Crie a se%uinte classe $e Peste. Eepare no polimorfismo. 2o$eramos passar esses objetos como ar%umento para al%u)m que aceitasse Jrea+alculavel como ar%umento:
class Peste ! pu"lic static voi# main(Strin $% ar s) ! Jrea+alculavel a G new [etan ulo(:F7); System.out.println(a.calculaJrea()); & &

1pcionalmente# crie a classe +irculo:


class +irculo implements Jrea+alculavel ! (( ... atri"utos (raio) e mTto#os (calculaJrea) &

8tilize Math.PQ H raio H raio para calcular a &rea. =. 0osso banco precisa tributar $inheiro $e al%uns bens que nossos clientes possuem. 2ara isso# vamos criar uma interface no nosso projeto banco j& e istente:
interface Pri"utavel ! #ou"le calculaPri"utos(); &

Femos essa interface $a se%uinte maneira: "to$os que quiserem ser tribut vel precisam saber calcular tributos# $evolven$o um $ouble". 5l%uns bens s(o tribut&veis e outros n(o# +ontaPoupanca n(o ) tribut&vel# j& para +onta+orrente voc! precisa pa%ar 1U $a conta e o Se uroEe5i#a tem uma ta a fi a $e K= reais. 5proveite o /clipseO @uan$o voc! escrever implements Pri"utavel na classe +onta+orrente# o quic! "i# $o /clipse vai su%erir que voc! reescreva o m)to$o? escolha essa op,(o e# $epois# preencha o corpo $o m)to$o a$equa$amente:
class +onta+orrente eAten#s +onta implements Pri"utavel !

(( outros atri"utos e mTto#os pu"lic #ou"le calculaPri"utos() ! return this. etSal#o() H -.-/; &

&

Crie a classe Se uroEe5i#a# aproveitan$o novamente $o /clipse# para obter:


class Se uroEe5i#a implements Pri"utavel ! pu"lic #ou"le calculaPri"utos() ! return 67; & &

4amos criar uma classe PestaPri"utavel com um m)to$o main para testar o nosso e emplo:
class PestaPri"utavel ! pu"lic static voi# main(Strin $% ar s) ! +onta+orrente cc G new +onta+orrente(); cc.#eposita(/--); System.out.println(cc.calculaPri"utos()); (( testan#o polimorfismo, Pri"utavel t G cc; System.out.println(t.calculaPri"utos());

& &

Hente chamar o m)to$o etSal#o atrav)s $a refer!ncia t# o que ocorreC 2or qu!C 5 linha em que atribumos cc a um Pri"utavel ) apenas para voc! en er%ar que ) possvel faz!-lo. 0esse nosso caso# isso n(o tem uma utili$a$e. /ssa possibili$a$e ser& 6til para o pr+ imo e erccio. R. 9opcional: Crie um \erencia#orEeQmpostoEe[en#a# que recebe to$os os tribut&veis $e uma pessoa e soma seus valores e inclua nele um m)to$o para $evolver seu total:
class \erencia#orEeQmpostoEe[en#a ! private #ou"le total; voi# a#iciona(Pri"utavel t) ! System.out.println("J#icionan#o tri"utavel, " L t); this.total LG & pu"lic #ou"le etPotal() ! return this.total; & t.calculaPri"utos();

&

Crie um main para instanciar $iversas classes que implementam Pri"utavel e passar como ar%umento para um \erencia#orEeQmpostoEe[en#a. Eepare que voc! n(o po$e passar qualquer tipo $e conta para o m)to$o a$iciona# apenas a que implementa

Pri"utavel. 5l)m $isso# po$e passar o Se uroEe5i#a.


pu"lic class Pesta\erencia#orEeQmpostoEe[en#a ! pu"lic static voi# main(Strin $% ar s) ! \erencia#orEeQmpostoEe[en#a erencia#or G new \erencia#orEeQmpostoEe[en#a(); Se uroEe5i#a sv G new Se uroEe5i#a(); erencia#or.a#iciona(sv); +onta+orrente cc G new +onta+orrente(); cc.#eposita(/---); erencia#or.a#iciona(cc); System.out.println( erencia#or. etPotal()); & &

Eepare que# $e $entro $o \erencia#orEeQmpostoEe[en#a# voc! n(o po$e acessar o m)to$o etSal#o# por e emplo# pois voc! n(o tem a %arantia $e que o Pri"utavel que vai ser passa$o como ar%umento tem esse m)to$o. 5 6nica certeza que voc! tem ) $e que esse objeto tem os m)to$os $eclara$os na interface Pri"utavel. L interessante en er%ar que as interfaces 9como aqui# no caso# Pri"utavel: costumam li%ar classes muito $istintas# unin$o-as por uma caracterstica que elas tem em comum. 0o nosso e emplo# Se uroEe5i#a e +onta+orrente s(o enti$a$es completamente $istintas# por)m ambas possuem a caracterstica $e serem tribut&veis. *e amanh( o %overno come,ar a tributar at) mesmo PlanoEe+apitaliMacao# basta que essa classe implemente a interface Pri"utavelO Eepare no %rau $e $esacoplamento que temos: a classe \erencia#orEeQmpostoEe[en#a nem ima%ina que vai trabalhar como PlanoEe+apitaliMacao. 2ara ela# o 6nico fato que importa ) que o objeto respeite o contrato $e um tribut&vel# isso )# a interface Pri"utavel. 0ovamente: pro%rame volta$o < interface# n(o < implementa,(o. @uais os benefcios $e manter o c+$i%o com bai o acoplamentoC K. 9opcional: 8se o m)to$o printf para imprimir o sal$o com e atamente $uas casas $ecimais:
System.out.printf("2 sal#o T, O.7f"F cc. etSal#o());

J1 con$ece os cursos online Alura?

5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.

1D.< - =!erc"cios avanados opcionais


5ten,(o: caso voc! fa,a esse e erccio# fa,a isso num projeto < parte conta*interface j& que usaremos a +onta como classe em e erccios futuros.

1. 91pcional: Hransforme a classe +onta em uma interface.


pu"lic interface +onta ! pu"lic #ou"le etSal#o(); pu"lic voi# #eposita(#ou"le valor); pu"lic voi# saca(#ou"le valor); pu"lic voi# atualiMa(#ou"le taAaSelic); &

5$apte +onta+orrente e +ontaPoupanca para essa mo$ifica,(o:


class +onta+orrente implements +onta ! (( ... & class +ontaPoupanca implements +onta ! (( ... &

5l%um c+$i%o vai ter $e ser copia$o e cola$oC 'sso ) t(o ruimC =. 91pcional: Xs vezes# ) interessante criarmos uma interface que her$a $e outras interfaces: essas# s(o chama$as subinterfaces. /ssas# na$a mais s(o $o que um a%rupamento $e obri%a,-es para a classe que a implementar.
interface +ontaPri"utavel eAten#s +ontaF Pri"utavel ! &

3essa maneira# quem for implementar essa nova interface precisa implementar to$os os m)to$os her$a$os $as suas superinterfaces 9e talvez ain$a novos m)to$os $eclara$os $entro $ela::
class +onta+orrente implements +ontaPri"utavel ! (( mTto#os & +onta c G new +onta+orrente(); Pri"utavel t G new +onta+orrente();

Eepare que o c+$i%o po$e parecer estranho# pois a interface n(o $eclara m)to$o al%um# s+ her$a os m)to$os abstratos $eclara$os nas outras interfaces. 5o mesmo tempo que uma interface po$e her$ar $e mais $e uma outra interface# classes s+ po$em possuir uma classe m(e 9heran,a simples:.

1D.@ - >iscussoF -avorea composio em relao S $erana


3iscuta com o instrutor e seus cole%as# alternativas < heran,a. ;alaremos $e heran,a versus composi,(o e porqu! a heran,a ) muitas vezes consi$era$a mal)fica. 0uma entrevista# .ames 7oslin%# "pai $o java"# fala sobre uma lin%ua%em puramente $e $ele%a,(o e che%a a $izer: ,ather than subclassing& just use pure inter"aces4 It5s not so much that class inheritance is particularl3 bad4 It just has problems4 9Hra$u,(o livre: '2m ve6 de "a6er subclasses& use simplesmente inter"aces4 *o que a herana de classes seja particularmente ruim4 2la s7 tem problemas4': http://www.artima.com/intv/%oslin%R2.html

0o blo% $a Caelum h& tamb)m um post sobre o assunto: http://blo%.caelum.com.br/=BBQ/1B/1K/como-nao-apren$er-orientacao-a-objetos-heranca/ Captulo 11

=!ce:es e controle de erros


"@uem pensa pouco# erra muito" 5o t)rmino $esse captulo# voc! ser& capaz $e: controlar erros e tomar $ecis-es basea$as nos mesmos? criar novos tipos $e erros para melhorar o tratamento $eles em sua aplica,(o ou biblioteca? asse%urar que um m)to$o funcionou como $iz em seu "contrato".

11.1 - 0otivao
4oltan$o <s +ontas que criamos no captulo Q# o que aconteceria ao tentar chamar o m)to$o saca com um valor fora $o limiteC 1 sistema mostraria uma mensa%em $e erro# mas quem chamou o m)to$o saca n(o saber& que isso aconteceu. Como avisar aquele que chamou o m)to$o $e que ele n(o conse%uiu fazer aquilo que $everiaC /m .ava# os m)to$os $izem qual o contrato que eles $evem se%uir. *e# ao tentar sacar# ele n(o conse%ue fazer o que $everia# ele precisa# ao menos# avisar ao usu&rio que o saque n(o foi feito. 4eja no e emplo abai o: estamos for,an$o uma +onta a ter um valor ne%ativo# isto )# estar num esta$o inconsistente $e acor$o com a nossa mo$ela%em.
+onta minha+onta G new +onta(); minha+onta.#eposita(/--); minha+onta.set9imite(/--); minha+onta.saca(/---); (( o sal#o T *Y--] c /--] c -] J chama#a ao mTto#o saca funcionou]

/m sistemas $e ver$a$e# ) muito comum que quem saiba tratar o erro ) aquele que chamou o m)to$o e n(o a pr+pria classeO 2ortanto# na$a mais natural $o que a classe sinalizar que um erro ocorreu. 5 solu,(o mais simples utiliza$a anti%amente ) a $e marcar o retorno $e um m)to$o como "oolean e retornar true# se tu$o ocorreu $a maneira planeja$a# ou false# caso contr&rio:
"oolean saca(#ou"le )uanti#a#e) ! (( posso sacar atT sal#oLlimite if ()uanti#a#e 4 this.sal#o L this.limite) ! System.out.println("Do posso sacar fora #o limite!"); return false; & else ! this.sal#o G this.sal#o * )uanti#a#e; return true; & &

8m novo e emplo $e chama$a ao m)to$o acima:


+onta minha+onta G new +onta(); minha+onta.#eposita(/--); minha+onta.set9imite(/--); if (!minha+onta.saca(/---)) ! System.out.println("Do sa)uei");

&

Eepare que tivemos $e lembrar $e testar o retorno $o m)to$o# mas n(o somos obri%a$os a fazer isso. /squecer $e testar o retorno $esse m)to$o teria consequ!ncias $r&sticas: a m&quina $e autoaten$imento po$eria vir a liberar a quantia $eseja$a $e $inheiro# mesmo que o sistema n(o tivesse conse%ui$o efetuar o m)to$o saca com sucesso# como no e emplo a se%uir:
+onta minha+onta G new +onta(); minha+onta.#eposita(/--); (( ... #ou"le valor G ;---; minha+onta.saca(valor); (( vai retornar falseF mas nin uTm verifica! caiAaCletronico.emite(valor);

"esmo invocan$o o m)to$o e tratan$o o retorno $e maneira correta# o que faramos se fosse necess&rio sinalizar quan$o o usu&rio passou um valor ne%ativo como quantidadeC 8ma solu,(o seria alterar o retorno $e "oolean para int e retornar o c+$i%o $o erro que ocorreu. 'sso ) consi$era$o uma m& pr&tica 9conheci$a tamb)m como uso $e "magic numbers":. 5l)m $e voc! per$er o retorno $o m)to$o# o valor $evolvi$o ) "m&%ico" e s+ le%vel perante e tensa $ocumenta,(o# al)m $e n(o obri%ar o pro%rama$or a tratar esse retorno e# no caso $e esquecer isso# seu pro%rama continuar& ro$an$o j& num esta$o inconsistente. Eepare o que aconteceria se fosse necess&rio retornar um outro valor. 1 e emplo abai o mostra um caso on$e# atrav)s $o retorno# n(o ser& possvel $escobrir se ocorreu um erro ou n(o# pois o m)to$o retorna um cliente.
pu"lic +liente procura+liente(int i#) ! if (i#Qnvali#o) ! (( avisa o mTto#o )ue chamou este )ue ocorreu um erro & else ! +liente cliente G new +liente(); cliente.setQ#(i#); (( cliente.setDome("nome #o cliente"); return cliente; & &

2or esses e outros motivos# utilizamos um c+$i%o $iferente em .ava para tratar aquilo que chamamos $e e ce,-es: os casos on$e acontece al%o que# normalmente# n(o iria acontecer. 1 e emplo $o ar%umento $o saque inv&li$o ou $o i# inv&li$o $e um cliente ) uma e!ceo < re%ra. =!ceo 8ma e ce,(o representa uma situa,(o que normalmente n(o ocorre e representa al%o $e estranho ou inespera$o no sistema.

11.2 - =!erc"cio para comear com os conceitos


5ntes $e resolvermos o nosso problema# vamos ver como a .ava 4irtual "achine a%e ao se $eparar com situa,-es inespera$as# como $ivis(o por zero ou acesso a um n$ice $a arraD que n(o e iste. 1. 2ara apren$ermos os conceitos b&sicos $as e ceptions $o .ava# teste o se%uinte c+$i%o voc! mesmo:
class PesteCrro ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("inicio #o main");

&

meto#o/(); System.out.println("fim #o main");

static voi# meto#o/() ! System.out.println("inicio #o meto#o/"); meto#o7(); System.out.println("fim #o meto#o/"); & static voi# meto#o7() ! System.out.println("inicio #o meto#o7"); int$% array G new int$/-%; for (int i G -; i 3G /;; iLL) ! array$i% G i; System.out.println(i); & System.out.println("fim #o meto#o7"); & &

Eepare o m)to$o main chaman$o meto#o/ e esse# por sua vez# chaman$o o meto#o7. Ca$a um $esses m)to$os po$e ter suas pr+prias vari&veis locais# isto ): o meto#o/ n(o en er%a as vari&veis $eclara$as $entro $o main e por a em $iante. Como o .ava 9e muitas $as outras lin%ua%ens: faz issoC Ho$a invoca,(o $e m)to$o ) empilha$a em uma estrutura $e $a$os que isola a &rea $e mem+ria $e ca$a um. @uan$o um m)to$o termina 9retorna:# ele volta para o m)to$o que o invocou. /le $escobre isso atrav)s $a pil$a de e!ecuo 9stac!:: basta remover o marca$or que est& no topo $a pilha:

2or)m# o nosso meto#o7 proposita$amente possui um enorme problema: est& acessan$o um n$ice $e arraD in$evi$o para esse caso? o n$ice estar& fora $os limites $a arraD quan$o che%ar em /-O Eo$e o c+$i%o. @ual ) a sa$aC 1 que isso representaC 1 que ela in$icaC

/ssa ) o conheci$o rastro da pil$a 9stac!trace:. L uma sa$a importantssima para o pro%rama$or - tanto que# em qualquer f+rum ou lista $e $iscuss(o# ) comum os pro%rama$ores enviarem# juntamente com a $escri,(o $o problema# essa stacGtrace. "as por que isso aconteceuC 1 sistema $e e ce,-es $o .ava funciona $a se%uinte maneira: quan$o uma e ce,(o ) lanada 9thro+:# a .4" entra em esta$o $e alerta e vai ver se o m)to$o atual toma al%uma precau,(o ao tentar e ecutar esse trecho $e c+$i%o. Como po$emos ver# o meto#o7 n(o toma nenhuma me$i$a $iferente $o que vimos at) a%ora. Como o meto#o7 n(o est& tratando esse problema# a .4" p&ra a e ecu,(o $ele anormalmente# sem esperar ele terminar# e volta um stac!"rame pra bai o# on$e ser& feita nova verifica,(o: "o meto#o/ est& se precaven$o $e um problema chama$o JrrayQn#eA2ut2fSoun#sCAceptionC" "0(o..." 4olta para o main# on$e tamb)m n(o h& prote,(o# ent(o a .4" morre 9na ver$a$e# quem morre ) apenas a Phrea# corrente# veremos mais para frente:. 1bviamente# aqui estamos for,an$o esse caso e n(o faria senti$o tomarmos cui$a$o com

ele. L f&cil arrumar um problema $esses: basta percorrermos a arraD no m& imo at) o seu len th. 2or)m# apenas para enten$er o controle $e flu o $e uma CAception# vamos colocar o c+$i%o que vai tentar 9tr3: e ecutar o bloco peri%oso e# caso o problema seja $o tipo JrrayQn#eA2ut2fSoun#sCAception# ele ser& pe#o 9caught:. Eepare que ) interessante que ca$a e ce,(o no .ava tenha um tipo... ela po$e ter atributos e m)to$os. =. 5$icione um try(catch em volta $o for# pe%an$o JrrayQn#eA2ut2fSoun#sCAception. 1 que o c+$i%o imprimeC
try ! for (int i G -; i 3G /;; iLL) ! array$i% G i; System.out.println(i); & & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("erro, " L e); &

R. /m vez $e fazer o try em torno $o for inteiro# tente apenas com o bloco $e $entro $o for:
for (int i G -; i 3G /;; iLL) ! try ! array$i% G i; System.out.println(i); & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("erro, " L e); & &

@ual ) a $iferen,aC

K. Eetire o try(catch e coloque ele em volta $a chama$a $o meto#o7.


System.out.println("inicio #o meto#o/"); try ! meto#o7(); & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("erro, " L e); & System.out.println("fim #o meto#o/");

J. ;a,a o mesmo# retiran$o o try(catch novamente e colocan$o em volta $a chama$a $o meto#o/. Eo$e os c+$i%os# o que aconteceC
System.out.println("inicio #o main"); try ! meto#o/(); & catch (JrrayQn#eA2ut2fSoun#sCAception e) ! System.out.println("Crro , "Le); & System.out.println("fim #o main");

Eepare que# a partir $o momento que uma e ception foi catched 9pe%a# trata$a# han$le$:# a e ecu,(o volta ao normal a partir $aquele ponto. +oc, no est1 nessa p1#ina a toa

4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

11.% - =!ce:es de ;untime mais comuns


@ue tal tentar $ivi$ir um n6mero por zeroC *er& que a .4" conse%ue fazer aquilo que n+s $efinimos que n(o e isteC
pu"lic class Pestan#oJEivisao ! pu"lic static voi# main(Strin ar s$%) ! int i G ;;Z/; i G i ( -; System.out.println("2 resulta#o " L i); & &

Hente e ecutar o pro%rama acima. 1 que aconteceC

pu"lic class Pestan#o[eferenciaDula ! pu"lic static voi# main(Strin ar s$%) ! +onta c G null; System.out.println("Sal#o atual " L c. etSal#o()); & &

Hente e ecutar este pro%rama. 1 que aconteceC

Eepare que um JrrayQn#eA2ut2fSoun#sCAception ou um DullPointerCAception po$eria ser facilmente evita$o com o for corretamente escrito ou com ifs que checariam os limites $a arraD. 1utro caso em que tamb)m ocorre tal tipo $e e ce,(o ) quan$o um cast erra$o ) feito 9veremos mais pra frente:. /m to$os os casos# tais problemas provavelmente po$eriam ser evita$os pelo pro%rama$or. L por esse motivo que o java n(o te obri%a a $ar o trD/catch nessas e ceptions e chamamos essas e ce,-es $e unchec!ed. /m outras palavras# o compila$or n(o checa se voc! est& tratan$o essas e ce,-es.

=rros 1s erros em .ava s(o um tipo $e e ce,(o que tamb)m po$em ser trata$os. /les representam problemas na m&quina virtual e n(o $evem ser trata$os em AAU $os casos# j& que provavelmente o melhor a se fazer ) $ei ar a .4" encerrar 9ou apenas a Hhrea$ em quest(o:.

11.6 - Outro tipo de e!ceoF C$ecMed =!ceptions


;ica claro# com os e emplos $e c+$i%o acima# que n(o ) necess&rio $eclarar que voc! est& tentan$o fazer al%o on$e um erro possa ocorrer. 1s $ois e emplos# com ou sem o try(catch# compilaram e ro$aram. /m um# o erro terminou o pro%rama e# no outro# foi possvel trat&-lo. "as n(o ) s+ esse tipo $e e ce,(o que e iste em .ava. 8m outro tipo# obri%a a quem chama o m)to$o ou construtor a tratar essa e ce,(o. Chamamos esse tipo $e e ce,(o $e chec!ed# pois o compila$or checar& se ela est& sen$o $evi$amente trata$a# $iferente $as anteriores# conheci$as como unchec!ed. 8m e emplo interessante ) o $e abrir um arquivo para leitura# on$e po$e ocorrer o erro $o arquivo n(o e istir 9veremos como trabalhar com arquivos em outro captulo# no se preocupe com isto a%ora::
class Peste ! pu"lic static voi# meto#o() ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & &

1 c+$i%o acima n(o compila e o compila$or avisa que ) necess&rio tratar o 8ileDot8oun#CAception que po$e ocorrer:

2ara compilar e fazer o pro%rama funcionar# temos $uas maneiras que po$emos tratar o problema. 1 primeiro# ) trat&-lo com o try e catch $o mesmo jeito que usamos no e emplo anterior# com uma arraD:
pu"lic static voi# meto#o() ! try ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & catch ('ava.io.8ileDot8oun#CAception e) ! System.out.println("Dao foi poss?vel a"rir o ar)uivo para leitura"); & &

5 se%un$a forma $e tratar esse erro# ) $ele%ar ele para quem chamou o nosso m)to$o# isto )# passar para a frente.
pu"lic static voi# meto#o() throws 'ava.io.8ileDot8oun#CAception ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); &

0o /clipse ) bem simples fazer tanto um try(catch como um throws: Hente $i%itar esse c+$i%o no eclipse:
pu"lic class PestaCAception !

pu"lic static voi# main(Strin $% ar s) ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & &

1 /clipse vai reclamar :

/ voc! tem $uas op,-es: 1. 8dd thro+s declaration# que vai %erar:
pu"lic class PestaCAception ! pu"lic static voi# main(Strin $% ar s) throws 8ileDot8oun#CAception ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & &

=. /urround +ith tr39catch# que vai %erar:


pu"lic class PestaCAception7 ! pu"lic static voi# main(Strin $% ar s) ! try ! new 'ava.io.8ileQnputStream("ar)uivo.tAt"); & catch (8ileDot8oun#CAception e) ! (( P2E2 Juto* enerate# catch "loc0 e.printStac0Prace(); & & &

0o incio# e iste uma %ran$e tenta,(o $e sempre passar o problema pra frente para outros o tratarem. 2o$e ser que fa,a senti$o# $epen$en$o $o caso# mas n(o at) o main# por e emplo. 5contece que quem tenta abrir um arquivo sabe como li$ar com um problema na leitura. @uem chamou um m)to$o no come,o $o pro%rama po$e n(o saber ou# pior ain$a# tentar abrir cinco arquivos $iferentes e n(o saber qual $eles teve um problemaO 0(o h& uma re%ra para $eci$ir em que momento $o seu pro%rama voc! vai tratar $etermina$a e ce,(o. 'sso vai $epen$er $e em que ponto voc! tem con$i,-es $e tomar uma $ecis(o em rela,(o <quele erro. /nquanto n(o for o momento# voc! provavelmente vai preferir $ele%ar a responsabili$a$e para o m)to$o que te invocou. 8m outro problema comum ) quan$o trabalhamos com banco $e $a$os: Poas pr1ticas no tratamento de e!ce:es 0o blo% $a Caelum h& um e tenso arti%o $iscutin$o as boas pr&ticas em rela,(o ao tratamento $e e ce,-es. http://blo%.caelum.com.br/=BBQ/1B/BN/li$an$o-com-e ceptions/

11.9 - )m pouco da #rande -am"lia &$ro5able


8ma pequena parte $a ;amlia Hhrowable:

eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

11.< - 0ais de um erro


L possvel tratar mais $e um erro quase que ao mesmo tempo: 1. Com o trD e catch:
try ! o"'eto.meto#oKuePo#e9ancarQ2eSK9CAception(); & catch (Q2CAception e) ! (( .. & catch (SK9CAception e) ! (( .. &

=. Com o throws:
pu"lic voi# a"re(Strin (( .. & ar)uivo) throws Q2CAceptionF SK9CAception !

R. 4oc! po$e# tamb)m# escolher tratar al%umas e ce,-es e $eclarar as outras no throws:
pu"lic voi# a"re(Strin ar)uivo) throws Q2CAception ! try ! o"'eto.meto#oKuePo#e9ancarQ2eSK9CAception(); & catch (SK9CAception e) ! (( .. & &

L $esnecess&rio $eclarar no throws as e ceptions que s(o unchec!ed# por)m ) permiti$o e <s vezes# facilita a leitura e a $ocumenta,(o $o seu c+$i%o.

11.@ - Nanando e!ce:es


Fembre-se $o m)to$o saca $a nossa classe +onta. /le $evolve um "oolean caso consi%a ou n(o sacar:
"oolean saca(#ou"le valor) ! if (this.sal#o 3 valor) ! return false; & else ! this.sal#o*Gvalor; return true; & &

2o$emos# tamb)m# lan,ar uma CAception# o que ) e tremamente 6til. 3essa maneira#

resolvemos o problema $e al%u)m po$er esquecer $e fazer um if no retorno $e um m)to$o. 5 palavra chave t$ro5# que est& no imperativo# lan,a uma CAception. 'sto ) bem $iferente $e throws# que est& no presente $o in$icativo# e que apenas avisa $a possibili$a$e $aquele m)to$o lan,&-la# obri%an$o o outro m)to$o que v& utilizar $este $e se preocupar com essa e ce,(o em quest(o.
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new [untimeCAception(); & else ! this.sal#o*Gvalor; & &

0o nosso caso# lan,a uma $o tipo unchec!ed. [untimeCAception ) a e ception m(e $e to$as as e ceptions unchec!ed. 5 $esvanta%em# aqui# ) que ela ) muito %en)rica? quem receber esse erro n(o sabe $izer e atamente qual foi o problema. 2o$emos ent(o usar uma / ception mais especfica:
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Qlle alJr umentCAception(); & else ! this.sal#o*Gvalor; & &

Qlle alJr umentCAception $iz um pouco mais: al%o foi passa$o como ar%umento e seu m)to$o n(o %ostou. /la ) uma / ception unchec!ed pois esten$e $e [untimeCAception e j& faz parte $a biblioteca $o java. 9Qlle alJr umentCAception ) a melhor escolha quan$o um ar%umento sempre ) inv&li$o como# por e emplo# n6meros ne%ativos# refer!ncias nulas# etc:. 2ara pe%ar esse erro# n(o usaremos um if(else e sim um try(catch# porque faz mais senti$o j& que a falta $e sal$o ) uma e ce,(o:
+onta cc G new +onta+orrente(); cc.#eposita(/--); try ! cc.saca(/--); & catch (Qlle alJr umentCAception e) ! System.out.println("Sal#o Qnsuficiente"); &

2o$amos melhorar ain$a mais e passar para o construtor $a Qlle alJr umentCAception o motivo $a e ce,(o:
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Qlle alJr umentCAception("Sal#o insuficiente"); & else ! this.sal#o*Gvalor; & &

1 m)to$o etMessa e() $efini$o na classe Phrowa"le 9m(e $e to$os os tipos $e erros e e ceptions: vai retornar a mensa%em que passamos ao construtor $a Qlle alJr umentCAception.
try ! cc.saca(/--);

& catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); &

11.A - O que colocar dentro do tr2?


'ma%ine que vamos sacar $inheiro $e $iversas contas:
+onta cc G new +onta+orrente(); cc.#eposita(/--); +onta cp G new +ontaPoupanca(); cp.#eposita(/--); (( sacan#o #as contas, cc.saca(;-); System.out.println("conse ui sacar #a corrente!"); cp.saca(;-); System.out.println("conse ui sacar #a poupana!");

2o$emos escolher v&rios lu%ares para colocar trD/catch:


try ! cc.saca(;-); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); & System.out.println("conse ui sacar #a corrente!"); try ! cp.saca(;-); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); & System.out.println("conse ui sacar #a poupana!");

/ssa n(o parece uma op,(o boa# pois a mensa%em 'consegui sacar' ser& impressa mesmo que o catch seja aciona$o. *empre que temos al%o que $epen$e $a linha $e cima para ser correto# $evemos a%rup&-lo no try:
try ! cc.saca(;-); System.out.println("conse ui sacar #a corrente!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); & try ! cp.saca(;-); System.out.println("conse ui sacar #a poupana!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); &

"as h& ain$a uma outra op,(o: ima%ine que# para o nosso sistema# uma falha ao sacar $a conta poupan,a $eve parar o processo $e saques e nem tentar sacar $a conta corrente. 2ara isso# a%ruparamos mais ain$a:

try ! cc.saca(;-); System.out.println("conse ui sacar #a corrente!"); cp.saca(;-); System.out.println("conse ui sacar #a poupana!"); & catch (Qlle alJr umentCAception e) ! System.out.println(e. etMessa e()); &

O que voc, vai colocar dentro do try in-luencia muito a e!ecuo do pro#ramaO 2ense $ireito nas linhas que $epen$em uma $a outra para a e ecu,(o correta $a sua l+%ica $e ne%+cios. A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.

11.C - Criando seu pr*prio tipo de e!ceo


L bem comum criar uma pr+pria classe $e e ce,(o para controlar melhor o uso $e suas e ce,-es. 3essa maneira# po$emos passar valores especficos para ela carre%ar# que sejam 6teis $e al%uma forma. 4amos criar a nossa: 4oltamos para o e emplo $as +ontas# vamos criar a nossa / ce,(o $e Sal#oQnsuficienteCAception:
pu"lic class Sal#oQnsuficienteCAception eAten#s [untimeCAception ! Sal#oQnsuficienteCAception(Strin super(messa e); & & messa e) !

/m vez $e lan,ar um Qlle alJr umentCAception# vamos lan,ar nossa pr+pria e ception# com uma mensa%em que $ir& "*al$o 'nsuficiente":
voi# saca(#ou"le valor) ! if (this.sal#o 3 valor) ! throw new Sal#oQnsuficienteCAception("Sal#o QnsuficienteF" L "tente um valor menor"); & else ! this.sal#o*Gvalor; & &

/# para testar# crie uma classe que $eposite um valor e tente sacar um valor maior:
pu"lic static voi# main(Strin $% ar s) ! +onta cc G new +onta+orrente(); cc.#eposita(/-); try ! cc.saca(/--); & catch (Sal#oQnsuficienteCAception e) !

System.out.println(e. etMessa e()); & &

2o$emos transformar essa CAception $e unchec!ed para chec!ed# obri%an$o a quem chama esse m)to$o a $ar try*catch# ou throws:
pu"lic class Sal#oQnsuficienteCAception eAten#s CAception ! Sal#oQnsuficienteCAception(Strin super(messa e); & & messa e) !

11.1D - Eara saber maisF -inall2


1s blocos try e catch po$em conter uma terceira cl&usula chama$a finally que in$ica o que $eve ser feito ap+s o t)rmino $o bloco try ou $e um catch qualquer. L interessante colocar al%o que ) imprescin$vel $e ser e ecuta$o# caso o que voc! queria fazer tenha $a$o certo# ou n(o. 1 caso mais comum ) o $e liberar um recurso no finallD# como um arquivo ou cone (o com banco $e $a$os# para que possamos ter a certeza $e que aquele arquivo 9ou cone (o: v& ser fecha$o# mesmo que al%o tenha falha$o no $ecorrer $o c+$i%o. 0o e emplo a se%uir# o bloco finally ser& sempre e ecuta$o# in$epen$entemente $e tu$o ocorrer bem ou $e acontecer al%um problema:
try ! (( "loco try & catch (Q2CAception eA) ! (( "loco catch / & catch (SK9CAception s)leA) ! (( "loco catch 7 & finally ! (( "loco )ue serI sempre eAecuta#oF in#epen#ente (( se houve ou no eAception e se ela foi trata#a ou no &

>& tamb)m# no .ava N# um recurso po$eroso conheci$o como tr3)+ith)resources# que permite utilizar a sem[ntica $o finallD $e uma maneira bem mais simples# como veremos no captulo

11.11 - =!erc"ciosF =!ce:es


1. 0a classe +onta# mo$ifique o m)to$o #eposita(#ou"le A): /le $eve lan,ar uma e ception chama$a Qlle alJr umentCAception# que j& faz parte $a biblioteca $o .ava# sempre que o valor passa$o como ar%umento for inv&li$o 9por e emplo# quan$o for ne%ativo:.
pu"lic voi# #eposita(#ou"le valor) ! if (valor 3 -) ! throw new Qlle alJr umentCAception(); & else ! this.sal#o LG valor; & &

=. Crie uma classe PestaEeposita com o m)to$o main. Crie uma +ontaPoupanca e tente $epositar valores inv&li$os:

pu"lic static voi# main(Strin $% ar s) ! +onta cp G new +ontaPoupanca(); cp.#eposita(*/--); &

1 que aconteceC AtenoF estamos usan$o a +ontaPoupanca porque# em captulos anteriores# sobrescrevemos o m)to$o #eposita $a +onta+orrente# provavelmente sem utilizar o super.#eposita. 5ssim# ela n(o se comportar& i%ual < +ontaPoupanca no caso $o valor ne%ativoO 4oc! po$e resolver isso utilizan$o o super.#eposita ou fazen$o apenas o teste com +ontaPoupanca. R. 5$icione o try(catch para tratar o erro:
pu"lic static voi# main(Strin $% ar s) ! +onta cp G new +ontaPoupanca(); try ! cp.#eposita(*/--); & catch (Qlle alJr umentCAception e) ! System.out.println("5ocX tentou #epositar um valor invIli#o"); & &

K. 5o lan,ar a Qlle alJr umentCAception# passe via construtor uma mensa%em a ser e ibi$a. Fembre que a Strin recebi$a como par[metro ) acessvel $epois via o m)to$o etMessa e() her$a$o por to$as as CAceptions.
pu"lic voi# #eposita(#ou"le valor) ! if (valor 3 -) ! throw new Qlle alJr umentCAception("5ocX tentou #epositar" L " um valor ne ativo"); & else ! this.sal#o LG valor * -./-; & &

Com isso# voc! precisar& fazer al%umas mu$an,as no PestaEeposita. Como ficou ele# $epois $e altera$oC J. Crie sua pr+pria CAception# 5alorQnvali#oCAception. 2ara isso# voc! precisa criar uma classe com esse nome que seja filha $e [untimeCAception.
pu"lic class 5alorQnvali#oCAception eAten#s [untimeCAception ! &

Fance-a em vez $e Qlle alJr umentCAception. @uais altera,-es voc! teve que fazer nas classes +onta e na PestaEepositaC AtenoF nem sempre ) interessante criarmos um novo tipo $e e ceptionO 3epen$e $o caso. 0este aqui# seria melhor ain$a utilizarmos Qlle alJr umentCAception. 5 boa pr&tica $iz que $evemos preferir usar as j& e istentes $o .ava sempre que possvel. Q. 9opcional: Coloque um construtor na classe 5alorQnvali#oCAception que receba valor inv&li$o que ele tentou passar 9isto )# ele vai receber um #ou"le valor:. @uan$o esten$emos uma classe# n(o her$amos seus construtores# mas po$emos acess&-los atrav)s $a palavra chave super $e $entro $e um construtor. 5s e ce,-es $o .ava possuem uma s)rie $e construtores 6teis para po$er popul&-las j& com uma mensa%em $e erro. /nt(o

vamos criar um construtor em 5alorQnvali#oCAception que $ele%ue para o construtor $e sua m(e. /ssa vai %uar$ar essa mensa%em para po$er mostr&-la ao ser invoca$o o m)to$o etMessa e:
pu"lic class 5alorQnvali#oCAception eAten#s [untimeCAception ! pu"lic 5alorQnvali#oCAception(#ou"le valor) ! super("5alor invali#o, " L valor); & &

3essa maneira# na hora $e $ar o throw new 5alorQnvali#oCAception voc! vai precisar passar esse valor como ar%umento:
if (valor 3 -) ! throw new 5alorQnvali#oCAception(valor); &

AtenoF voc! po$e se aproveitar $o /clipse para isso: comece j& passan$o o valor como ar%umento para o construtor $a e ception e o /clipse vai reclamar que n(o e iste tal construtor. 1 quicG fi 9ctrl L /: vai su%erir que ele seja construin$o# poupan$o-lhe tempoO / a%ora# como fica a classe PestaEepositaC N. 9opcional: 3eclare a classe 5alorQnvali#oCAception como filha $ireta $e CAception em vez $e [untimeCAception. /la passa a ser c$ecMed. 1 que isso resultaC 4oc! vai precisar avisar que o seu m)to$o #eposita()throws 5alorQnvali#oCAception# pois ela ) uma chec!ed e ception. 5l)m $isso# quem chama esse m)to$o vai precisar tomar uma $ecis(o entre try*catch ou throws. ;a,a uso $o quicG fi $o /clipse novamenteO 3epois# retorne a e ception para unchec!ed# isto )# para ser filha $e [untimeCAception# pois utilizaremos ela assim em e erccios $os captulos posteriores. Captulo 1=

Eacotes - Or#ani.ando suas classes e bibliotecas


"8ma $iscuss(o prolon%a$a si%nifica que ambas as partes est(o erra$as" 5o t)rmino $esse captulo# voc! ser& capaz $e: separar suas classes em pacotes? preparar arquivos simples para $istribui,(o.

12.1 - Or#ani.ao
@uan$o um pro%rama$or utiliza as classes feitas por outro# sur%e um problema cl&ssico: como escrever $uas classes com o mesmo nomeC 2or e emplo: po$e ser que a minha classe $e Eata funcione $e um certo jeito# e a classe Eata $e um cole%a# $e outro jeito. 2o$e ser que a classe $e Eata $e uma biblioteca funcione ain$a $e uma terceira maneira $iferente.

Como permitir que tu$o isso realmente funcioneC Como controlar quem quer usar qual classe $e EataC 2ensan$o um pouco mais# notamos a e ist!ncia $e um outro problema e $a pr+pria solu,(o: o sistema operacional n(o permite a e ist!ncia $e $ois arquivos com o mesmo nome sob o mesmo $iret+rio# portanto precisamos or%anizar nossas classes em $iret+rios $iferentes. 1s $iret+rios est(o $iretamente relaciona$os aos chama$os pacotes e costumam a%rupar classes $e funcionali$a$es similares ou relaciona$as. 2or e emplo# no pacote 'ava.util temos as classes Eate# SimpleEate8ormat e \re orian+alen#ar? to$as elas trabalham com $atas $e formas $iferentes.

12.2 - >iret*rios
*e a classe +liente est& no pacote "anco# ela $ever& estar no $iret+rio com o mesmo nome: "anco. *e ela se localiza no pacote "r.com.caelum."anco# si%nifica que est& no $iret+rio "r(com(caelum("anco . 5 classe +liente# que se localiza nesse 6ltimo $iret+rio menciona$o# $eve ser escrita $a se%uinte forma:
pac0a e "r.com.caelum."anco; class +liente ! (( ... &

;ica f&cil notar que a palavra chave pac0a e in$ica qual o pacote/$iret+rio cont)m esta classe. 8m pacote po$e conter nenhum ou mais subpacotes e/ou classes $entro $ele. Eadro da nomenclatura dos pacotes 1 pa$r(o $a sun para $ar nome aos pacotes ) relativo ao nome $a empresa que $esenvolveu a classe:
"r.com.nome#aempresa.nome#opro'eto.su"pacote "r.com.nome#aempresa.nome#opro'eto.su"pacote7 "r.com.nome#aempresa.nome#opro'eto.su"pacote7.su"pacote:

1s pacotes s+ possuem letras min6sculas# n(o importa quantas palavras estejam conti$as nele. /sse pa$r(o e iste para evitar ao m& imo o conflito $e pacotes $e empresas $iferentes. 5s classes $o pacote pa$r(o $e bibliotecas n(o se%uem essa nomenclatura# que foi $a$a para bibliotecas $e terceiros. &ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

12.% - 8mport
2ara usar uma classe $o mesmo pacote# basta fazer refer!ncia a ela como foi feito at) a%ora simplesmente escreven$o o pr+prio nome $a classe. *e quisermos que a classe Sanco fique $entro $o pacote "r.com.caelum."anco# ela $eve ser $eclara$a assim:
pac0a e "r.com.caelum."anco; class Sanco ! Strin nome; +liente clientes$%; &

2ara a classe +liente ficar no mesmo pacote# se%uimos a mesma f+rmula:


pac0a e "r.com.caelum."anco; class +liente ! Strin nome; Strin en#ereco; &

5 novi$a$e che%a ao tentar utilizar a classe Sanco 9ou +liente: em uma outra classe que esteja fora $esse pacote# por e emplo# no pacote "r.com.caelum.util:
pac0a e "r.com.caelum."anco.util; class PesteEoSanco ! pu"lic static voi# main(Strin ar s$%) ! "r.com.caelum."anco.Sanco meuSanco G new "r.com.caelum."anco.Sanco(); meuSanco.nome G "Sanco #o Srasil"; System.out.println(meuSanco.nome); & &

Eepare que precisamos referenciar a classe Sanco com to$o o nome $o pacote na sua frente. /sse ) o conheci$o 0ull3 :uali"ied *ame $e uma classe. /m outras palavras# esse ) o ver$a$eiro nome $e uma classe# por isso $uas classes com o mesmo nome em pacotes $iferentes n(o conflitam. "esmo assim# ao tentar compilar a classe anterior# sur%e um erro reclaman$o que a classe Sanco n(o est& visvel. 5contece que as classes s+ s(o visveis para outras no mesmo pacote e# para permitir que a classe PesteEoSanco veja e acesse a classe Sanco em outro pacote# precisamos alterar essa 6ltima e transform&-la em p6blica:
pac0a e "r.com.caelum."anco; pu"lic class Sanco ! Strin nome; +liente clientes$% G new +liente$7%; &

5 palavra chave pu"lic libera o acesso para classes $e outros pacotes. 3o mesmo jeito que o compila$or reclamou que a classe n(o estava visvel# ele reclama que o atributo/vari&vel membro tamb)m n(o est&. L f&cil $e$uzir como resolver o problema: utilizan$o novamente o mo$ifica$or pu"lic:
pac0a e "r.com.caelum."anco;

pu"lic class Sanco ! pu"lic Strin nome; pu"lic +liente clientes$% G new +liente$7%; &

2o$emos testar nosso e emplo anterior# lembran$o que utilizar atributos como p6blico n(o traz encapsulamento e est& aqui como ilustra,(o. 4oltan$o ao c+$i%o $o PesteEoSanco# ) necess&rio escrever to$o o pacote para i$entificar qual classe queremos usarC 1 e emplo que usamos ficou bem complica$o $e ler:
"r.com.caelum."anco.Sanco meuSanco G new "r.com.caelum."anco.Sanco();

/ iste uma maneira mais simples $e se referenciar a classe Sanco: basta import1-la $o pacote "r.com.caelum."anco:
pac0a e "r.com.caelum."anco.util; (( para po#ermos referenciar (( a Sanco #iretamente import "r.com.caelum."anco.Sanco; class PesteEoSanco ! pu"lic static voi# main(Strin ar s$%) ! Sanco meuSanco G new Sanco(); meuSanco.nome G "Sanco #o Srasil"; & &

'sso faz com que n(o precisemos nos referenciar utilizan$o o "ull3 quali"ied name# po$en$o utilizar Sanco $entro $o nosso c+$i%o em vez $e escrever o lon%o "r.com.caelum."anco.Sanco. pacMa#e4 import4 class L muito importante manter a or$emO 2rimeiro# aparece uma 9ou nenhuma: vez o pac0a e? $epois# po$e aparecer um ou mais imports? e# por 6ltimo# as $eclara,-es $e classes. import !.2...TU L possvel "importar um pacote inteiro" 9to$as as classes $o pacote# e!ceto os subpacotes: atrav)s $o corin%a H:
import 'ava.util.H;

'mportar to$as as classes $e um pacote n(o implica em per$a $e performance em tempo $e e ecu,(o# mas po$e trazer problemas com classes $e mesmo nomeO 5l)m $isso# importar $e um em um ) consi$era$o boa pr&tica# pois facilita a leitura para outros pro%rama$ores. 8ma '3/ como o /clipse j& vai fazer isso por voc!# assim como a or%aniza,(o em $iret+rios.

12.6 - Acesso aos atributos4 construtores e mtodos


1s mo$ifica$ores $e acesso e istentes em .ava s(o quatro# e at) o momento j& vimos tr!s# mas s+ e plicamos $ois. pu"lic - Ho$os po$em acessar aquilo que for $efini$o como pu"lic. Classes# atributos#

construtores e m)to$os po$em ser pu"lic. protecte# - 5quilo que ) protecte# po$e ser acessa$o por to$as as classes $o mesmo pacote e por to$as as classes que o esten$am# mesmo que essas n(o estejam no mesmo pacote. *omente atributos# construtores e m)to$os po$em ser protecte#. padro Hsem nen$um modi-icadorI - *e nenhum mo$ifica$or for utiliza$o# to$as as classes $o mesmo pacote t!m acesso ao atributo# construtor# m)to$o ou classe. private - 5 6nica classe capaz $e acessar os atributos# construtores e m)to$os priva$os ) a pr+pria classe. Classes# como conhecemos# n(o po$em ser private# mas atributos# construtores e m)to$os sim. Classes p'blicas 2ara melhor or%anizar seu c+$i%o# o .ava n(o permite mais $e uma classe p6blica por arquivo e o arquivo $eve ser DomeEa+lasse.'ava. 8ma vez que outros pro%rama$ores ir(o utilizar essa classe# quan$o precisarem olhar o c+$i%o $a mesma# fica mais f&cil encontr&-la saben$o que ela est& no arquivo $e mesmo nome. Classes aninha$as po$em ser protecte# ou private# mas esse ) um t+pico avan,a$o que n(o ser& estu$a$o nesse momento.

12.9 - )sando o =clipse com pacotes


4oc! po$e usar a perspectiva .ava $o /clipse. 5 view principal $e nave%a,(o ) o $ac!age 2#plorer# que a%rupa classes pelos pacotes em vez $e $iret+rios 9voc! po$e us&-la em conjunto com a *avigator# basta tamb)m abri-la pelo ;indo+9/ho+ <ie+9$ac!age 2#plorer:.

5ntes $e movermos nossas classes# $eclare-as como p6blicas e coloque-as em seus respectivos arquivos: um arquivo para ca$a classe. 4oc! po$e mover uma classe $e pacote arrastan$o-a para o $estino $eseja$o. Eepare que o /clipse j& $eclara pac0a es e imports necess&rios:

0o /clipse nunca precisamos $eclarar um import# pois ele sempre vai su%erir isso quan$o usarmos o +trlLCspao no nome $e uma classe. 4oc! tamb)m po$e usar o +trlL/ no caso $a $eclara,(o $e pacote possuir al%um erro. Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

12.< - =!erc"ciosF Eacotes


AtenoF utilize os recursos $o /clipse para realizar essas mu$an,as. 8se a view pac0a e* eAplorer# que vai au iliar bastante a manipula,(o $os arquivos e $iret+rios. Hamb)m utilize os quicG fi es quan$o o /clipse reclamar $os $iversos problemas $e compila,(o que aparecer(o. L possvel fazer esse e erccio inteiro sem modi-icar uma lin$a de c*di#o manualmente. 5proveite para praticar e $escobrir o /clipse# evite us&-lo apenas como um e$itor $e te to. 2or e emplo# com o /clipse nunca precisamos nos preocupar com os imports: ao usar o auto complete# ele j& jo%a o import l& em cima. /# se voc! n(o fez isso# ele su%ere colocar o import. 1. *elecionan$o o src $o seu projeto# fa,a ctrl J B e escreva Pac0a e# ponha o seu sistema $e Contas para utilizar pacotes. 0a janela $e cria,(o $e pacotes escreva o nome completo# $es$e o br# e o /clipse tratar& $e fazer a separa,(o $as pastas corretamente. Eespeite a conven,(o $e c+$i%o $a *un# por e emplo: "r.com.empresa."anco: colocar classes com o m)to$o main aqui 9os Hestes: "r.com.empresa."anco.conta : colocar +onta# suas filhas e e ceptions aqui "r.com.empresa."anco.sistema : colocar JtualiMa#orEe+ontas aqui Antes de corri#ir qualquer erro $e compila,(o# primeiro mova todas as suas classes# sem $ei ar nenhuma no pacote de"ault. =. *e voc! ain$a n(o tiver separa$o ca$a classe em um arquivo# essa ) a hora $e mu$ar isso. Coloque ca$a classe em seu respectivo arquivo .'ava. ;a,a isso in$epen$ente $e ela ser p6blica: ) uma boa pr&tica. R. 1 c+$i%o n(o vai compilar prontamente# pois muitos m)to$os que $eclaramos s(o pac!age) private quan$o# na ver$a$e# precisaramos que eles fossem pu"lic. 1 mesmo vale para as classes: al%umas $elas precisar(o ser p6blicas. 8se o recurso $e quicG fi $o /clipse aqui: ele mesmo vai su%erir que o mo$ifica$or $e acesso $eve ser p6blico. 2ara isso# use o ctrl J 1 em ca$a um $os erros# escolhen$o o quic! "i# mais a$equa$o para seu problema. K. 91pcional: 5bra a view Davi ator para ver como ficou os arquivos no sistema $e arquivos $o seu sistema operacional. 2ara isso# use ctrl J %# comece a $i%itar Davi ator e escolha a op,(o $e abrir essa view.. Captulo 1R

/erramentasF jar e javadoc


"2er$er tempo em apren$er coisas que n(o interessam# priva-nos $e $escobrir coisas interessantes" 5o t)rmino $esse captulo# voc! ser& capaz $e: criar o .5E $o seu aplicativo? colocar um .5E no buil$ path $o seu projeto? ler um java$oc? criar o java$oc $o seu aplicativo.

1%.1 - Arquivos4 bibliotecas e vers:es


5ssim que um pro%rama fica pronto# ) meio complica$o enviar $ezenas ou centenas $e classes para

ca$a cliente que quer utiliz&-lo. 1 jeito mais simples $e trabalhar com um conjunto $e classes ) compact&-los em um arquivo s+. 1 formato $e compacta,(o pa$r(o ) o `QP com a e tens(o $o arquivo compacta$o JJ[ . O arquivo .jar 1 arquivo jar ou Java A;chive# possui um conjunto $e classes 9e arquivos $e confi%ura,-es: compacta$os# no estilo $e um arquivo Mip . 1 arquivo 'ar po$e ser cria$o com qualquer compacta$or Mip $isponvel no merca$o# inclusive o pro%rama 'ar que vem junto com o .3T. 2ara criar um arquivo jar $o nosso pro%rama $e banco# basta ir ao $iret+rio on$e est(o conti$as as classes e usar o coman$o a se%uir para criar o arquivo "anco.'ar com to$as as classes $os pacotes "r.com.caelum.util e "r.com.caelum."anco:
'ar *cvf "anco.'ar "r(com(caelum(util(H.class "r(com(caelum("anco(H.class

2ara usar esse arquivo "anco.'ar para ro$ar o PesteEoSanco basta ro$ar o 'ava com o arquivo 'ar como ar%umento:
'ava *classpath "anco.'ar "r.com.caelum.util.PesteEoSanco

2ara a$icionar mais arquivos .'ar # que po$em ser bibliotecas# ao pro%rama basta ro$ar o java $a se%uinte maneira:
'ava *classpath "i"lioteca/.'ar;"i"lioteca7.'ar DomeEa+lasse

4ale lembrar que o ponto e vr%ula utiliza$o s+ ) v&li$o em ambiente Pin$ows. /m Finu # "ac e outros 8ni # ) o $ois pontos 9varia $e acor$o com o sistema operacional:. >& tamb)m um arquivo $e manifesto que cont)m informa,-es $o seu jar como# por e emplo# qual classe ele vai ro$ar quan$o o jar for chama$o. "as n(o se preocupe pois# com o /clipse# esse arquivo ) %era$o automaticamente. Pibliotecas 3iversas bibliotecas po$em ser controla$as $e acor$o com a vers(o por estarem sempre compacta$as em um arquivo .'ar. Basta verificar o nome $a biblioteca 9por e emplo lo 6'* /.7./:.'ar : para $escobrir a vers(o $ela. /nt(o ) possvel ro$ar $ois pro%ramas ao mesmo tempo# ca$a um utilizan$o uma vers(o $a biblioteca atrav)s $o par[metro *classpath $o java. Criando um .jar automaticamente / istem $iversas ferramentas que servem para automatizar o processo $e $eploD# que consiste em compilar# %erar $ocumenta,(o# bibliotecas etc. 5s $uas mais famosas s(o o AB& e o 0A+=B# ambos s(o projetos $o %rupo 5pache. 1 /clipse po$e %erar facilmente um jar# por)m# se o seu buil$ ) comple o e precisa preparar e copiar uma s)rie $e recursos# as ferramentas in$ica$as acima possuem sofistica$as maneiras $e ro$ar um script batch.

1%.2 - (erando o JA; pelo =clipse


0este e emplo# vamos %erar o arquivo .5E $o nosso projeto a partir $o /clipse: 1. Clique com o bot(o $ireito em cima $o nome $o seu projeto e selecione a op,(o / port.

=. 0a tela / port 9como mostra a fi%ura abai o:# selecione a op,(o ".5E file" e aperte o bot(o "0e t". R. 0a op,(o ".5E file:"# selecione o local que voc! $eseja salvar o arquivo .5E. / aperte "0e t". K. 0a pr+ ima tela# simplesmente clique em ne t# pois n(o h& nenhuma confi%ura,(o a ser feita. J. 0a tela abai o# na op,(o "select the class of the application entrD point"# voc! $eve escolher qual classe ser& a classe que vai ro$ar automaticamente quan$o voc! e ecutar o .5E. Q. /ntre na linha $e coman$o: 'ava *'ar "anco.'ar L comum $ar um nome mais si%nificativo aos .5Es# incluin$o nome $a empresa# $o projeto e vers(o# como caelum*"anco*/.-.'ar. J1 con$ece os cursos online Alura?

5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.

1%.% - Javadoc
Como vamos saber o que ca$a classe tem no .avaC @uais s(o seus m)to$os# o que eles fazemC 0a sala $e aula $a Caelum# voc! po$e acessar a $ocumenta,(o $i%itan$o na barra $e en$ere,o $o Browser: VcaelumVdocsVapiVinde!.$tml /# a partir $a 'nternet# voc! po$e acessar atrav)s $o linG: http://$ocs.oracle.com/javase/N/$ocs/api/ 0o site $a 1racle# voc! po$e 9e $eve: bai ar a $ocumenta,(o $as bibliotecas $o .ava# frequentemente referi$a como "javadoc" ou 52' 9sen$o na ver$a$e a $ocumenta,(o $a 52':.

0esta $ocumenta,(o# no qua$ro superior esquer$o# voc! encontra os pacotes e# no inferior esquer$o# est& a lista%em $as classes e interfaces $o respectivo pacote 9ou $e to$os# caso nenhum tenha si$o especifica$o:. Clican$o-se em uma classe ou interface# o qua$ro $a $ireita passa a $etalhar to$os atributos e m)to$os. Eepare que m)to$os e atributos priva$os n(o est(o a. 1 importante ) $ocumentar o que sua classe faz# e n(o como ela faz: $etalhes $e implementa,(o# como atributos e m)to$os priva$os# n(o interessam ao $esenvolve$or que usar& a sua biblioteca 9ou# ao menos# n(o $everiam interessar:. 4oc! tamb)m conse%ue %erar esse java$oc a partir $a linha $e coman$o# com o coman$o: 'ava#oc.

1%.6 - (erando o Javadoc


2ara %erar o .ava$oc a partir $o /clipse ) muito simples# si%a os passos abai o: 1. 0a barra $e menu# selecione o menu 2roject# $epois a op,(o "7enerate .ava$oc...". 9apenas $isponvel se estiver na perspectiva .ava# mas voc! po$e acessar o mesmo wizar$ pelo e port $o projeto:. =. /m se%ui$a# aparecer(o as op,-es para %erar a $ocumenta,(o $o seu sistema# selecione to$as as classes $o seu sistema e $ei e as outras op,-es como est(o. 0(o esque,a $e marcar o caminho $a op,(o "3estination"# pois ) l& que estar& sua $ocumenta,(o. R. 5bra a $ocumenta,(o atrav)s $o caminho que voc! marcou e abra o arquivo in$e .html# que vai chamar uma p&%ina semelhante a essa $a fi%ura abai o. 2ara colocarmos coment&rios na $ocumenta,(o# $evemos a$icionar ao c+$i%o# sob forma $e coment&rio# abrin$o o te to com (HH e fechan$o com H( e# nas outras linhas# apenas colocan$o H. Hamb)m po$emos $efinir outras informa,-es neste te to# como: autor# vers(o# par[metros# retorno# etc. 5$icione al%uns coment&rios ao seu projeto como abai o:
(HH H +lasse responsIvel por mol#ar as +ontas #o Sanco H H dauthor Manoel Santos #a Silva H( pu"lic a"stract class +onta! ... &

1u a$icione al%uns coment&rios em al%um m)to$o seu:


(HH H Meto#o )ue incrementa o sal#o. H dparam valor H( pu"lic voi# #eposita(#ou"le valor) ! ... &

4eja como ficou:

1%.9 - =!erc"ciosF Jar e Javadoc


1. 7ere um jar $o seu sistema com o arquivo $e manifesto. / ecute-o com 'ava *'ar:
'ava *'ar caelum*"anco*/.-.'ar

*e o Pin$ows ou o Finu foi confi%ura$o para trabalhar com a e tens(o 4jar# basta voc! $ar um $uplo clique no arquivo# que ele ser& "e ecuta$o": o arquivo Manifest ser& li$o para que ele $escubra qual ) a classe com main que o .ava $eve processar. =. 7ere o .ava$oc $o seu sistema. 2ara isso# v& ao menu $roject# $epois < op,(o =enerate Javadoc# se estiver na perspectiva .ava. *e n(o# $! um clique com o bot(o $ireito no seu projeto# escolha 2#port e $epois javadoc e si%a o proce$imento $escrito na 6ltima se,(o

$este captulo. 'n$epen$ente $a perspectiva que voc! usa no /clipse# voc! tamb)m po$e usar o ctrl J % e come,ar a escrever JavaEoc# at) que a op,(o $e e portar o .ava3oc apare,a. 8nter-ace versus implementao novamenteO Eepare que a $ocumenta,(o %era$a n(o mostra o conte6$o $os m)to$os# nem atributos e m)to$os priva$osO 'sso faz parte $a implementa,(o# e o que importa para quem usa uma biblioteca ) a interface: o que ela faz. Captulo 1K

O pacote java.lan#
"0ossas cabe,as s(o re$on$as para que os pensamentos possam mu$ar $e $ire,(o." 5o t)rmino $esse captulo# voc! ser& capaz $e: utilizar as principais classes $o pacote 'ava.lan e ler a $ocumenta,(o pa$r(o $e projetos java? usar a classe System para obter informa,-es $o sistema? utilizar a classe Strin $e uma maneira eficiente e conhecer seus $etalhes? usar as classes wrappers 9como Qnte er: e bo in%? utilizar os m)to$os her$a$os $e 2"'ect para %eneralizar seu conceito $e objetos.

16.1 - Eacote java.lan#


.& usamos# por $iversas vezes# as classes Strin e System. 4imos o sistema $e pacotes $o .ava e nunca precisamos $ar um import nessas classes. 'sso ocorre porque elas est(o $entro $o pacote 'ava.lan # que ) automaticamente importado para voc!. L o 'nico pacote com esta caracterstica. 4amos ver um pouco $e suas principais classes.

16.2 - )m pouco sobre a classe 2stem


5 classe System possui uma s)rie $e atributos e m)to$os est&ticos. .& usamos o atributo System.out# para imprimir. 1lhan$o a $ocumenta,(o# voc! vai perceber que o atributo out ) $o tipo PrintStream $o pacote 'ava.io. 4eremos sobre essa classe no pr+ imo captulo. .& po$emos perceber que po$eramos quebrar o System.out.println em $uas linhas:
PrintStream sai#a G System.out; sai#a.println("ola mun#o!");

/la tamb)m possui o atributo in# que l! $a entra$a pa$r(o# por)m s+ conse%ue captar bDtes:
int i G System.in.rea#();

1 c+$i%o acima $eve estar $entro $e um bloco $e try e catch# pois po$e lan,ar uma e ce,(o Q2CAception. L 6til ficar len$o $e "yte em "yteC Hrabalharemos mais com a entra$a pa$r(o tamb)m no pr+ imo captulo. 1 System conta tamb)m com um m)to$o que simplesmente $esli%a a virtual machine# retornan$o um c+$i%o $e erro para o sistema operacional# ) o eAit.

System.eAit(-);

4eremos tamb)m um pouco mais sobre a classe System no pr+ imo captulo e no $e Phrea#s. Consulte a $ocumenta,(o $o .ava e veja outros m)to$os 6teis $a System. A classe ;untime 5 classe [untime possui um m)to$o para fazer uma chama$a ao sistema operacional e ro$ar al%um pro%rama:
[untime rt G [untime. et[untime(); Process p G rt.eAec("#ir");

'sto $eve ser evita$o ao m& imo# j& que %era uma $epen$!ncia $a sua aplica,(o com o sistema operacional em quest(o# per$en$o a portabili$a$e entre plataformas. /m muitos casos# isso po$e ser substitu$o por chama$as <s bibliotecas $o .ava. 0esse caso# por e emplo# voc! tem um m)to$o list na classe 8ile $o pacote $e entra$a e sa$a# que veremos posteriormente. 1 m)to$o eAec te retorna um Process# on$e voc! ) capaz $e pe%ar a sa$a $o pro%rama# enviar $a$os para a entra$a# entre outros. eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

16.% - java.lan#.Object
*empre quan$o $eclaramos uma classe# essa classe ) obri#ada a her$ar $e outra. 'sto )# para to$a classe que $eclararmos# e iste uma superclasse. 2or)m# criamos $iversas classes sem her$ar $e nin%u)m:
class Minha+lasse ! &

@uan$o o .ava n(o encontra a palavra chave eAten#s# ele consi$era que voc! est& her$an$o $a classe 2"'ect# que tamb)m se encontra $entro $o pacote 'ava.lan . 4oc! at) mesmo po$e escrever essa heran,a# que ) o mesmo:
class Minha+lasse eAten#s 2"'ect ! &

&odas as classes4 sem e!ceo4 $erdam de 2"'ect # seja $ireta ou in$iretamente# pois ela ) a m(e# v+# bisav+# etc $e qualquer classe. 2o$emos tamb)m afirmar que qualquer objeto em .ava ) um 2"'ect# po$en$o ser referencia$o como tal. /nt(o# qualquer objeto possui to$os os m)to$os $eclara$os na classe 2"'ect e veremos al%uns $eles lo%o ap+s o casting.

16.6 - Castin# de re-er,ncias


5 habili$a$e $e po$er se referir a qualquer objeto como 2"'ect nos traz muitas vanta%ens. 2o$emos criar um m)to$o que recebe um 2"'ect como ar%umento# isto )# qualquer objetoO "elhor# po$emos armazenar qualquer objeto:
pu"lic class \uar#a#orEe2"'etos ! private 2"'ect$% arrayEe2"'etos G new 2"'ect$/--%; private int posicao G -; pu"lic voi# a#iciona2"'eto(2"'ect o"'ect) ! this.arrayEe2"'etos$this.posicao% G o"'ect; this.posicaoLL; & pu"lic 2"'ect pe a2"'eto(int in#ice) ! return this.arrayEe2"'etos$in#ice%; &

&

"as# e no momento que retirarmos uma refer!ncia a esse objeto# como vamos acessar os m)to$os e atributos $esse objetoC *e estamos referencian$o-o como 2"'ect# n(o po$emos acess&-lo como sen$o +onta. 4eja o e emplo a se%uir:
\uar#a#orEe2"'etos uar#a#or G new \uar#a#orEe2"'etos(); +onta conta G new +onta(); uar#a#or.a#iciona2"'eto(conta); (( ... (( pe a a conta referencia#o como o"'eto 2"'ect o"'ect G uar#a#or.pe a2"'eto(-); (( serI )ue posso invocar o"'ect. etSal#o(); etSal#o em 2"'ect] ,

2o$eramos ent(o atribuir essa refer!ncia $e 2"'ect para +onta para $epois invocar o etSal#o()C Hentemos:
+onta conta[es ata#a G o"'ect;

0+s temos certeza $e que esse 2"'ect se refere a uma +onta# j& que fomos n+s que o a$icionamos na classe que %uar$a objetos. "as o compila$or .ava n(o tem %arantias sobre issoO /ssa linha acima n(o compila# pois nem to$o 2"'ect ) uma +onta. 2ara realizar essa atribui,(o# para isso $evemos "avisar" o compila$or .ava que realmente queremos fazer isso# saben$o $o risco que corremos. ;azemos o castin# de re-er,ncias# pareci$o com $e tipos primitivos:
+onta conta[es ata#a G (+onta) o"'ect;

1 c+$i%o passa a compilar# mas ser& que ro$aC /sse c+$i%o ro$a sem nenhum problema# pois em tempo $e e ecu,(o a .4" verificar& se essa refer!ncia realmente ) para um objeto $e tipo +onta# e est&O *e n(o estivesse# uma e ce,(o $o tipo +lass+astCAception seria lan,a$a. 2o$eramos fazer o mesmo com 8uncionario e \erente. Hen$o uma refer!ncia para um 8uncionario que temos certeza ser um \erente# po$emos fazer a atribui,(o# $es$e que o castin% e ista# pois nem to$o 8uncionario ) um \erente.
8uncionario funcionario G new \erente();

((

... e #epois erente G funcionario; (( no compila! (( nem to#o 8uncionario T um \erente

\erente

1 correto ent(o seria:


\erente erente G (\erente) funcionario;

4amos misturar um pouco:


2"'ect o"'ect G new +onta(); (( ... e #epois erente G (\erente) o"'ect;

\erente

/sse c+$i%o compilaC Eo$aC Compila# pois e iste a chance $e um 2"'ect ser um \erente. 2or)m n(o ro$a# ele vai lan,ar uma CAception 9+lass+astCAception: em tempo $e e ecu,(o. L importante $iferenciar tempo $e compila,(o e tempo $e e ecu,(o. 0este e emplo# n+s %arantimos ao java que nosso 1bjeto o"'ect era um \erente com o castin%# por isso compilou# mas na hora $e ro$ar# quan$o ele foi receber um \erente# ele recebeu uma +onta# $a ele reclamou lan,an$o +lass+astCAceptionO

16.9 - 0todos do java.lan#.ObjectF equals e to trin#


1 primeiro m)to$o interessante ) o toStrin . 5s classes po$em reescrever esse m)to$o para mostrar uma mensa%em# uma Strin # que o represente. 4oc! po$e us&-lo assim:
+onta c G new +onta(); System.out.println(c.toStrin ());

1 m)to$o toStrin $o 2"'ect retorna o nome $a classe d um n6mero $e i$enti$a$e:


+ontad:6f;#Z6a

"as isso n(o ) interessante para n+s. /nt(o po$emos reescrev!-lo:


class +onta ! private #ou"le sal#o; (( outros atri"utos... pu"lic +onta(#ou"le sal#o) ! this.sal#o G sal#o; & pu"lic Strin toStrin () ! return "ema conta com valor, " L this.sal#o; &

&

Chaman$o o toStrin :
+onta c G new +onta(/--); System.out.println(c.toStrin ()); ((imprime, ema conta com valor, /--.

/ o melhor# se for apenas para jo%ar na tela# voc! nem precisa chamar o toStrin O /le j& )

chama$o para voc!:


+onta c G new +onta(/--); System.out.println(c); (( 2 toStrin T chama#o pela classe PrintStream

7era o mesmo resulta$oO 4oc! ain$a po$e concatenar Strin s em .ava com o opera$or L. *e o .ava encontra um objeto no meio $a concatena,(o# ele tamb)m chama o toStrin $ele.
+onta c G new +onta(/--); System.out.println("#escrio, " L c);

1 outro m)to$o muito importante ) o e)uals. @uan$o comparamos $uas vari&veis refer!ncia no .ava# o GG verifica se as $uas referem-se ao mesmo objeto:
+onta c/ G new +onta(/--); +onta c7 G new +onta(/--); if (c/ !G c7) ! System.out.println("o"'etos referencia#os so #iferentes!"); &

/# nesse caso# realmente s(o $iferentes. "as# e se fosse preciso comparar os atributosC @uais atributos ele $everia compararC 1 .ava por si s+ n(o faz isso# mas e iste um m)to$o na classe 2"'ect que po$e ser reescrito para criarmos esse crit)rio $e compara,(o. /sse m)to$o ) o e)uals. 1 e)uals recebe um 2"'ect como ar%umento e $eve verificar se ele mesmo ) i%ual ao 2"'ect recebi$o para retornar um "oolean. *e voc! n(o reescrever esse m)to$o# o comportamento her$a$o ) fazer um GG com o objeto recebi$o como ar%umento.
pu"lic class +onta ! private #ou"le sal#o; (( outros atri"utos... pu"lic +onta(#ou"le sal#o) ! this.sal#o G sal#o; & pu"lic "oolean e)uals(2"'ect o"'ect) ! +onta outra+onta G (+onta) o"'ect; if (this.sal#o GG outra+onta.sal#o) ! return true; & return false; & pu"lic Strin toStrin () ! return "ema conta com valor, " L this.sal#o; &

&

8m e emplo cl&ssico $o uso $o e)uals ) para $atas. *e voc! criar $uas $atas# isto )# $ois objetos $iferentes# conten$o :/(/-(/YZY# ao comparar com o GG receber& false# pois s(o refer!ncias para objetos $iferentes. *eria correto# ent(o# reescrever este m)to$o# fazen$o as compara,-es $os atributos# e o usu&rio passaria a invocar e)uals em vez $e comparar com GG. 4oc! po$eria criar um m)to$o com outro nome em vez $e reescrever e)uals que recebe 2"'ect# mas ele ) importante pois muitas bibliotecas o chamam atrav)s $o polimorfismo# como veremos no captulo $o 'ava.util.

1 m)to$o hash+o#e() an$a $e m(os $a$as com o m)to$o e)uals() e ) $e fun$amental enten$imento no caso $e voc! utilizar suas classes com estruturas $e $a$os que usam tabelas $e espalhamento. Hamb)m falaremos $ele no captulo $e 'ava.util. ;e#ras para a reescrita do mtodo equals 2elo contrato $efini$o pela classe 2"'ect $evemos retornar false tamb)m no caso $o objeto passa$o n(o ser $e tipo compatvel com a sua classe. /nt(o antes $e fazer o castin% $evemos verificar isso# e para tal usamos a palavra chave instanceof# ou teramos uma e ception sen$o lan,a$a. 5l)m $isso# po$emos resumir nosso e)uals $e tal forma a n(o usar um if:
pu"lic "oolean e)uals(2"'ect o"'ect) ! if (!(o"'ect instanceof +onta)) return false; +onta outra+onta G (+onta) o"'ect; return this.sal#o GG outra+onta.sal#o; &

A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.

16.< - 8nte#er e classes 5rappers Hbo!I


8ma per%unta bem simples que sur%e na cabe,a $e to$o pro%rama$or ao apren$er uma nova lin%ua%em ): "Como transformar um n6mero em Strin e vice-versaC". Cui$a$oO 8samos aqui o termo "transformar"# por)m o que ocorre n(o ) uma transforma,(o entre os tipos e sim uma forma $e conse%uirmos uma Strin $a$o um int e vice-versa. 1 jeito mais simples $e transformar um n6mero em Strin ) concaten&-lo $a se%uinte maneira:
int i G /--; Strin s G "" L i; System.out.println(s); #ou"le # G /.7; Strin s7 G "" L #; System.out.println(s7);

2ara formatar o n6mero $e uma maneira $iferente# com vr%ula e n6mero $e casas $ecimais $evemos utilizar outras classes $e aju$a 9Dum"er8ormat# 8ormatter:. 2ara transformar uma Strin em n6mero# utilizamos as classes $e aju$a para os tipos primitivos correspon$entes. 2or e emplo# para transformar a Strin s em um n6mero inteiro utilizamos o m)to$o est&tico $a classe Qnte er:
Strin s G "/-/"; int i G Qnte er.parseQnt(s);

5s classes Eou"le# Short# 9on # 8loat etc cont!m o mesmo tipo $e m)to$o# como parseEou"le e parse8loat que retornam um #ou"le e float respectivamente. /ssas classes tamb)m s(o muito utiliza$as para fazer o 5rappin# 9embrulho: $e tipos primitivos como objetos# pois refer!ncias e tipos primitivos s(o incompatveis. 'ma%ine que precisamos passar como ar%umento um inteiro para o nosso %uar$a$or $e objetos. 8m inteiro n(o ) um 2"'ect# como fazerC
int i G ;; Qnte er A G new Qnte er(i); uar#a#or.a#iciona(A);

/# $a$o um Qnte er# po$emos pe%ar o int que est& $entro $ele 9$esembrulh&-lo::
int i G ;; Qnte er A G new Qnte er(i); int numeroEe5olta G A.int5alue();

16.@ - Autobo!in# no Java 9.D


/sse processo $e wrappin% e unwrappin% ) ente$iante. 1 .ava J.B em $iante traz um recurso chama$o $e autobo!in## que faz isso sozinho para voc!# custan$o le%ibili$a$e:
Qnte er A G ;; int y G A;

0o .ava 1.K esse c+$i%o ) inv&li$o. 0o .ava J.B em $iante ele compila perfeitamente. L importante ressaltar que isso n(o quer $izer que tipos primitivos e refer!ncias sejam $o mesmo tipo# isso ) simplesmente um "a,6car sint&tico" 9s3nta# sugar: para facilitar a co$ifica,(o. 4oc! po$e fazer to$os os tipos $e opera,-es matem&ticas com os wrappers# por)m corre o risco $e tomar um DullPointerCAception. 4oc! po$e fazer o autobo in% $iretamente para 2"'ect tamb)m# possibilitan$o passar um tipo primitivo para um m)to$o que receber 2"'ect como ar%umento:
2"'ect o G ;;

16.A - java.lan#. trin#


Strin ) uma classe em .ava. 4ari&veis $o tipo Strin %uar$am refer!ncias a objetos# e n(o um valor# como acontece com os tipos primitivos. 5li&s# po$emos criar uma Strin utilizan$o o new:
Strin Strin A G new Strin ("f'//"); y G new Strin ("f'//");

Criamos aqui# $ois objetos $iferentes. 1 que acontece quan$o comparamos essas $uas refer!ncias utilizan$o o GGC
if (A GG y) ! System.out.println("referXncia para o mesmo o"'eto"); & else ! System.out.println("referXncias para o"'etos #iferentes!"); &

Hemos aqui $ois objetos $iferentesO /# ent(o# como faramos para verificar se o conte6$o $o objeto

) o mesmoC 8tilizamos o m)to$o e)uals# que foi reescrito pela Strin # para fazer a compara,(o $e char em char.
if (A.e)uals(y)) ! System.out.println("consi#eramos i uais no critTrio #e i ual#a#e"); & else ! System.out.println("consi#eramos #iferentes no critTrio #e i ual#a#e"); &

5qui# a compara,(o retorna ver$a$eiro. 2or qu!C 2ois quem implementou a classe Strin $eci$iu que este seria o melhor crit)rio $e compara,(o. 4oc! po$e $escobrir os crit)rios $e i%ual$a$e $e ca$a classe pela $ocumenta,(o. 2o$emos tamb)m concatenar Strin s usan$o o L. 2o$emos concatenar Strin s com qualquer objeto# at) mesmo n6meros:
int total G ;; System.out.println("o total asto T, " L total);

1 compila$or utilizar& os m)to$os apropria$os $a classe Strin e $as classes wrappers para realizar tal tarefa. 5 classe Strin conta tamb)m com um m)to$o split# que $ivi$e a Strin em um arraD $e Strin s# $a$o $etermina$o crit)rio.
Strin Strin frase G "'ava T #emais"; palavras$% G frase.split(" ");

*e quisermos comparar $uas *trin%s# utilizamos o m)to$o comparePo# que recebe uma Strin como ar%umento e $evolve um inteiro in$ican$o se a Strin vem antes# ) i%ual ou vem $epois $a Strin recebi$a. *e forem i%uais# ) $evolvi$o -? se for anterior < Strin $o ar%umento# $evolve um inteiro ne%ativo? e# se for posterior# um inteiro positivo. ;ato importante: uma trin# imut1vel. 1 java cria um pool $e *trin%s para usar como cache e# se a Strin n(o fosse imut&vel# mu$an$o o valor $e uma Strin afetaria to$as as Strin s $e outras classes que tivessem o mesmo valor. Eepare no c+$i%o abai o:
Strin palavra G "f'//"; palavra.toepper+ase(); System.out.println(palavra);

2o$e parecer estranho# mas ele imprime "fj11" em min6sculo. Ho$o m)to$o que parece alterar o valor $e uma Strin # na ver$a$e# cria uma nova Strin com as mu$an,as solicita$as e a retornaO Hanto que esse m)to$o n(o ) voi#. 1 c+$i%o realmente 6til ficaria assim:
Strin palavra G "f'//"; Strin outra G palavra.toepper+ase(); System.out.println(outra);

1u voc! po$e eliminar a cria,(o $e outra vari&vel tempor&ria# se achar conveniente:


Strin palavra G "f'//"; palavra G palavra.toepper+ase(); System.out.println(palavra);

'sso funciona $a mesma forma para todos os m)to$os que parecem alterar o conte6$o $e uma Strin .

*e voc! ain$a quiser trocar o n6mero 1 para =# faramos:


Strin palavra G "f'//"; palavra G palavra.toepper+ase(); palavra G palavra.replace("/"F "7"); System.out.println(palavra);

1u ain$a po$emos concatenar as invoca,-es $e m)to$o# j& que uma Strin ) $evolvi$a a ca$a invoca,(o:
Strin palavra G "f'//"; palavra G palavra.toepper+ase().replace("/"F "7"); System.out.println(palavra);

1 funcionamento $o pool interno $e *trin%s $o .ava tem uma s)rie $e $etalhes e voc! po$e encontrar mais informa,-es sobre isto na $ocumenta,(o $a classe Strin e no seu m)to$o intern(). Outros mtodos da classe Strin / istem $iversos m)to$os $a classe Strin que s(o e tremamente importantes. Eecomen$amos sempre consultar o java$oc relativo a essa classe para apren$er ca$a vez mais sobre a mesma. 2or e emplo# o m)to$o charJt(i)# retorna o caractere e istente na posi,(o i $a *trin%# o mtodolen th retorna o n6mero $e caracteres na mesma e o m)to$o su"strin que recebe um int e $evolve a *ub*trin% a partir $a posi,(o passa$a por aquele int. 1 in#eA2f recebe um char ou uma *trin% e $evolve o n$ice em que aparece pela primeira vez na *trin% principal 9h& tamb)m o lastQn#eA2f que $evolve o n$ice $a 6ltima ocorr!ncia:. 1 toepper+ase e o to9ower+ase $evolvem uma nova *trin% to$a em mai6scula e to$a em min6scula# respectivamente. 5 partir $o .ava Q# temos ain$a o m)to$o isCmpty# que $evolve true se a *trin% for vazia ou false caso contr&rio. 5l%uns m)to$os 6teis para buscas s(o o contains e o matches. >& muitos outros m)to$os# recomen$amos que voc! sempre consulte o java$oc $a classe. java.lan# Strin Suffer e Strin Suil#er Como a classe Strin ) imut&vel# trabalhar com uma mesma Strin $iversas vezes po$e ter um efeito colateral: %erar in6meras Strin s tempor&rias. 'sto preju$ica a performance $a aplica,(o consi$eravelmente. 0o caso $e voc! trabalhar muito com a manipula,(o $e uma mesma Strin 9por e emplo# $entro $e um la,o:# o i$eal ) utilizar a classe Strin Suffer. 5 classe Strin Suffer representa uma sequ!ncia $e caracteres. 3iferentemente $a Strin # ela ) mut&vel# e n(o possui aquele pool. 5 classe Strin Suil#er tem e atamente os mesmos m)to$os# com a $iferen,a $ela n(o ser t$read-sa-e. 4eremos sobre este conceito no captulo $e Hhrea$s. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC

5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

16.C - java.lan#.0at$
0a classe Math# e iste uma s)rie $e m)to$os est&ticos que fazem opera,-es com n6meros como# por e emplo# arre$on$ar9roun#:# tirar o valor absoluto 9a"s:# tirar a raiz9s)rt:# calcular o seno9sin: e outros.
#ou"le # G 6.N; lon i G Math.roun#(#); int A G *6; int y G Math.a"s(A);

Consulte a $ocumenta,(o para ver a %ran$e quanti$a$e $e m)to$os $iferentes. 0o .ava J.B# po$emos tirar proveito $o import static aqui:
import static 'ava.lan .Math.H;

'sso elimina a necessi$a$e $e usar o nome $a classe# sob o custo $e le%ibili$a$e:


#ou"le # G 6.N; lon i G roun#(#); int A G *6; int y G a"s(A);

16.1D - =!erc"ciosF java.lan#


5qui faremos $iversos testes# al)m $e mo$ificar a classe +onta. 4oc! po$e fazer to$os esses e erccios $entro $o pr+prio projeto "anco. 1. Heste os e emplos $esse captulo# para ver que uma Strin ) imut&vel. 2or e emplo:
pu"lic class PestaStrin ! pu"lic static voi# main(Strin $% ar s) ! Strin s G "f'//"; s.replaceJll("/"F "7"); System.out.println(s); & &

Como fazer para ele imprimir fj==C =. Como fazer para saber se uma Strin se encontra $entro $e outraC / para tirar os espa,os em branco $as pontas $e uma Strin C / para saber se uma Strin est& vaziaC / para saber quantos caracteres tem uma Strin C Home como h&bito sempre pesquisar o .ava3ocO Conhecer a 52'# aos poucos# ) fun$amental para que voc! n(o precise reescrever a ro$aO R. Crie uma classe PestaQnte er e vamos fazer compara,-es com 'nte%ers $entro $o main:
Qnte er A/ G new Qnte er(/-);

Qnte er A7 G new Qnte er(/-); if (A/ GG A7) ! System.out.println("i ual"); & else ! System.out.println("#iferente"); &

/ se testarmos com o e)ualsC 1 que po$emos concluirC K. Como verificar se a classe Qnte er tamb)m reescreve o m)to$o toStrin C 5 maioria $as classes $o .ava que s(o muito utiliza$as ter(o seus m)to$os e)uals e toStrin reescritos convenientemente. 5proveite e fa,a um teste com o m)to$o est&tico parseQnt# receben$o uma *trin% v&li$a e uma inv&li$a 9com caracteres alfab)ticos:# e veja o que aconteceO J. 8tilize-se $a $ocumenta,(o $o .ava e $escubra $e que classe ) o objeto referencia$o pelo atributo out $a System. Eepare que# com o $evi$o import# po$eramos escrever:
(( falta a #eclarao #a sa?#a ........ sai#a G System.out; sai#a.println("ola");

5 vari&vel sai#a precisa ser $eclara$a $e que tipoC L isso que voc! precisa $escobrir. *e voc! $i%itar esse c+$i%o no /clipse# ele vai te su%erir um quicGfi e $eclarar& a vari&vel para voc!. /stu$aremos essa classe no captulo se%uinte. Q. Crie e imprima uma refer!ncia $e +onta. 0ote que voc! vai ter que $ar new em +onta+orrente ou +ontaPoupanca# j& que sua +onta ) abstrata:
+onta conta G new +onta+orrente(), System.out.println(conta);

1 que aconteceC N. Eeescreva o m)to$o toStrin $a sua classe +onta fazen$o com que uma mensa%em mais e plicativa seja $evolvi$a. Fembre-se $e aproveitar $os recursos $o /clipse para isto: $i%itan$o apenas o come,o $o nome $o m)to$o a ser reescrito e pressionan$o ctrl J espao# ele vai su%erir reescrever o m)to$o# poupan$o o trabalho $e escrever a assinatura $o m)to$o e cometer al%um en%ano.
pu"lic a"stract class +onta ! private #ou"le sal#o; pu"lic Strin toStrin () ! return "esse o"'eto T uma conta com sal#o [a" L this.sal#o; & (( restante #a classe &

'mprima novamente uma refer!ncia a +onta. 1 que aconteceuC Y. Eeescreva o m)to$o e)uals $a classe +onta para que $uas contas com o mesmo n'mero

de conta sejam consi$era$as i%uais. 2ara isso# voc! vai precisar $e um atributo numero. /sbo,o:
pu"lic a"stract class +onta ! private int numero; pu"lic "oolean e)uals(2"'ect o"') ! +onta outra+onta G (+onta) o"'; & & return this.numero GG outra+onta.numero; etter e setter para numeroF usan#o Cclipse!

(( colo)ue

4oc! po$e usar o ctrl J espao $o /clipse para escrever o esqueleto $o m)to$o e)uals# basta $i%itar $entro $a classe e)u e pressionar ctrl J espao. Crie uma classe Pesta+omparacao+onta e# $entro $o main# crie $uas inst[ncias $e +onta+orrente com n6meros i%uais. 5 compare elas com GG e $epois com e)uals. A. 8m #ou"le n(o est& sen$o suficiente para %uar$ar a quanti$a$e $e casas necess&rias em uma aplica,(o. 2reciso %uar$ar um n6mero $ecimal muito %ran$eO 1 que po$eria usarC 1 #ou"le tamb)m tem problemas $e precis(o ao fazer contas# por causa $e arre$on$amentos $a aritm)tica $e ponto flutuante $efini$o pela '/// NJK: http://en.wiGipe$ia.or%/wiGi/'///`NJK /le n(o $eve ser usa$o se voc! precisa realmente $e muita precis(o 9casos que envolvam $inheiro# por e emplo:. Consulte a documentao# tente a$ivinhar on$e voc! po$e encontrar um tipo que te aju$aria para resolver esses casos e veja como ) intuitivoO @ual ) a classe que resolveria esses problemasC Fembre-se: no .ava h& muito j& pronto. *eja na biblioteca pa$r(o# seja em bibliotecas open source que voc! po$e encontrar pela internet. 1B.9opcional: ;a,a com que o e)uals $a sua classe +onta tamb)m leve em consi$era,(o a Strin $o nome $o cliente a qual ela pertence. *e sua +onta n(o possuir o atributo nome# crie-o. Heste se o m)to$o cria$o est& funcionan$o corretamente. 11.9opcional: Crie a classe \uar#a#orEe2"'etos como visto nesse captulo. Crie uma classe Pesta\uar#a#or e $entro $o main crie uma +onta+orrente e a$icione-a em um \uar#a#orEe2"'etos. 3epois teste pe%ar essa refer!ncia como +ontaPoupanca# usan$o castin%:
\uar#a#orEe2"'etos uar#a#or G new \uar#a#orEe2"'etos(); +onta+orrente cc G new +onta+orrente(); uar#a#or.a#iciona2"'eto(cc); (( vai precisar #o castin para compilar! (( use +trlL/ para o Cclipse erar para vocX +ontaPoupanca cp G uar#a#or.pe a(-);

Eepare na e ception que ) lan,a$a. @ual ) o tipo $elaC Heste tamb)m o autobo in% $o .ava J.B# passan$o um inteiro para nosso %uar$a$or. 1=.9opcional: /screva um m)to$o que usa os m)to$os charJt e len th $e uma Strin para imprimir a mesma caractere a caractere# com ca$a caractere em uma linha $iferente.

1R.9opcional: Eeescreva o m)to$o $o e erccio anterior# mas mo$ifican$o ele para que imprima a Strin $e tr&s para a frente e em uma linha s+. Heste-a para '/ocorram)me& subi no >nibus em ?arrocos' e 'anotaram a data da maratona'. 1K.9opcional: 3a$a uma frase# reescreva essa frase com as palavras na or$em inverti$a. '/ocorram)me& subi no >nibus em ?arrocos' $eve retornar '?arrocos em >nibus no subi /ocorram)me&'. 8tilize o m)to$o split $a Strin para te au iliar. 1J.9opcional: 2esquise a classe Strin Suil#er 9ou *trin%Buffer no .ava 1.K:. /la ) mut&vel. 2or que us&-la em vez $a Strin C @uan$o us&-laC Como voc! po$eria reescrever o m)to$o $e escrever a Strin $e tr&s para a frente usan$o um Strin Suil#erC

16.11 - >esa-io
1. Converta uma Strin para um n6mero sem usar as bibliotecas $o java que j& fazem isso. 'sso )# uma Strin A G "ZN7" $eve %erar um int i G ZN7. 2ara aju$ar# saiba que um char po$e ser "transforma$o" em int com o mesmo valor num)rico fazen$o:
char c G @:@; int i G c * @-@; (( i vale :!

5qui estamos nos aproveitan$o $o conhecimento $a tabela unico$e: os n6meros $e B a A est(o em sequ!nciaO 4oc! po$eria usar o m)to$o est&tico +haracter. etDumeric5alue(char) em vez $isso. &ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

16.12 - >iscusso em aulaF O que voc, precisa -a.er em Java?


@ual ) a sua necessi$a$e com o .avaC 2recisa fazer al%oritmos $e re$es neuraisC 7erar %r&ficos R3C Eelat+rios em 23;C 7erar c+$i%o $e barraC 7erar boletosC 4ali$ar C2;C "e er com um arquivo $o / celC 1 instrutor vai mostrar que para a maioria absoluta $as suas necessi$a$es# al%u)m j& fez uma biblioteca e a $isponibilizou. Captulo 1J

Eacote java.io
"5 benevol!ncia ) sobretu$o um vcio $o or%ulho e n(o uma virtu$e $a alma." 5o t)rmino $esse captulo# voc! ser& capaz $e: ler e escrever bDtes# caracteres e *trin%s $e/para a entra$a e sa$a pa$r(o? ler e escrever bDtes# caracteres e *trin%s $e/para arquivos? utilizar buffers para a%ilizar a leitura e escrita atrav)s $e flu os? usar *canner e 2rint*tream.

19.1 - Con$ecendo uma AE8


4amos passar a conhecer 52's $o .ava. 'ava.io e 'ava.util possuem as classes que voc! mais comumente vai usar# n(o importan$o se seu aplicativo ) $esGtop# web# ou mesmo para celulares. 5pesar $e ser importante conhecer nomes e m)to$os $as classes mais utiliza$as# o interessante aqui ) que voc! en er%ue que to$os os conceitos previamente estu$a$os s(o aplica$os a to$a hora nas classes $a biblioteca pa$r(o. 0(o se preocupe em $ecorar nomes. 5tenha-se em enten$er como essas classes est(o relaciona$as e como elas est(o tiran$o proveito $o uso $e interfaces# polimorfismo# classes abstratas e encapsulamento. Fembre-se $e estar com a $ocumenta,(o 9java$oc: aberta $urante o contato com esses pacotes. 4eremos tamb)m threa$s e socGets em captulos posteriores# que aju$ar(o a con$ensar nosso conhecimento# ten$o em vista que no e erccio $e socGets utilizaremos to$os conceitos apren$i$os# juntamente com as v&rias 52's.

19.2 - Orientao a objetos no java.io


5ssim como to$o o resto $as bibliotecas em .ava# a parte $e controle $e entra$a e sa$a $e $a$os 9conheci$o como io: ) orienta$a a objetos e usa os principais conceitos mostra$os at) a%ora: interfaces# classes abstratas e polimorfismo. 5 i$eia atr&s $o polimorfismo no pacote 'ava.io ) $e utilizar flu os $e entra$a 9QnputStream: e $e sa$a 92utputStream: para to$a e qualquer opera,(o# seja ela relativa a um arquivo# a um campo blob $o banco $e $a$os# a uma cone (o remota via socMets# ou at) mesmo <s entrada e sa"da padro $e um pro%rama 9normalmente o tecla$o e o console:. 5s classes abstratas QnputStream e 2utputStream $efinem# respectivamente# o comportamento pa$r(o $os flu os em .ava: em um flu o $e entra$a# ) possvel ler bDtes e# no flu o $e sa$a# escrever bDtes. 5 %ran$e vanta%em $essa abstra,(o po$e ser mostra$a em um m)to$o qualquer que utiliza um 2utputStream recebi$o como ar%umento para escrever em um flu o $e sa$a. 2ara on$e o m)to$o est& escreven$oC 0(o se sabe e n(o importa: quan$o o sistema precisar escrever em um arquivo ou em uma socGet# basta chamar o mesmo m)to$o# j& que ele aceita qualquer filha $e 2utputStreamO Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

19.% - 8nput tream4 8nput tream;eader e Pu--ered;eader


2ara ler um "yte $e um arquivo# vamos usar o leitor $e arquivo# o 8ileQnputStream. 2ara um 8ileQnputStream conse%uir ler um bDte# ele precisa saber $e on$e ele $ever& ler. /ssa informa,(o ) t(o importante que quem escreveu essa classe obri%a voc! a passar o nome $o arquivo pelo construtor: sem isso o objeto n(o po$e ser constru$o.
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); int " G is.rea#(); & &

5 classe QnputStream ) abstrata e 8ileQnputStream uma $e suas filhas concretas. 8ileQnputStream vai procurar o arquivo no $iret+rio em que a .4" fora invoca$a 9no caso $o /clipse# vai ser a partir $e $entro $o $iret+rio $o projeto:. 5lternativamente voc! po$e usar um caminho absoluto. @uan$o trabalhamos com 'ava.io# $iversos m)to$os lan,am Q2CAception# que ) uma e ception $o tipo checGe$ - o que nos obri%a a trat&-la ou $eclar&-la. 0os e emplos aqui# estamos $eclaran$o Q2CAception atrav)s $a clausula throws $o main apenas para facilitar o e emplo. Caso a e ception ocorra# a .4" vai parar# mostran$o a stacGtrace. /sta n(o ) uma boa pr&tica em uma aplica,(o real: trate suas e ceptions para sua aplica,(o po$er abortar ele%antemente. QnputStream tem $iversas outras filhas# como 2"'ectQnputStream# Ju#ioQnputStream# SyteJrrayQnputStream# entre outras. 2ara recuperar um caractere# precisamos tra$uzir os bDtes com o enco$in% $a$o para o respectivo c+$i%o unico$e# isso po$e usar um ou mais bDtes. /screver esse $eco$ifica$or ) muito complica$o# quem faz isso por voc! ) a classe QnputStream[ea#er.
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); int c G isr.rea#(); & &

1 construtor $e QnputStream[ea#er po$e receber o enco$in% a ser utiliza$o como par[metro# se $eseja$o# tal como eP8*< ou QS2*<<;Y*/. =ncodin#s 3evi$o a %ran$e quanti$a$e $e aplicativos internacionaliza$os $e hoje em $ia# ) imprescin$vel que um bom pro%rama$or enten$a bem o que s(o os character enco$in%s e o 8nico$e. 1 blo% $a Caelum possui um bom arti%o a respeito: http://blo%.caelum.com.br/=BBQ/1B/==/enten$en$o-unico$e-e-os-character-enco$in%s/ QnputStream[ea#er ) filha $a classe abstrata [ea#er# que possui $iversas outras filhas - s(o

classes que manipulam chars. 5pesar $a classe abstrata [ea#er j& aju$ar no trabalho $e manipula,(o $e caracteres# ain$a seria $ifcil pe%ar uma Strin . 5 classe Suffere#[ea#er ) um [ea#er que recebe outro [ea#er pelo construtor e concatena os $iversos chars para formar uma Strin atrav)s $o m)to$o rea#9ine:
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); Strin s G "r.rea#9ine(); & &

Como o pr+prio nome $iz# essa classe l! $o [ea#er por pe$a,os 9usan$o o buffer: para evitar realizar muitas chama$as ao sistema operacional. 4oc! po$e at) confi%urar o tamanho $o buffer pelo construtor. L essa a composi,(o $e classes que est& acontecen$o:

/sse pa$r(o $e composi,(o ) bastante utiliza$o e conheci$o. L o >ecorator Eattern. 5qui# lemos apenas a primeira linha $o arquivo. 1 m)to$o rea#9ine $evolve a linha que foi li$a e mu$a o cursor para a pr+ ima linha. Caso ele che%ue ao fim $o [ea#er 9no nosso caso# fim $o arquivo:# ele vai $evolver null. /nt(o# com um simples la,o# po$emos ler o arquivo por inteiro:
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); Strin s G "r.rea#9ine(); (( primeira linha

while (s !G null) ! System.out.println(s); s G "r.rea#9ine(); & "r.close(); & &

19.6 - Nendo trin#s do teclado


Com um passe $e m&%ica# passamos a ler $o tecla$o em vez $e um arquivo# utilizan$o o System.in# que ) uma refer!ncia a um QnputStream o qual# por sua vez# l! $a entra$a pa$r(o.
class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G System.in; QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); Strin s G "r.rea#9ine(); while (s !G null) !

& & &

System.out.println(s); s G "r.rea#9ine();

5penas mo$ificamos a quem a vari&vel is est& se referin$o. 2o$emos receber ar%umentos $o tipo QnputStream e ter esse tipo $e abstra,(o: n(o importa e atamente $e on$e estamos len$o esse punha$o $e bDtes# $es$e que a %ente receba a informa,(o que estamos queren$o. Como na fi%ura:

Eepare que a ponta $a $ireita po$eria ser qualquer QnputStream# seja 2"'ectQnputStream# Ju#ioQnputStream# SyteJrrayQnputStream# ou a nossa 8ileQnputStream. 2olimorfismoO 1u voc! mesmo po$e criar uma filha $e QnputStream# se $esejar. 2or isso ) muito comum m)to$os receberem e retornarem QnputStream# em vez $e suas filhas especficas. Com isso# elas $esacoplam as informa,-es e escon$em a implementa,(o# facilitan$o a mu$an,a e manuten,(o $o c+$i%o. Eepare que isso vai ao encontro $e tu$o o que apren$emos $urante os captulos que apresentaram classes abstratas# interfaces# polimorfismo e encapsulamento.

19.9 - A analo#ia para a escritaF Output tream


Como voc! po$e ima%inar# escrever em um arquivo ) o mesmo processo:

class PestaSai#a ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! 2utputStream os G new 8ile2utputStream("sai#a.tAt"); 2utputStreamfriter osw G new 2utputStreamfriter(os); Suffere#friter "w G new Suffere#friter(osw); "w.write("caelum"); "w.close(); & &

Fembre-se $e $ar re"resh 9clique $a $ireita no nome $o projeto# refresh: no seu projeto $o /clipse para que o arquivo cria$o apare,a. 1 8ile2utputStream po$e receber um booleano como se%un$o par[metro# para in$icar se voc! quer reescrever o arquivo ou manter o que j& estava escrito 9appen#:. 1 m)to$o write $o Suffere#friter n(o insere o9s: caractere9s: $e quebra $e linha. 2ara isso# voc! po$e chamar o m)to$o new9ine. /ec$ando o arquivo com o -inall2 e o tr2-5it$-resources L importante sempre fechar o arquivo. 4oc! po$e fazer isso chaman$o $iretamente o m)to$o close $o 8ileQnputStream/2utputStream# ou ain$a chaman$o o close $o Suffere#[ea#er/friter. 0esse 6ltimo caso# o close ser& cascatea$o para os objetos os quais o Suffere#[ea#er/friter utiliza para realizar a leitura/escrita# al)m $ele fazer o -lus$ $os buffers no caso $a escrita. L comum e fun$amental que o close esteja $entro $e um bloco finally. *e um arquivo for

esqueci$o aberto e a refer!ncia para ele for per$i$a# po$e ser que ele seja fecha$o pelo garbage collector# que veremos mais a frente# por causa $o finaliMe. "as n(o ) bom voc! se pren$er a isso. *e voc! esquecer $e fechar o arquivo# no caso $e um pro%rama min6sculo como esse# o pro%rama vai terminar antes que o tal $o %arba%e collector te aju$e# resultan$o em um arquivo n(o escrito 9os bDtes ficaram no buffer $o Suffere#friter:. 2roblemas similares po$em acontecer com leitores que n(o forem fecha$os. 0o .ava N h& a estrutura tr3)+ith)resources# que j& far& o finally cui$ar $os recursos $eclara$os $entro $o try()# invocan$o close. 2ra isso# os recursos $evem implementar a interface 'ava.lan .Juto+losea"le# que ) o caso $os Eea$ers# Priters e *treams estu$a$os aqui:
try (Suffere#[ea#er "r G new Suffere#[ea#er(new 8ile("ar)uivo.tAt"))) ! (( com eAceo ou noF o close() #o "r sera invoca#o &

J1 con$ece os cursos online Alura?

5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.

19.< - )ma maneira mais -1cilF canner e Erint tream


5 partir $o .ava J# temos a classe 'ava.util.Scanner# que facilita bastante o trabalho $e ler $e um QnputStream. 5l)m $isso# a classe PrintStream possui um construtor que j& recebe o nome $e um arquivo como ar%umento. 3essa forma# a leitura $o tecla$o com sa$a para um arquivo ficou muito simples:
Scanner s G new Scanner(System.in); PrintStream ps G new PrintStream("ar)uivo.tAt"); while (s.hasDeAt9ine()) ! ps.println(s.neAt9ine()); &

0enhum $os m)to$os lan,a Q2CAception: PrintStream lan,a 8ileDot8oun#CAception se voc! o construir passan$o uma Strin . /ssa e ce,(o ) filha $e Q2CAception e in$ica que o arquivo n(o foi encontra$o. 1 Scanner consi$erar& que che%ou ao fim se uma Q2CAception for lan,a$a# mas o PrintStream simplesmente en%ole e ceptions $esse tipo. 5mbos possuem m)to$os para voc! verificar se al%um problema ocorreu. 5 classe Scanner ) $o pacote 'ava.util. /la possui m)to$os muito 6teis para trabalhar com *trin%s# em especial# $iversos m)to$os j& prepara$os para pe%ar n6meros e palavras j& formata$as atrav)s $e e press-es re%ulares. ;ica f&cil parsear um arquivo com qualquer formato $a$o. 2stem.out Como vimos no captulo passa$o# o atributo out $a classe System ) $o tipo PrintStream 9e# portanto# ) um 2utputStream:.

19.@ - )m pouco mais...


/ istem $uas classes chama$as 'ava.io.8ile[ea#er e 'ava.io.8ilefriter. /las s(o atalhos para a leitura e escrita $e arquivos. 1 #o ! .. & while(con#icao); ) uma alternativa para se construir um la,o. 2esquise-o e utilize-o no c+$i%o para ler um arquivo# ele vai ficar mais sucinto 9voc! n(o precisar& ler a primeira linha fora $o la,o:.

19.A - =!erc"ciosF Java 8VO


1. Crie um projeto novo chama$o teste*io. /# nele# crie um pro%rama 9simplesmente uma classe com um main: que leia $a entra$a pa$r(o. 2ara isso# voc! vai precisar $e um Suffere#[ea#er que leia $o System.in $a mesma forma como fizemos. 0(o $i%ite esses nomes $e classes complica$osO Fembre-se $e fazer como o instrutor e escrever primeiro a parte $epois $o i%ual. /nt(o# use o ctrl J 1 para que o /clipse crie a vari&vel para voc!O 5ssim mesmo# enquanto voc! escreve a parte $a $ireita# abuse $o ctrl J espao porque al)m $e te aju$ar com o nome# ele colocar& o import no $evi$o lu%ar. CuidadoF e iste mais $e uma classe chama$a QnputStream: queremos a $o pacote 'ava.io.
pu"lic class PestaCntra#a ! pu"lic static voi# main(Strin $% ar s) ! QnputStream is G System.in; QnputStream[ea#er isr G new QnputStream[ea#er(is); Suffere#[ea#er "r G new Suffere#[ea#er(isr); System.out.println("Ei ite sua mensa em,"); Strin linha G "r.rea#9ine(); (( primeira linha while (linha !G null) ! System.out.println(linha); linha G "r.rea#9ine(); & & &

1 compila$or vai reclamar que voc! n(o est& tratan$o al%umas e ce,-es 9como 'ava.io.Q2CAception:. 8tilize a cl&usula throws para $ei ar "escapar" a e ce,(o pelo seu main# ou use os $evi$os try/catch. 8tilize o quic! "i# $o /clipse para isso 9ctrl J 1:. 4ale lembrar que $ei ar to$as as e ceptions passarem $espercebi$as n(o ) uma boa pr&ticaO 4oc! po$e usar aqui# pois estamos focan$o apenas no apren$iza$o $a utiliza,(o $o 'ava.io. Eo$e sua aplica,(o. 5trav)s $a <ie+ Console voc! po$e $i%itar al%umas linhas para que seu pro%rama as capture. =O/ @uan$o ro$ar sua aplica,(o# para encerrar a entra$a $e $a$os $o tecla$o# ) necess&rio enviarmos um sinal $e fim $e stream. L o famoso =O/# isto )# end o" "ile. 0o Finu /"ac/*olaris/8ni voc! faz isso com o ctrl L E. 0o Pin$ows# use o ctrl L `.

=. @uan$o trabalhamos com recursos que falam com a parte e terna < nossa aplica,(o# ) preciso que avisemos quan$o acabarmos $e usar esses recursos. 2or isso# ) important"ssimo lembrar $e fechar os canais com o e terior que abrimos. ;elizmente para n+s# n(o ) necess&rio fechar ca$a um $os canais $e comunica,(o que abrimos 9is# isr e "r: porque# ao fechar a comunica,(o com o Suffere#[ea#er# ele mesmo j& trata $e fechar os recursos $os quais ele $epen$e. /nt(o# basta a$icionarmos a se%uinte instru,(o# $epois que recebermos a 6ltima informa,(o pelo [ea#er:
"r.close();

R. 4amos ler $e um arquivo# em vez $o tecla$o. 5ntes# vamos criar o arquivo que ser& li$o pelo pro%rama: 1. 8se o ctrl J B para criar um novo arquivo e comece a $i%itar 8ile. 8se as setinhas para che%ar na op,(o ;ile e $! enter para escolh!-la: =. Com o nome $o projeto seleciona$o# $i%ite o nome ar)uivo.tAt no campo 8ile name: R. Hroque na classe PestaCntra#a o System.in por um new 8ileQnputStream:
QnputStream is G new 8ileQnputStream("ar)uivo.tAt");

K. 9conceitual: *eu pro%rama l! to$as as linhas $esse arquivo. Eepare na utiliza,(o $o polimorfismo. Como ambos s(o QnputStream# isso faz com que eles se encai em no QnputStream[ea#er. 5l)m $a ;ile'nput*tream# que outras classes po$eriam tomar seu lu%arC 1lhe na $ocumenta,(oO J. Eepare que# no final# s+ usamos mesmo o Suffere#[ea#er. 5s refer!ncias para QnputStream e para QnputStream[ea#er s(o apenas utiliza$as temporariamente. 2ortanto# ) comum encontrarmos o se%uinte c+$i%o nesses casos:
Suffere#[ea#er "r G new Suffere#[ea#er( new QnputStream[ea#er( new 8ileQnputStream("ar)uivo.tAt"))); Strin linha G "r.rea#9ine(); (( primeira linha

Claro que# principalmente em lin%ua%ens $e alto nvel como o .ava# preferimos le%ibili$a$e em vez $e um c+$i%o mais curto# mas este c+$i%o em particular ) bem comum e aceit&vel. ;a,a a altera,(o no seu pro%ramaO Q. 8tilize a classe Scanner $o .ava J para ler $e um arquivo e colocar na tela. 1 c+$i%o vai ficar incrivelmente pequeno.
pu"lic class Cntra#aEeemJr)uivo ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! QnputStream is G new 8ileQnputStream("ar)uivo.tAt"); Scanner entra#a G new Scanner(is); System.out.println("Ei ite sua mensa em,"); while (entra#a.hasDeAt9ine()) ! System.out.println(entra#a.neAt9ine()); &

entra#a.close(); & &

3epois troque a vari&vel is para que ela se refira ao System.in. 5%ora voc! est& len$o $o tecla$oO N. 9opcional: 5ltere seu pro%rama para que ele leia $o arquivo e# em vez $e jo%ar na tela# jo%ue em um outro arquivo. 4oc! vai precisar# al)m $o c+$i%o anterior para ler $e um arquivo# $o c+$i%o para escrever em um arquivo. 2ara isso# voc! po$e usar o Suffere#friter ou o PrintStream. /ste 6ltimo ) $e mais f&cil manipula,(o. *e for usar o Suffere#friter# fazemos assim parar abri-lo:
2utputStream os G new 8ile2utputStream("sai#a.tAt"); 2utputStreamfriter osw G new 2utputStreamfriter(os); Suffere#friter "w G new Suffere#friter(osw);

3entro $o loop $e leitura $o tecla$o# voc! $eve usar "w.write(A)# on$e A ) a linha que voc! leu. 8se "w.new9ine() para pular $e linha. 0(o se esque,a $e# no t)rmino $o loop# $ar um "w.close(). 4oc! po$e se%uir o mo$elo:
while (entra#a.hasDeAt9ine()) ! Strin linha G entra#a.neAt9ine(); "w.write(linha); "w.new9ine(); & "w.close();

5p+s ro$ar seu pro%rama# $! um refresh no seu projeto 9clique $a $ireita no nome $o projeto# refresh: e veja que ele criou um arquivo sai#a.tAt no $iret+rio. Y. 9opcional: 5ltere novamente o pro%rama para ele virar um pequeno e$itor: l! $o tecla$o e escreve em arquivo. Eepare que a mu$an,a a ser feita ) mnimaO A. 9opcional: 5 classe Scanner ) muito po$erosaO Consulte seu java$oc para saber sobre o #elimiter e os outros m)to$os neAt. +oc, no est1 nessa p1#ina a toa

4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

19.C - >iscusso em aulaF >esi#n Eatterns e o &emplate 0et$od


5plicar bem os conceitos $e orienta,(o a objetos ) sempre uma %ran$e $6vi$a. *empre queremos encapsular $ireito# favorecer a fle ibili$a$e# $esacoplar classes# escrever c+$i%o ele%ante e $e f&cil manuten,(o. / ouvimos falar que a 1rienta,(o a 1bjetos aju$a em tu$o isso. "as# on$e usar heran,a $e forma sau$&velC Como usar interfacesC 1n$e o polimorfismo me aju$aC Como encapsular $ireitoC Classes abstratas s(o usa$as em que situa,-esC

"uitos anos atr&s# %ran$es nomes $o mun$o $a orienta,(o a objetos perceberam que criar bons $esi%ns orienta$os a objetos era um %ran$e $esafio para muitas pessoas. 2erceberam que muitos problemas $e 11 apareciam recorrentemente em v&rios projetos? e que as pessoas j& tinham certas solu,-es para esses problemas cl&ssicos 9nem sempre muito ele%antes:. 1 que fizeram foi criar solu:es padr:es para problemas comuns na orienta,(o a objetos# e chamaram isso $e >esi#n Eatterns# ou 2a$r-es $e 2rojeto. 1 conceito vinha $a arquitetura on$e era muito comum ter esse tipo $e solu,(o. /# em 1AAK# %anhou %ran$e populari$a$e na computa,(o com o livro 1esign $atterns: 2lements o" ,eusable Object)Oriented /o"t+are# um cat&lo%o com v&rias $essas solu,-es escrito por /rich 7amma# Ealph .ohnson# Eichar$ >elm e .ohn 4lissi$es 9a 7an%ue $os @uatro# 7o;:. 1esign $atterns tornou-se refer!ncia absoluta no bom uso $a orienta,(o a objetos. 1utros pa$r-es sur%iram $epois# em outras literaturas i%ualmente consa%ra$as. 1 conhecimento $essas t)cnicas ) imprescin$vel para o bom pro%rama$or. >iscuta com o instrutor como >esi#n Eatterns ajudam a resolver problemas de modela#em em sistemas orientados a objetos. +eja como >esi#n Eatterns so aplicados em muitos lu#ares do pr*prio Java. 1 instrutor comentar& $o Pemplate Metho# e mostrar& o c+$i%o fonte $o m)to$o rea$9: $a classe 'ava.io.QnputStream:
pu"lic int rea#("yte "$%F int offF int len) throws Q2CAception ! if (" GG null) ! throw new DullPointerCAception(); & else if (off 3 - WW len 3 - WW len 4 ".len th * off) ! throw new Qn#eA2ut2fSoun#sCAception(); & else if (len GG -) ! return -; & int c G rea#(); if (c GG */) ! return */; & "$off% G ("yte) c; int i G /; try ! for (; i 3 len ; iLL) ! c G rea#(); if (c GG */) ! "rea0; & "$off L i% G ("yte)c; & & catch (Q2CAception ee) ! & return i;

&

>iscuta em aula como esse mtodo aplica conceitos importantes da orientao a objetos e promove -le!ibilidade e e!tensibilidade. Captulo 1Q

Collections -rame5orM
"5 amiza$e ) um contrato se%un$o o qual nos comprometemos a prestar pequenos favores para que no-los retribuam com %ran$es." 5o t)rmino $esse captulo# voc! ser& capaz $e: utilizar arraDs# lists# sets ou maps $epen$en$o $a necessi$a$e $o pro%rama? iterar e or$enar listas e cole,-es? usar mapas para inser,(o e busca $e objetos.

1<.1 - Arra2s so trabal$osos4 utili.ar estrutura de dados


Como vimos no captulo $e arraDs# manipul&-las ) bastante trabalhoso. /ssa $ificul$a$e aparece em $iversos momentos: n(o po$emos re$imensionar um arraD em .ava? ) impossvel buscar $iretamente por um $etermina$o elemento cujo n$ice n(o se sabe? n(o conse%uimos saber quantas posi,-es $o arraD j& foram popula$as sem criar# para isso# m)to$os au iliares.

0a fi%ura acima# voc! po$e ver um arraD que antes estava sen$o completamente utiliza$o e que# $epois# teve um $e seus elementos removi$os. *upon$o que os $a$os armazena$os representem contas# o que acontece quan$o precisarmos inserir uma nova conta no bancoC 2recisaremos procurar por um espa,o vazioC 7uar$aremos em al%uma estrutura $e $a$os e terna# as posi,-es vaziasC / se n(o houver espa,o vazioC Heramos $e criar um arraD maior e copiar os $a$os $o anti%o para eleC >& mais quest-es: como posso saber quantas posi,-es est(o sen$o usa$as no arraDC 4ou precisar sempre percorrer o arraD inteiro para conse%uir essa informa,(oC 5l)m $essas $ificul$a$es que os arraDs apresentavam# faltava um conjunto robusto $e classes para suprir a necessi$a$e $e estruturas $e $a$os b&sicas# como listas li%a$as e tabelas $e espalhamento. Com esses e outros objetivos em mente# o comit! respons&vel pelo .ava criou um conjunto $e classes e interfaces conheci$o como Collections /rame5orM# que resi$e no pacote 'ava.util $es$e o .ava= 1.=. Collections 5 AE8 $o Collections ) robusta e possui $iversas classes que representam estruturas $e $a$os avan,a$as. 2or e emplo# n(o ) necess&rio reinventar a ro$a e criar uma lista li%a$a# mas sim utilizar aquela que o .ava $isponibiliza.

1<.2 - NistasF java.util.Nist


8m primeiro recurso que a 52' $e +ollections traz s(o listas. 8ma lista ) uma cole,(o que permite elementos $uplica$os e mant)m uma or$ena,(o especfica entre os elementos. /m outras palavras# voc! tem a %arantia $e que# quan$o percorrer a lista# os elementos ser(o encontra$os em uma or$em pr)-$etermina$a# $efini$a na hora $a inser,(o $os mesmos. /la resolve

to$os os problemas que levantamos em rela,(o ao arraD 9busca# remo,(o# tamanho "infinito"#...:. /sse c+$i%o j& est& prontoO 5 52' $e +ollections traz a interface 'ava.util.9ist# que especifica o que uma classe $eve ser capaz $e fazer para ser uma lista. >& $iversas implementa,-es $isponveis# ca$a uma com uma forma $iferente $e representar uma lista. 5 implementa,(o mais utiliza$a $a interface 9ist ) a Jrray9ist# que trabalha com um arraD interno para %erar uma lista. 2ortanto# ela ) mais r&pi$a na pesquisa $o que sua concorrente# a 9in0e#9ist# que ) mais r&pi$a na inser,(o e remo,(o $e itens nas pontas. Arra2Nist no um arra2O L comum confun$irem uma Jrray9ist com um arraD# por)m ela n(o ) um arraD. 1 que ocorre ) que# internamente# ela usa um arraD como estrutura para armazenar os $a$os# por)m este atributo est& propriamente encapsula$o e voc! n(o tem como acess&-lo. Eepare# tamb)m# que voc! n(o po$e usar $% com uma Jrray9ist# nem acessar atributo len th. 0(o h& rela,(oO 2ara criar um Jrray9ist# basta chamar o construtor:
Jrray9ist lista G new Jrray9ist();

L sempre possvel abstrair a lista a partir $a interface 9ist:


9ist lista G new Jrray9ist();

2ara criar uma lista $e nomes 9Strin :# po$emos fazer:


9ist lista G new Jrray9ist(); lista.a##("Manoel"); lista.a##("Joa)uim"); lista.a##("Maria");

5 interface 9ist possui $ois m)to$os a### um que recebe o objeto a ser inseri$o e o coloca no final $a lista# e um se%un$o que permite a$icionar o elemento em qualquer posi,(o $a mesma. 0ote que# em momento al%um# $izemos qual ) o tamanho $a lista? po$emos acrescentar quantos elementos quisermos# que a lista cresce conforme for necess&rio. Ho$a lista 9na ver$a$e# to$a +ollection: trabalha $o mo$o mais %en)rico possvel. 'sto )# n(o h& uma Jrray9ist especfica para Strin s# outra para 06meros# outra para 3atas etc. Ho$os os m)to$os trabalham com 2"'ect. 5ssim# ) possvel criar# por e emplo# uma lista $e Contas Correntes:
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(/--); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(7--); +onta+orrente c: G new +onta+orrente(); c:.#eposita(:--); 9ist contas G new Jrray9ist(); contas.a##(c/); contas.a##(c:); contas.a##(c7);

2ara saber quantos elementos h& na lista# usamos o m)to$o siMe():


System.out.println(contas.siMe());

>& ain$a um m)to$o et(int) que recebe como ar%umento o n$ice $o elemento que se quer recuperar. 5trav)s $ele# po$emos fazer um for para iterar na lista $e contas:
for (int i G -; i 3 contas.siMe(); iLL) ! contas. et(i); (( cR#i o no muito Util.... &

"as como fazer para imprimir o sal$o $essas contasC 2o$emos acessar o etSal#o() $iretamente ap+s fazer contas. et(i)C 0(o po$emos? lembre-se que to$a lista trabalha sempre com 2"'ect. 5ssim# a refer!ncia $evolvi$a pelo et(i) ) $o tipo 2"'ect# sen$o necess&rio o cast para +onta+orrente se quisermos acessar o etSal#o():
for (int i G -; i 3 contas.siMe(); iLL) ! +onta+orrente cc G (+onta+orrente) contas. et(i); System.out.println(cc. etSal#o()); & (( note )ue a or#em #os elementos no T altera#a

>& ain$a outros m)to$os# como remove() que recebe um objeto que se $eseja remover $a lista? e contains()# que recebe um objeto como ar%umento e $evolve true ou false# in$ican$o se o elemento est& ou n(o na lista. 5 interface 9ist e al%umas classes que a implementam po$em ser vistas no $ia%rama a se%uir:

Acesso aleat*rio e percorrendo listas com #et 5l%umas listas# como a Jrray9ist# t!m acesso aleat+rio aos seus elementos: a busca por um elemento em uma $etermina$a posi,(o ) feita $e maneira ime$iata# sem que a lista inteira seja percorri$a 9que chamamos $e acesso sequencial:. 0este caso# o acesso atrav)s $o m)to$o et(int) ) muito r&pi$o. Caso contr&rio# percorrer uma lista usan$o um for como esse que acabamos $e ver# po$e ser $esastroso. 5o percorrermos uma lista# $evemos usar sempre um Qterator ou enhance# for# como veremos. 8ma lista ) uma e celente alternativa a um arraD comum# j& que temos to$os os benefcios $e arraDs# sem a necessi$a$e $e tomar cui$a$o com remo,-es# falta $e espa,o etc. 5 outra implementa,(o muito usa$a# a 9in0e#9ist# fornece m)to$os a$icionais para obter e remover o primeiro e 6ltimo elemento $a lista. /la tamb)m tem o funcionamento interno $iferente# o que po$e impactar performance# como veremos $urante os e erccios no final $o captulo. +ector 1utra implementa,(o ) a tra$icional classe 5ector# presente $es$e o .ava 1.B# que foi a$apta$a para uso com o frameworG $e Collections# com a inclus(o $e novos m)to$os. /la $eve ser escolhi$a com cui$a$o# pois li$a $e uma maneira $iferente com processos corren$o em paralelo e ter& um custo a$icional em rela,(o a Jrray9ist quan$o n(o houver acesso simult[neo aos $a$os. eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em

ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

1<.% - Nistas no Java 9 e Java @ com (enerics


/m qualquer lista# ) possvel colocar qualquer 2"'ect. Com isso# ) possvel misturar objetos:
+onta+orrente cc G new +onta+orrente(); 9ist lista G new Jrray9ist(); lista.a##("ema strin "); lista.a##(cc); ...

"as e $epois# na hora $e recuperar esses objetosC Como o m)to$o et $evolve um 2"'ect# precisamos fazer o cast. "as com uma lista com v&rios objetos $e tipos $iferentes# isso po$e n(o ser t(o simples... 7eralmente# n(o nos interessa uma lista com v&rios tipos $e objetos mistura$os? no $ia-a-$ia# usamos listas como aquela $e contas correntes. 0o .ava J.B# po$emos usar o recurso $e 7enerics para restrin%ir as listas a um $etermina$o tipo $e objetos 9e n(o qualquer 2"'ect::
9ist3+onta+orrente4 contas G new Jrray9ist3+onta+orrente4(); contas.a##(c/); contas.a##(c:); contas.a##(c7);

Eepare no uso $e um par[metro ao la$o $e 9ist e Jrray9ist: ele in$ica que nossa lista foi cria$a para trabalhar e clusivamente com objetos $o tipo +onta+orrente. 'sso nos traz uma se%uran,a em tempo $e compila,(o:
contas.a##("uma strin "); (( isso no compila mais!!

1 uso $e 7enerics tamb)m elimina a necessi$a$e $e castin%# j& que# se%uramente# to$os os objetos inseri$os na lista ser(o $o tipo +onta+orrente:
for(int i G -; i 3 contas.siMe(); iLL) ! +onta+orrente cc G contas. et(i); (( sem castin ! System.out.println(cc. etSal#o()); &

5 partir $o .ava N# se voc! instancia um tipo %en)rico na mesma linha $e sua $eclara,(o# n(o ) necess&rio passar os tipos novamente# basta usar new Jrray9ist34(). L conheci$o como operador diamante:
9ist3+onta+orrente4 contas G new Jrray9ist34();

1<.6 - A importLncia das inter-aces nas cole:es


4ale ressaltar a import[ncia $o uso $a interface 9ist: quan$o $esenvolvemos# procuramos sempre nos referir a ela# e n(o <s implementa,-es especficas. 2or e emplo# se temos um m)to$o que vai buscar uma s)rie $e contas no banco $e $a$os# po$eramos fazer assim:
class J encia ! pu"lic Jrray9ist3+onta4 "uscaPo#as+ontas() !

Jrray9ist3+onta4 contas G new Jrray9ist3+onta4(); (( para ca#a conta #o "anco #e #a#osF contas.a## return contas; & &

2or)m# para que precisamos retornar a refer!ncia especfica a uma Jrray9istC 2ara que ser t(o especficoC 3essa maneira# o $ia que optarmos por $evolver uma 9in0e#9ist em vez $e Jrray9ist# as pessoas que est(o usan$o o m)to$o "uscaPo#as+ontas po$er(o ter problemas# pois estavam fazen$o refer!ncia a uma Jrray9ist. 1 i$eal ) sempre trabalhar com a interface mais %en)rica possvel:
class J encia ! (( mo#ificao apenas no retorno, pu"lic 9ist3+onta4 "uscaPo#as+ontas() ! Jrray9ist3+onta4 contas G new Jrray9ist34(); (( para ca#a conta #o "anco #e #a#osF contas.a## return contas; & &

L o mesmo caso $e preferir referenciar aos objetos com QnputStream como fizemos no captulo passa$o. 5ssim como no retorno# ) boa pr&tica trabalhar com a interface em to$os os lu%ares possveis: m)to$os que precisam receber uma lista $e objetos t!m 9ist como par[metro em vez $e uma implementa,(o em especfico como Jrray9ist# $ei an$o o m)to$o mais fle vel:
class J encia ! pu"lic voi# atualiMa+ontas(9ist3+onta4 contas) ! (( ... &

&

Hamb)m $eclaramos atributos como 9ist em vez $e nos comprometer como uma ou outra implementa,(o. 3essa forma obtemos um bai!o acoplamento: po$emos trocar a implementa,(o# j& que estamos pro%raman$o para a interfaceO 2or e emplo:
class Cmpresa ! private 9ist38uncionario4 empre a#os G new Jrray9ist34(); & (( ...

1<.9 - OrdenaoF Collections.sort


4imos anteriormente que as listas s(o percorri$as $e maneira pr)-$etermina$a $e acor$o com a inclus(o $os itens. "as# muitas vezes# queremos percorrer a nossa lista $e maneira or$ena$a. 5 classe +ollections traz um m)to$o est&tico sort que recebe um 9ist como ar%umento e o or$ena por or$em crescente. 2or e emplo:

9ist3Strin 4 lista G new Jrray9ist34(); lista.a##("STr io"); lista.a##("Paulo"); lista.a##("\uilherme"); (( repare )ue o toStrin #e Jrray9ist foi so"rescrito, System.out.println(lista); +ollections.sort(lista); System.out.println(lista);

5o testar o e emplo acima# voc! observar& que# primeiro# a lista ) impressa na or$em $e inser,(o e# $epois $e invocar o sort# ela ) impressa em or$em alfab)tica. "as to$a lista em .ava po$e ser $e qualquer tipo $e objeto# por e emplo# +onta+orrente. / se quisermos or$enar uma lista $e +onta+orrenteC /m que or$em a classe +ollections or$enar&C 2elo sal$oC 2elo nome $o correntistaC
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(;--); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(7--); +onta+orrente c: G new +onta+orrente(); c:.#eposita(/;-); 9ist3+onta+orrente4 contas G new Jrray9ist34(); contas.a##(c/); contas.a##(c:); contas.a##(c7); +ollections.sort(contas); (( )ual seria o critTrio para esta or#enao]

*empre que falamos em or$ena,(o# precisamos pensar em um critrio de ordenao# uma forma $e $eterminar qual elemento vem antes $e qual. L necess&rio instruir o sort sobre como comparar nossas +onta+orrente a fim $e $eterminar uma or$em na lista. 2ara isto# o m)to$o sort necessita que to$os seus objetos $a lista sejam compar1veis e possuam um m)to$o que se compara com outra +onta+orrente. Como ) que o m)to$o sort ter& a %arantia $e que a sua classe possui esse m)to$oC 'sso ser& feito# novamente# atrav)s $e um contrato# $e uma interfaceO 4amos fazer com que os elementos $a nossa cole,(o implementem a interface 'ava.lan .+ompara"le# que $efine o m)to$o int comparePo(2"'ect). /ste m)to$o $eve retornar .ero# se o objeto compara$o for i#ual a este objeto# um n6mero ne#ativo# se este objeto for menor que o objeto $a$o# e um n6mero positivo# se este objeto for maior que o objeto $a$o. 2ara or$enar as +onta+orrentes por sal$o# basta implementar o +ompara"le:
pu"lic class +onta+orrente eAten#s +onta implements +ompara"le3+onta+orrente4 ! (( ... to#o o cR#i o anterior fica a)ui pu"lic int comparePo(+onta+orrente outra) ! if (this.sal#o 3 outra.sal#o) ! return */; & if (this.sal#o 4 outra.sal#o) !

return /; & & & return -;

Com o c+$i%o anterior# nossa classe tornou-se "compar1vel": $a$os $ois objetos $a classe# conse%uimos $izer se um objeto ) maior# menor ou i%ual ao outro# se%un$o al%um crit)rio por n+s $efini$o. 0o nosso caso# a compara,(o ser& feita basean$o-se no sal$o $a conta. Eepare que o crit)rio $e or$ena,(o ) totalmente aberto# $efini$o pelo pro%rama$or. *e quisermos or$enar por outro atributo 9ou at) por uma combina,(o $e atributos:# basta mo$ificar a implementa,(o $o m)to$o comparePo na classe. @uan$o chamarmos o m)to$o sort $e +ollections# ele saber& como fazer a or$ena,(o $a lista? ele usar& o crit)rio que $efinimos no m)to$o comparePo. "as# e o e emplo anterior# com uma lista $e *trin%sC 2or que a or$ena,(o funcionou# naquele caso# sem precisarmos fazer na$aC *imples: quem escreveu a classe Strin 9lembre que ela ) uma classe como qualquer outra: implementou a interface +ompara"le e o m)to$o comparePo para Strin s# fazen$o compara,(o em or$em alfab)tica. 9Consulte a $ocumenta,(o $a classe Strin e veja o m)to$o comparePo l&:. 1 mesmo acontece com outras classes como Qnte er# Si Eecimal# Eate# entre outras. >e-inindo outros critrios de ordenao L possvel $efinir outros crit)rios $e or$ena,(o usan$o um objeto $o tipo +omparator. / iste um m)to$o sort em +ollections que recebe# al)m $a 9ist# um +omparator $efinin$o um crit)rio $e or$ena,(o especfico. L possvel ter v&rios +omparators com crit)rios $iferentes para usar quan$o for necess&rio. Outros mtodos da classe Collections 5 classe +ollections traz uma %ran$e quanti$a$e $e m)to$os est&ticos 6teis na manipula,(o $e cole,-es. "inarySearch(9istF 2"'ect): Eealiza uma busca bin&ria por $etermina$o elemento na lista or$ena$a e retorna sua posi,(o ou um n6mero ne%ativo# caso n(o encontra$o. maA(+ollection): Eetorna o maior elemento $a cole,(o. min(+ollection): Eetorna o menor elemento $a cole,(o. reverse(9ist): 'nverte a lista. ...e muitos outros. Consulte a $ocumenta,(o para ver outros m)to$os. / iste uma classe an&lo%a# a 'ava.util.Jrrays# que faz opera,-es similares com arraDs. L importante conhec!-las para evitar escrever c+$i%o j& e istente. A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum.

Conhe,a a 5lura.

1<.< - =!erc"ciosF Ordenao


1. 5bra sua classe +onta e veja se ela possui o atributo numero. *e n(o possuir# a$icione-o:
protecte# int numero;

/ %ere o %etter pelo /clipse# caso necess&rio. =. ;a,a sua classe +ontaPoupanca implementar a interface +ompara"le3+ontaPoupanca4. 8tilize o crit)rio $e or$enar pelo n6mero $a conta ou pelo seu sal$o 9como visto no c+$i%o $este captulo:.
pu"lic class +ontaPoupanca eAten#s +onta implements +ompara"le3+ontaPoupanca4 ! ... &

Eepare que o /clipse prontamente lhe oferecer& um quicGfi # oferecen$o a cria,(o $o esqueleto $os m)to$os $efini$os na interface +ompara"le:

3ei e o seu m)to$o comparePo pareci$o com este:


pu"lic class +ontaPoupanca eAten#s +onta implements +ompara"le3+ontaPoupanca4 ! (( ... to#o o cR#i o anterior fica a)ui pu"lic int comparePo(+ontaPoupanca o) ! if (this. etDumero() 3 o. etDumero()) ! return */; & if (this. etDumero() 4 o. etDumero()) ! return /; & return -; &

&

Outra implementao... 1 que acha $a implementa,(o abai oC


pu"lic int comparePo(+ontaPoupanca outra) ! return this. etDumero() * outra. etDumero(); &

R. Crie uma classe Pesta2r#enacao# on$e voc! vai instanciar $iversas contas e a$icion&las a uma 9ist3+ontaPoupanca4. 8se o +ollections.sort() nessa lista:
pu"lic class Pesta2r#enacao ! pu"lic static voi# main(Strin $% ar s) ! 9ist3+ontaPoupanca4 contas G new Jrray9ist34(); +ontaPoupanca c/ G new +ontaPoupanca(); c/.setDumero(/YZ:); contas.a##(c/);

+ontaPoupanca c7 G new +ontaPoupanca(); c7.setDumero(/6N7); contas.a##(c7); +ontaPoupanca c: G new +ontaPoupanca(); c:.setDumero(/<;6); contas.a##(c:); & & +ollections.sort(contas);

;a,a um la,o para imprimir to$os os n6meros $as contas na lista j& or$ena$a:
for (int i G -; i 3 contas.siMe(); iLL) ! +onta atual G contas. et(i); System.out.println("numero, " L atual. etDumero()); &

Ateno especial: repare que escrevemos um m)to$o comparePo em nossa classe e nosso c+$i%o nunca o invocaOO 'sto ) muito comum. Eeescrevemos 9ou implementamos: um m)to$o e quem o invocar& ser& um outro conjunto $e classes 9nesse caso# quem est& chaman$o o comparePo ) o +ollections.sort# que o usa como base para o al%oritmo $e or$ena,(o:. 'sso cria um sistema e tremamente coeso e# ao mesmo tempo# com bai o acoplamento: a classe +ollections nunca ima%inou que or$enaria objetos $o tipo +ontaPoupanca# mas j& que eles s(o +ompara"le# o seu m)to$o sort est& satisfeito. 4oc! po$eria escrever o for acima $e uma maneira mais sucinta:
for (int i G -; i 3 contas.siMe(); iLL) ! System.out.println("numero, " L contas. et(i). etDumero()); &

K. 1 que teria aconteci$o se a classe +ontaPoupanca n(o implementasse +ompara"le3+ontaPoupanca4 mas tivesse o m)to$o comparePoC ;a,a um teste: remova temporariamente a senten,a implements +ompara"le3+ontaPoupanca4# n(o remova o m)to$o comparePo e veja o que acontece. Basta ter o m)to$o# sem assinar a interfaceC J. 8tilize uma 9in0e#9ist em vez $e Jrray9ist:
9ist3+ontaPoupanca4 contas G new 9in0e#9ist34();

2recisamos alterar mais al%um c+$i%o para que essa substitui,(o funcioneC Eo$e o pro%rama. 5l%uma $iferen,aC Q. Como posso inverter a or$em $e uma listaC Como posso embaralhar to$os os elementos $e uma listaC Como posso rotacionar os elementos $e uma listaC 'nvesti%ue a $ocumenta,(o $a classe +ollections $entro $o pacote 'ava.util. N. 9opcional: *e preferir# insira novas contas atrav)s $e um la,o 9for:. 5$ivinhe o nome $a classe para colocar sal$os aleat+riosC [an#om. 3o pacote 'ava.util. Consulte sua $ocumenta,(o para us&-la 9utilize o m)to$o neAtQnt() passan$o o n6mero m& imo a ser sortea$o:. Y. 9opcional: 'mprima a refer!ncia para essa lista. Eepare que o toStrin $e uma Jrray9ist/9in0e#9ist ) reescritoC

System.out.println(contas);

A. 9opcional: "u$e o crit)rio $e compara,(o $a sua +ontaPoupanca. 5$icione um atributo nomeEo+liente na sua classe 9caso ain$a n(o e ista al%o semelhante: e tente mu$ar o comparePo para que uma lista $e +ontaPoupanca seja or$ena$a alfabeticamente pelo atributo nomeEo+liente. Heste a or$ena,(o.

1<.@ - ConjuntoF java.util. et


8m conjunto 9Set: funciona $e forma an&lo%a aos conjuntos $a matem&tica# ele ) uma cole,(o que n(o permite elementos $uplica$os. 1utra caracterstica fun$amental $ele ) o fato $e que a or$em em que os elementos s(o armazena$os po$e n(o ser a or$em na qual eles foram inseri$os no conjunto. 5 interface n(o $efine como $eve ser este comportamento. Hal or$em varia $e implementa,(o para implementa,(o.

8m conjunto ) representa$o pela interface Set e tem como suas principais implementa,-es as classes ^ashSet# 9in0e#^ashSet e PreeSet. 1 c+$i%o a se%uir cria um conjunto e a$iciona $iversos elementos# e al%uns repeti$os:
Set3Strin 4 car os G new ^ashSet34(); car car car car car car os.a##("\erente"); os.a##("Eiretor"); os.a##("Presi#ente"); os.a##("SecretIria"); os.a##("8uncionIrio"); os.a##("Eiretor"); (( repeti#o!

(( imprime na tela to#os os elementos System.out.println(car os);

5qui# o se%un$o Eiretor n(o ser& a$iciona$o e o m)to$o a## lhe retornar& false. 1 uso $e um Set po$e parecer $esvantajoso# j& que ele n(o armazena a or$em# e n(o aceita elementos repeti$os. 0(o h& m)to$os que trabalham com n$ices# como o et(int) que as listas possuem. 5 %ran$e vanta%em $o Set ) que e istem implementa,-es# como a ^ashSet# que possui uma performance incompar&vel com as 9ists quan$o usa$o para pesquisa 9m)to$o contains por e emplo:. 4eremos essa enorme $iferen,a $urante os e erccios. Ordem de um et *eria possvel usar uma outra implementa,(o $e conjuntos# como um PreeSet# que insere os elementos $e tal forma que# quan$o forem percorri$os# eles apare,am em uma or$em $efini$a pelo m)to$o $e compara,(o entre seus elementos. /sse m)to$o ) $efini$o pela interface 'ava.lan .+ompara"le. 1u# ain$a# po$e se passar um +omparator para seu construtor. .& o 9in0e#^ashSet mant)m a or$em $e inser,(o $os elementos. 5ntes $o .ava J# n(o po$amos utilizar %enerics# e us&vamos o Set $e forma que ele trabalhava com 2"'ect# haven$o necessi$a$e $e castin%s.

1<.A - Erincipais inter-acesF java.util.Collection


5s cole,-es t!m como base a interface +ollection# que $efine m)to$os para a$icionar e remover um elemento# e verificar se ele est& na cole,(o# entre outras opera,-es# como mostra a tabela a se%uir:

8ma cole,(o po$e implementar $iretamente a interface +ollection# por)m normalmente se usa uma $as $uas subinterfaces mais famosas: justamente Set e 9ist. 5 interface Set# como previamente vista# $efine um conjunto $e elementos 6nicos enquanto a interface 9ist permite elementos $uplica$os# al)m $e manter a or$em a qual eles foram a$iciona$os. 5 busca em um Set po$e ser mais r&pi$a $o que em um objeto $o tipo 9ist# pois $iversas implementa,-es utilizam-se $e tabelas $e espalhamento 9hash tables:# realizan$o a busca para tempo linear 9OH1I:. 5 interface Map faz parte $o frameworG# mas n(o esten$e +ollection. 9veremos Map mais a$iante:.

0o .ava J# temos outra interface filha $e +ollection: a Kueue# que $efine m)to$os $e entra$a e $e sa$a e cujo crit)rio ser& $efini$o pela sua implementa,(o 9por e emplo F';1# ;';1 ou ain$a um heap on$e ca$a elemento possui sua chave $e priori$a$e:. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

1<.C - Eercorrendo cole:es no Java 9


Como percorrer os elementos $e uma cole,(oC *e for uma lista# po$emos sempre utilizar um la,o for# invocan$o o m)to$o et para ca$a elemento. "as e se a cole,(o n(o permitir in$e a,(oC 2or e emplo# um Set n(o possui um m)to$o para pe%ar o primeiro# o se%un$o ou o quinto elemento $o conjunto# j& que um conjunto n(o possui o conceito $e "or$em" 2o$emos usar o en$anced--or 9o "foreach": $o .ava J para percorrer qualquer +ollection sem nos preocupar com isso. 'nternamente o compila$or vai fazer com que seja usa$o o Qterator $a +ollection $a$a para percorrer a cole,(o. Eepare:
Set3Strin 4 con'unto G new ^ashSet34(); con'unto.a##("'ava"); con'unto.a##("vraptor"); con'unto.a##("scala");

for (Strin palavra , con'unto) ! System.out.println(palavra); &

/m que or$em os elementos ser(o acessa$osC 0uma lista# os elementos aparecer(o $e acor$o com o n$ice em que foram inseri$os# isto )# $e acor$o com o que foi pr)-$etermina$o. /m um conjunto# a or$em $epen$e $a implementa,(o $a interface Set: voc! muitas vezes n(o vai saber ao certo em que or$em os objetos ser(o percorri$os. 2or que o Set )# ent(o# t(o importante e usa$oC 2ara perceber se um item j& e iste em uma lista# ) muito mais r&pi$o usar al%umas implementa,-es $e Set $o que um 9ist# e os PreeSets j& v!m or$ena$os $e acor$o com as caractersticas que $esejarmosO *empre consi$ere usar um Set se n(o houver a necessi$a$e $e %uar$ar os elementos em $etermina$a or$em e busc&-los atrav)s $e um n$ice. 0o eclipse# voc! po$e escrever foreach e $ar ctrlJespao# que ele vai %erar o esqueleto $esse enhance$ forO "uito 6tilO

1<.1D - Eara saber maisF 8terando sobre cole:es com java.util.8terator


5ntes $o .ava J intro$uzir o novo enhance$-for# itera,-es em cole,-es eram feitas com o Qterator. Ho$a cole,(o fornece acesso a um iterator# um objeto que implementa a interface Qterator# que conhece internamente a cole,(o e $& acesso a to$os os seus elementos# como a fi%ura abai o mostra.

5in$a hoje 9$epois $o .ava J: po$emos usar o Qterator# mas o mais comum ) usar o enhance$for. /# na ver$a$e# o enhance$-for ) apenas um a,6car sint&tico que usa iterator por tr&s $os panos. 2rimeiro criamos um Qterator que entra na cole,(o. 5 ca$a chama$a $o m)to$o neAt# o Qterator retorna o pr+ imo objeto $o conjunto. 8m iterator po$e ser obti$o com o m)to$o iterator() $e +ollection# por e emplo numa lista $e Strin :
Qterator3Strin 4 i G lista.iterator();

5 interface Qterator possui $ois m)to$os principais: hasDeAt() 9com retorno booleano:# in$ica se ain$a e iste um elemento a ser percorri$o? neAt()# retorna o pr+ imo objeto. 4oltan$o ao e emplo $o conjunto $e strin%s# vamos percorrer o conjunto:
Set3Strin 4 con'unto G new ^ashSet34(); con'unto.a##("item /"); con'unto.a##("item 7"); con'unto.a##("item :"); (( retorna o iterator Qterator3Strin 4 i G con'unto.iterator(); while (i.hasDeAt()) ! (( rece"e a palavra Strin palavra G i.neAt(); System.out.println(palavra); &

1 while anterior s+ termina quan$o to$os os elementos $o conjunto forem percorri$os# isto )#

quan$o o m)to$o hasDeAt mencionar que n(o e istem mais itens. Nist8terator 8ma lista fornece# al)m $e acesso a um Qterator# um 9istQterator# que oferece recursos a$icionais# especficos para listas. 8san$o o 9istQterator# voc! po$e# por e emplo# a$icionar um elemento na lista ou voltar para o elemento que foi "itera$o" anteriormente. )sar 8terator em ve. do en$anced--or? 1 Qterator po$e sim ain$a ser 6til# mesmo ap+s o .ava J . 5l)m $e iterar na cole,(o como faz o enhance$-for# o Qterator conse%ue remover elementos $a cole,(o $urante a itera,(o $e uma forma ele%ante# atrav)s $o m)to$o remove.

1<.11 - 0apas - java.util.0ap


"uitas vezes queremos buscar rapi$amente um objeto $a$o al%uma informa,(o sobre ele. 8m e emplo seria# $a$a a placa $o carro# obter to$os os $a$os $o carro. 2o$eramos utilizar uma lista para isso e percorrer to$os os seus elementos# mas isso po$e ser p)ssimo para a performance# mesmo para listas n(o muito %ran$es. 5qui entra o mapa. 8m mapa ) composto por um conjunto $e associa,-es entre um objeto chave a um objeto valor. L equivalente ao conceito $e $icion&rio# usa$o em v&rias lin%ua%ens. 5l%umas lin%ua%ens# como 2erl ou 2>2# possuem um suporte mais $ireto a mapas# on$e s(o conheci$os como matrizes/arraDs associativas. 'ava.util.Map ) um mapa# pois ) possvel us&-lo para mapear uma chave a um valor# por e emplo: mapeie < chave "empresa" o valor "Caelum"# ou ent(o mapeie < chave "rua" ao valor "4er%ueiro". *emelhante a associa,-es $e palavras que po$emos fazer em um $icion&rio.

1 m)to$o put(2"'ectF 2"'ect) $a interface Map recebe a chave e o valor $e uma nova associa,(o. 2ara saber o que est& associa$o a um $etermina$o objeto-chave# passa-se esse objeto no m)to$o et(2"'ect). *em $6vi$a essas s(o as $uas opera,-es principais e mais frequentes realiza$as sobre um mapa. 1bserve o e emplo: criamos $uas contas correntes e as colocamos em um mapa associan$o-as aos seus $onos.
+onta+orrente c/ G new +onta+orrente(); c/.#eposita(/----); +onta+orrente c7 G new +onta+orrente(); c7.#eposita(:---); (( cria o mapa Map3Strin F +onta+orrente4 mapaEe+ontas G new ^ashMap34(); (( a#iciona #uas chaves e seus respectivos valores mapaEe+ontas.put("#iretor"F c/); mapaEe+ontas.put(" erente"F c7); (( )ual a conta #o #iretor] (sem castin !) +onta+orrente contaEoEiretor G mapaEe+ontas. et("#iretor"); System.out.println(contaEoEiretor. etSal#o());

8m mapa ) muito usa$o para "in$e ar" objetos $e acor$o com $etermina$o crit)rio# para po$ermos buscar esse objetos rapi$amente. 8m mapa costuma aparecer juntamente com outras cole,-es# para po$er realizar essas buscasO /le# assim como as cole,-es# trabalha $iretamente com 2"'ects 9tanto na chave quanto no valor:# o que tornaria necess&rio o castin% no momento que recuperar elementos. 8san$o os %enerics# como fizemos aqui# n(o precisamos mais $o castin%. *uas principais implementa,-es s(o o ^ashMap# o PreeMap e o ^ashta"le. 5pesar $o mapa fazer parte $o frameworG# ele n(o esten$e a interface +ollection# por ter um comportamento bem $iferente. 2or)m# as cole,-es internas $e um mapa 9a $e chaves e a $e valores# ver ;i%ura N: s(o acessveis por m)to$os $efini$os na interface Map.

1 m)to$o 0eySet() retorna um Set com as chaves $aquele mapa e o m)to$o values() retorna a +ollection com to$os os valores que foram associa$os a al%uma $as chaves. &ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

1<.12 - Eara saber maisF Eroperties


8m mapa importante ) a tra$icional classe Properties# que mapeia strin%s e ) muito utiliza$a para a confi%ura,(o $e aplica,-es. 5 Properties possui# tamb)m# m)to$os para ler e %ravar o mapeamento com base em um arquivo te to# facilitan$o muito a sua persist!ncia.
Properties confi G new Properties(); confi .setProperty("#ata"ase.lo in"F "scott"); confi .setProperty("#ata"ase.passwor#"F "ti er"); confi .setProperty("#ata"ase.url"F"'#"c,mys)l,(localhost(teste"); (( muitas linhas #epois... Strin lo in G confi . etProperty("#ata"ase.lo in"); Strin passwor# G confi . etProperty("#ata"ase.passwor#"); Strin url G confi . etProperty("#ata"ase.url"); EriverMana er. et+onnection(urlF lo inF passwor#);

Eepare que n(o houve a necessi$a$e $o castin% para Strin no momento $e recuperar os objetos associa$os. 'sto porque a classe Properties foi $esenha$a com o prop+sito $e trabalhar com a associa,(o entre Strin s.

1<.1% - Eara saber maisF =quals e 7as$Code


"uitas $as cole,-es $o java %uar$am os objetos $entro $e tabelas $e hash. /ssas tabelas s(o

utiliza$as para que a pesquisa $e um objeto seja feita $e maneira r&pi$a. Como funcionaC Ca$a objeto ) "classifica$o" pelo seu hash+o#e e# com isso# conse%uimos espalhar ca$a objeto a%rupan$o-os pelo hash+o#e. @uan$o buscamos $etermina$o objeto# s+ vamos procurar entre os elementos que est(o no %rupo $aquele hash+o#e. 3entro $esse %rupo# vamos testan$o o objeto procura$o com o can$i$ato usan$o e)uals(). 2ara que isso funcione $ireito# o m)to$o hash+o#e $e ca$a objeto $eve retornar o mesmo valor para $ois objetos# se eles s(o consi$era$os e)uals. /m outras palavras: a.e)uals(") implica a.hash+o#e() GG ".hash+o#e() 'mplementar hash+o#e $e tal maneira que ele retorne valores $iferentes para $ois objetos consi$era$os e)uals quebra o contrato $e 2"'ect e resultar& em collections que usam espalhamento 9como ^ashSet# ^ashMap e ^ashta"le:# n(o achan$o objetos i%uais $entro $e uma mesma cole,(o. =quals e $as$Code no =clipse 1 /clipse ) capaz $e %erar uma implementa,(o correta $e equals e hashco$e basea$o nos atributos que voc! queira comparar. Basta ir no menu *ource e $epois em 7enerate hashco$e9: an$ equals9:.

1<.16 - Eara saber maisF Poas pr1ticas


5s cole,-es $o .ava oferecem %ran$e fle ibili$a$e ao usu&rio. 5 per$a $e performance em rela,(o < utiliza,(o $e arraDs ) irrelevante# mas $eve-se tomar al%umas precau,-es: 7ran$e parte $as cole,-es usam# internamente# um arraD para armazenar os seus $a$os. @uan$o esse arraD n(o ) mais suficiente# ) cria$a um maior e o conte6$o $a anti%a ) copia$o. /ste processo po$e acontecer muitas vezes# no caso $e voc! ter uma cole,(o que cresce muito. 4oc! $eve# ent(o# criar uma cole,(o j& com uma capaci$a$e %ran$e# para evitar o e cesso $e re$imensionamento. /vite usar cole,-es que %uar$am os elementos pela sua or$em $e compara,(o quan$o n(o h& necessi$a$e. 8m PreeSet %asta computacionalmente 2(lo (n)) para inserir 9ele utiliza uma &rvore rubro-ne%ra como implementa,(o:# enquanto o ^ashSet %asta apenas 2(/) . 0(o itere sobre uma 9ist utilizan$o um for $e - at) list.siMe() e usan$o et(int) para receber os objetos. /nquanto isso parece atraente# al%umas implementa,-es $a 9ist n(o s(o $e acesso aleat+rio como a 9in0e#9ist# fazen$o esse c+$i%o ter uma p)ssima performance computacional. 9use Qterator: Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

1<.19 - =!erc"ciosF Collections


1. Crie um c+$i%o que insira RB mil n6meros numa Jrray9ist e pesquise-os. 4amos usar

um m)to$o $e System para cronometrar o tempo %asto:


pu"lic class PestaPerformance ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("Qnician#o..."); +ollection3Qnte er4 teste G new Jrray9ist34(); lon inicio G System.currentPimeMillis(); int total G :----; for (int i G -; i 3 total; iLL) ! teste.a##(i); & for (int i G -; i 3 total; iLL) ! teste.contains(i); & lon fim G System.currentPimeMillis(); lon tempo G fim * inicio; System.out.println("Pempo asto, " L tempo); & &

Hroque a Jrray9ist por um ^ashSet e verifique o tempo que vai $emorar:


+ollection3Qnte er4 teste G new ^ashSet34();

1 que ) lentoC 5 inser,(o $e RB mil elementos ou as RB mil buscasC 3escubra computan$o o tempo %asto em ca$a for separa$amente. 5 $iferen,a ) mais que %ritante. *e voc! passar $e RB mil para um n6mero maior# como JB ou 1BB mil# ver& que isso inviabiliza por completo o uso $e uma 9ist# no caso em que queremos utiliz&-la essencialmente em pesquisas. =. 9conceitual# importante: Eepare que# se voc! $eclarar a cole,(o e $er new assim:
+ollection3Qnte er4 teste G new Jrray9ist34();

em vez $e:
Jrray9ist3Qnte er4 teste G new Jrray9ist34();

L %aranti$o que vai ter $e alterar s+ essa linha para substituir a implementa,(o por ^ashSet. /stamos aqui usan$o o polimorfismo para nos prote%er que mu$an,as $e implementa,(o venham nos obri%ar a alterar muito c+$i%o. "ais uma vez: programe voltado a inter"ace& e no % implementaoO /sse ) um e!celente e emplo $e bom uso $e interfaces# afinal# $e que importa como a cole,(o funcionaC 1 que queremos ) uma cole,(o qualquer# isso ) suficiente para os nossos prop+sitosO 0osso c+$i%o est& com bai!o acoplamento em rela,(o a estrutura $e $a$os utiliza$a: po$emos troc&-la facilmente. /sse ) um c+$i%o e tremamente ele%ante e fle vel. Com o tempo voc! vai reparar que as pessoas tentam pro%ramar sempre se referin$o a essas interfaces menos especficas# na me$i$a $o possvel: m)to$os costumam receber e $evolver +ollections# 9ists e Sets em vez $e referenciar $iretamente uma implementa,(o. L o mesmo que ocorre com o uso $e QnputStream e 2utputStream: eles s(o o suficiente# n(o h& porque for,ar o uso $e al%o mais especfico.

1bviamente# al%umas vezes n(o conse%uimos trabalhar $essa forma e precisamos usar uma interface mais especfica ou mesmo nos referir ao objeto pela sua implementa,(o para po$er chamar al%uns m)to$os. 2or e emplo# PreeSet tem mais m)to$os que os $efini$os em Set# assim como 9in0e#9ist em rela,(o < 9ist. 3! um e emplo $e um caso em que n(o po$eramos nos referir a uma cole,(o $e elementos como +ollection# mas necessariamente por interfaces mais especficas como 9ist ou Set. R. ;a,a testes com o Map# como visto nesse captulo:
pu"lic class PestaMapa ! pu"lic static voi# main(Strin $% ar s) ! +onta c/ G new +onta+orrente(); c/.#eposita(/----); +onta c7 G new +onta+orrente(); c7.#eposita(:---); (( cria o mapa Map mapaEe+ontas G new ^ashMap(); (( a#iciona #uas chaves e seus valores mapaEe+ontas.put("#iretor"F c/); mapaEe+ontas.put(" erente"F c7); (( )ual a conta #o #iretor] +onta contaEoEiretor G (+onta) mapaEe+ontas. et("#iretor"); System.out.println(contaEoEiretor. etSal#o());

& &

3epois# altere o c+$i%o para usar o generics e n(o haver a necessi$a$e $o castin%# al)m $a %arantia $e que nosso mapa estar& se%uro em rela,(o a tipa%em usa$a. 4oc! po$e utilizar o quic!"i# $o /clipse para que ele conserte isso para voc!: na linha em que voc! est& chaman$o o put# use o ctrl L /. 3epois $e mais um quicGfi 9$escubraO: seu c+$i%o $eve ficar como se%ue:
(( cria o mapa Map3Strin F +onta4 mapaEe+ontas G new ^ashMap3Strin F +onta4();

@ue op,(o $o ctrl L / voc! escolheu para que ele a$icionasse o generics para voc!C K. 9opcional: 5ssim como no e erccio 1# crie uma compara,(o entre Jrray9ist e 9in0e#9ist# para ver qual ) a mais r&pi$a para se a$icionar elementos na primeira posi,(o 9list.a##(-F elemento):# como por e emplo:
pu"lic class PestaPerformanceEeJ#icionarDaPrimeiraPosicao ! pu"lic static voi# main(Strin $% ar s) ! System.out.println("Qnician#o..."); lon inicio G System.currentPimeMillis(); (( trocar #epois por Jrray9ist 9ist3Qnte er4 teste G new 9in0e#9ist34(); for (int i G -; i 3 :----; iLL) ! teste.a##(-F i); & lon fim G System.currentPimeMillis();

& &

#ou"le tempo G (fim * inicio) ( /---.-; System.out.println("Pempo asto, " L tempo);

*e%uin$o o mesmo raciocnio# voc! po$e ver qual ) a mais r&pi$a para se percorrer usan$o o et(in#ice) 9sabemos que o correto seria utilizar o enhanced "or ou o Qterator:. 2ara isso# insira RB mil elementos e $epois percorra-os usan$o ca$a implementa,(o $e 9ist. 2erceba que aqui o nosso intuito n(o ) que voc! apren$a qual ) o mais r&pi$o# o importante ) perceber que po$emos tirar proveito $o polimorfismo para nos comprometer apenas com a interface. 3epois# quan$o necess&rio# po$emos trocar e escolher uma implementa,(o mais a$equa$a as nossas necessi$a$es. @ual $as $uas listas foi mais r&pi$a para a$icionar elementos < primeira posi,(oC J. 9opcional: Crie uma classe Sanco que possui uma 9ist $e +onta chama$a contas. Eepare que numa lista $e +onta# voc! po$e colocar tanto +onta+orrente quanto +ontaPoupanca por causa $o polimorfismo. Crie um m)to$o voi# a#iciona(+onta c)# um m)to$o +onta pe a(int A) e outro int pe aKuanti#a#eEe+ontas()# muito similar < rela,(o anterior $e /mpresa-;uncion&rio. Basta usar a sua lista e $ele%ar essas chama$as para os m)to$os e cole,-es que estu$amos. Como ficou a classe SancoC Q. 9opcional: 0o Sanco# crie um m)to$o +onta "uscaPorDome(Strin procura por uma +onta cujo nome seja e)uals ao nome $a$o. nome) que

4oc! po$e implementar esse m)to$o com um for na sua lista $e +onta# por)m n(o tem uma performance eficiente. 5$icionan$o um atributo priva$o $o tipo Map3Strin F +onta4 ter& um impacto si%nificativo. Ho$a vez que o m)to$o a#iciona(+onta c) for invoca$o# voc! $eve invocar .put(c. etDome()F c) no seu mapa. 3essa maneira# quan$o al%u)m invocar o m)to$o +onta "uscaPorDome(Strin nome)# basta voc! fazer o et no seu mapa# passan$o nome como ar%umentoO 0ote# apenas# que isso ) s+ um e erccioO 3essa forma voc! n(o po$er& ter $ois clientes com o mesmo nome nesse banco# o que sabemos que n(o ) le%al. Como ficaria sua classe Sanco com esse MapC N. 9opcional# avan,a$o: Crie o m)to$o hash+o#e para a sua conta# $e forma que ele respeite o e)uals $e que $uas contas s(o e)uals quan$o tem o mesmo n6mero. ;elizmente para n+s# o pr+prio /clipse j& vem com um cria$or $e e)uals e hash+o#e que os faz $e forma consistente. 0a classe +onta# use o ctrl L : e comece a escrever hashCode para achar a op,(o $e %er&-los. /nt(o# selecione apenas o atributo nUmero e man$e %erar o hash+o#e e o e)uals. Como ficou o c+$i%o %era$oC Y. 9opcional# avan,a$o: Crie uma classe $e teste e verifique se sua classe +onta funciona a%ora corretamente em um ^ashSet# isto )# que ela n(o %uar$a contas com n6meros repeti$os. 3epois# remova o m)to$o hash+o#e. Continua funcionan$oC 3ominar o uso e o funcionamento $o hash+o#e ) fun$amental para o bom pro%rama$or.

1<.1< - >esa-ios
1. 7ere to$os os n6meros entre 1 e 1BBB e or$ene em or$em $ecrescente utilizan$o um PreeSet. Como ficou seu c+$i%oC =. 7ere to$os os n6meros entre 1 e 1BBB e or$ene em or$em $ecrescente utilizan$o um Jrray9ist. Como ficou seu c+$i%oC Captulo 1N

Ero#ramao Concorrente e &$reads


"1 6nico lu%ar on$e o sucesso vem antes $o trabalho ) no $icion&rio." 5o t)rmino $esse captulo# voc! ser& capaz $e: e ecutar tarefas simultaneamente? colocar tarefas para a%uar$ar at) que um $etermina$o evento ocorra? enten$er o funcionamento $o 7arba%e Collector.

1@.1 - &$reads
G>uas tare-as ao mesmo tempoG
/m v&rias situa,-es# precisamos "ro$ar $uas coisas ao mesmo tempo". 'ma%ine um pro%rama que %era um relat+rio muito %ran$e em 23;. L um processo $emora$o e# para $ar al%uma satisfa,(o para o usu&rio# queremos mostrar uma barra $e pro%resso. @ueremos ent(o %erar o 23; e ao mesmo tempo atualizar a barrinha. 2ensan$o um pouco mais amplamente# quan$o usamos o computa$or tamb)m fazemos v&rias coisas simultaneamente: queremos nave%ar na internet e ao mesmo tempo ouvir m6sica. 5 necessi$a$e $e se fazer v&rias coisas simultaneamente# ao mesmo tempo# paralelamente# aparece frequentemente na computa,(o. 2ara v&rios pro%ramas $istintos# normalmente o pr+prio sistema operacional %erencia isso atrav)s $e v&rios processos em paralelo. /m um pro%rama s+ 9um processo s+:# se queremos e ecutar coisas em paralelo# normalmente falamos $e &$reads.

&$reads em Java
/m .ava# usamos a classe Phrea# $o pacote 'ava.lan para criarmos linhas de e#ecuo paralelas. 5 classe Phrea# recebe como ar%umento um objeto com o c+$i%o que $esejamos ro$ar. 2or e emplo# no pro%rama $e 23; e barra $e pro%resso:
pu"lic class \eraPE8 ! pu"lic voi# ro#ar () ! (( lR ica para erar o p#f... & & pu"lic class SarraEePro resso ! pu"lic voi# ro#ar () ! (( mostra "arra #e pro resso e vai atualiMan#o ela... & &

/# no m)to$o main# criamos os objetos e passamos para a classe Phrea#. 1 m)to$o start ) respons&vel por iniciar a e ecu,(o $a Phrea#:
pu"lic class MeuPro rama ! pu"lic static voi# main (Strin $% ar s) ! \eraPE8 erap#f G new \eraPE8(); Phrea# threa#EoP#f G new Phrea#( erap#f); threa#EoP#f.start(); SarraEePro resso "arraEePro resso G new SarraEePro resso(); Phrea# threa#EaSarra G new Phrea#("arraEePro resso); threa#EaSarra.start(); & &

1 c+$i%o acima# por)m# n(o compilar&. Como a classe Phrea# sabe que $eve chamar o m)to$o ro#aC Como ela sabe que nome $e m)to$o $aremos e que ela $eve chamar esse m)to$o especialC ;alta na ver$a$e um contrato entre as nossas classes a serem e ecuta$as e a classe Phrea#. /sse contrato e iste e ) feito pela inter"ace[unna"le: $evemos $izer que nossa classe ) "e ecut&vel" e que se%ue esse contrato. 0a interface [unna"le# h& apenas um m)to$o chama$o run. Basta implement&-lo# "assinar" o contrato e a classe Phrea# j& saber& e ecutar nossa classe.
pu"lic class \eraPE8 implements [unna"le ! pu"lic voi# run () ! (( lR ica para erar o p#f... & & pu"lic class SarraEePro resso implements [unna"le ! pu"lic voi# run () ! (( mostra "arra #e pro resso e vai atualiMan#o ela... & &

5 classe Phrea# recebe no construtor um objeto que um[unna"le# e seu m)to$o start chama o m)to$o run $a nossa classe. Eepare que a classe Phrea# n(o sabe qual ) o tipo especfico $a nossa classe? para ela# basta saber que a classe se%ue o contrato estabeleci$o e possui o m)to$o run. L o bom uso $e interfaces# contratos e polimorfismo na pr&ticaO =stendendo a classe &$read 5 classe Phrea# implementa [unna"le. /nt(o# voc! po$e criar uma subclasse $ela e reescrever o run que# na classe Phrea## n(o faz na$a:
pu"lic class \eraPE8 eAten#s Phrea# ! pu"lic voi# run () ! (( ... & &

/# como nossa classe umaPhrea## po$emos usar o start $iretamente:


\eraPE8 era G new \eraPE8(); era.start();

5pesar $e ser um c+$i%o mais simples# voc! est& usan$o heran,a apenas por "pre%ui,a" 9her$amos um monte $e m)to$os mas usamos apenas o run:# e n(o por polimorfismo# que seria a %ran$e vanta%em. 2refira implementar [unna"le a her$ar $e Phrea#. >ormindo 2ara que a threa$ atual $urma basta chamar o m)to$o a se%uir# por e emplo# para $ormir R se%un$os:
Phrea#.sleep(: H /---);

1@.2 - =scalonador e trocas de conte!to


4eja a classe a se%uir:
pu"lic class Pro rama implements [unna"le ! private int i#; (( colocar etter e setter pro atri"uto i# pu"lic voi# run () ! for (int i G -; i 3 /----; iLL) ! System.out.println("Pro rama " L i# L " valor, " L i); & &

&

L uma classe que implementa [unna"le e# no m)to$o run# apenas imprime $ez mil n6meros. 4amos us&-las $uas vezes para criar $uas threa$s e imprimir os n6meros $uas vezes simultaneamente:
pu"lic class Peste ! pu"lic static voi# main(Strin $% ar s) ! Pro rama p/ G new Pro rama(); p/.setQ#(/); Phrea# t/ G new Phrea#(p/); t/.start(); Pro rama p7 G new Pro rama(); p7.setQ#(7); Phrea# t7 G new Phrea#(p7); t7.start(); & &

*e ro$armos esse pro%rama# qual ser& a sa$aC 3e um a mil e $epois $e um a milC 2rovavelmente n(o# sen(o seria sequencial. /le imprimir& B $e t1# B $e t=# 1 $e t1# 1 $e t=# = $e t1# = $e t= e etcC / atamente intercala$oC 0a ver$a$e# n(o sabemos e atamente qual ) a sa$a. Eo$e o pro%rama v&rias vezes e observe: em ca$a e ecu,(o a sa$a ) um pouco $iferente. 1 problema ) que no computa$or e iste apenas um processa$or capaz $e e ecutar coisas. / quan$o queremos e ecutar v&rias coisas ao mesmo tempo# e o processa$or s+ conse%ue fazer uma coisa $e ca$a vezC /ntra em cena o escalonador de t$reads.

1 escalona$or 9sc$eduler:# saben$o que apenas uma coisa po$e ser e ecuta$a $e ca$a vez# pe%a to$as as threa$s que precisam ser e ecuta$as e faz o processa$or ficar alternan$o a e ecu,(o $e ca$a uma $elas. 5 i$eia ) e ecutar um pouco $e ca$a threa$ e fazer essa troca t(o rapi$amente que a impress(o que fica ) que as coisas est(o sen$o feitas ao mesmo tempo. 1 escalona$or ) respons&vel por escolher qual a pr+ ima threa$ a ser e ecuta$a e fazer a troca de conte!to 9conte t switch:. /le primeiro salva o esta$o $a e ecu,(o $a threa$ atual para $epois po$er retomar a e ecu,(o $a mesma. 5 ele restaura o esta$o $a threa$ que vai ser e ecuta$a e faz o processa$or continuar a e ecu,(o $esta. 3epois $e um certo tempo# esta threa$ ) tira$a $o processa$or# seu esta$o 9o conte to: ) salvo e outra threa$ ) coloca$a em e ecu,(o. 5 troca de conte#to ) justamente as opera,-es $e salvar o conte to $a threa$ atual e restaurar o $a threa$ que vai ser e ecuta$a em se%ui$a. @uan$o fazer a troca $e conte to# por quanto tempo a threa$ vai ro$ar e qual vai ser a pr+ ima threa$ a ser e ecuta$a# s(o escolhas $o escalona$or. 0+s n(o controlamos essas escolhas 9embora possamos $ar "$icas" ao escalona$or:. 2or isso que nunca sabemos ao certo a or$em em que pro%ramas paralelos s(o e ecuta$os. 4oc! po$e pensar que ) ruim n(o saber a or$em. "as perceba que se a or$em importa para voc!# se ) importante que $etermina$a coisa seja feita antes $e outra# ent(o n(o estamos falan$o $e e ecu,-es paralelas# mas sim $e um pro%rama sequencial normal 9on$e uma coisa ) feita $epois $a outra# em uma sequ!ncia:. Ho$o esse processo ) feito automaticamente pelo escalona$or $o .ava 9e# mais amplamente# pelo escalona$or $o sistema operacional:. 2ara n+s# pro%rama$ores $as threa$s# ) como se as coisas estivessem sen$o e ecuta$as ao mesmo tempo. = em mais de um processador? 5 4" $o .ava e a maioria $os *1s mo$ernos conse%ue fazer proveito $e sistemas com v&rios processa$ores ou multi-core. 5 $iferen,a ) que a%ora temos mais $e um processa$or e ecutan$o coisas e teremos# sim# e ecu,-es ver$a$eiramente paralelas. "as o n6mero $e processos no *1 e o n6mero $e Hhrea$s paralelas costumam ser t(o %ran$es que# mesmo com v&rios processa$ores# temos as trocas $e conte to. 5 $iferen,a ) que o escalona$or tem $ois ou mais processa$ores para e ecutar suas threa$s. "as $ificilmente ter& uma m&quina com mais processa$ores que threa$s paralelas e ecutan$o. J1 con$ece os cursos online Alura?

5 Alura oferece $ezenas $e cursos online em sua plataforma e clusiva $e ensino que favorece o apren$iza$o com a qualidade reconheci$a $a Caelum. 4oc! po$e escolher um curso nas &reas $e .ava# EubD# Peb# "obile# .0/H e outros# com uma assinatura que $& acesso a to$os os cursos. Conhe,a os cursos online 5lura.

1@.% - (arba#e Collector


1 (arba#e Collector 9coletor $e li o# li eiro: funciona como uma Phrea# respons&vel por jo%ar fora to$os os objetos que n(o est(o sen$o referencia$os por nenhum outro objeto - seja $e maneira $ireta ou in$ireta. Consi$ere o c+$i%o:
+onta conta/ G new +onta+orrente();

+onta conta7 G new +onta+orrente();

5t) este momento# sabemos que temos = objetos em mem+ria. 5qui# o =arbage Collector n(o po$e eliminar nenhum $os objetos# pois ain$a tem al%u)m se referin$o a eles $e al%uma forma. 2o$emos# ent(o# e ecutar uma linha que nos fa,a per$er a refer!ncia para um $os $ois objetos cria$os# como# por e emplo# o se%uinte c+$i%o:
conta7 G conta/;

@uantos objetos temos em mem+riaC 2er$emos a refer!ncia para um $os objetos que foram cria$os. /sse objeto j& n(o ) mais acessvel. Hemos# ent(o# apenas um objeto em mem+riaC 0(o po$emos afirmar issoO Como o =arbage Collector ) uma Hhrea$# voc! n(o tem %arantia $e quan$o ele vai ro$ar. 4oc! s+ sabe que# em al%um momento no futuro# aquela mem+ria vai ser libera$a. 5l%umas pessoas costumam atribuir null a uma vari&vel# com o intuito $e acelerar a passa%em $o =arbage Collector por aquele objeto:
for (int i G -; i 3 /--; iLL) ! 9ist A G new Jrray9ist(); (( faM al umas coisas com a arraylist A G null; &

'sso rarissimamente ) necess&rio. 1 =arbage Collector a%e apenas sobre objetos# nunca sobre vari&veis. 0esse caso# a vari&vel A n(o e istir& mais a ca$a itera,(o# $ei an$o a Jrray9ist cria$a sem nenhuma refer!ncia para ela. 2stem.#cHI 4oc! nunca conse%ue for,ar o 7arba%e Collector# mas chaman$o o m)to$o est&tico c $a classe System# voc! est& su%erin$o que a 4irtual "achine ro$e o 7arba%e Collector naquele momento. *e sua su%est(o vai ser aceita ou n(o# isto $epen$e $e .4" para .4"# e voc! n(o tem %arantias. /vite o uso $este m)to$o. 4oc! n(o $eve basear sua aplica,(o em quan$o o 7arba%e Collector vai ro$ar ou n(o. /inali.er 5 classe 2"'ect $efine tamb)m um m)to$o finaliMe# que voc! po$e reescrever. /sse m)to$o ser& chama$o no instante antes $o 7arba%e Collector coletar este objeto. 0(o ) um $estrutor# voc! n(o sabe em que momento ele ser& chama$o. 5l%umas pessoas o utilizam para liberar recursos "caros" como cone -es# threa$s e recursos nativos. 'sso $eve ser utiliza$o apenas por se%uran,a: o i$eal ) liberar esses recursos o mais r&pi$o possvel# sem $epen$er $a passa%em $o 7arba%e Collector.

1@.6 - Eara saber maisF problemas com concorr,ncia


1 uso $e Hhrea$s come,a a ficar interessante e complica$o quan$o precisamos compartilhar objetos entre v&rias Hhrea$s. 'ma%ine a se%uinte situa,(o: temos um Banco com milh-es $e Contas Banc&rias. Clientes sacam e $epositam $inheiro continuamente# =K horas por $ia. 0o primeiro $ia $e ca$a m!s# o Banco precisa atualizar o sal$o $e to$as as Contas $e acor$o com uma ta a especfica. 2ara isso# ele utiliza o JtualiMa#orEe+ontas que vimos anteriormente.

1 JtualiMa#orEe+ontas# basicamente# pe%a uma a uma ca$a uma $as milh-es $e contas e chama seu m)to$o atualiMa. 5 atualiza,(o $e milh-es $e contas ) um processo $emora$o# que $ura horas? ) invi&vel parar o banco por tanto tempo at) que as atualiza,-es tenham completa$o. L preciso e ecutar as atualiza,-es paralelamente <s ativi$a$es# $e $ep+sitos e saques# normais $o banco. 1u seja# teremos v&rias threa$s ro$an$o paralelamente. /m uma threa$# pe%amos to$as as contas e vamos chaman$o o m)to$o atualiMa $e ca$a uma. /m outra# po$emos estar sacan$o ou $epositan$o $inheiro. /stamos compartilhan$o objetos entre m6ltiplas threa$s 9as contas# no nosso caso:. 'ma%ine a se%uinte possibili$a$e 9mesmo que muito remota:: no e ato instante em que o atualiza$or est& atualizan$o uma Conta M# o cliente $ono $esta Conta resolve efetuar um saque. Como sabemos# ao trabalhar com Hhrea$s# o escalona$or po$e parar uma certa Hhrea$ a qualquer instante para e ecutar outra# e voc! n(o tem controle sobre isso. 4eja essa classe Conta:
pu"lic class +onta ! private #ou"le sal#o; (( outros mTto#os e atri"utos... pu"lic voi# atualiMa(#ou"le taAa) ! #ou"le sal#oJtualiMa#o G this.sal#o H (/ L taAa); this.sal#o G sal#oJtualiMa#o; & pu"lic voi# #eposita(#ou"le valor) ! #ou"le novoSal#o G this.sal#o L valor; this.sal#o G novoSal#o; &

&

'ma%ine uma Conta com sal$o $e 1BB reais. 8m cliente entra na a%!ncia e faz um $ep+sito $e 1BBB reais. 'sso $ispara uma Hhrea$ no banco que chama o m)to$o #eposita()? ele come,a calculan$o o novoSal#o que passa a ser 11BB 9linha 1R:. *+ que por al%um motivo que $esconhecemos# o escalona$or p&ra essa threa$. 0este e ato instante# ele come,a a e ecutar uma outra Hhrea$ que chama o m)to$o atualiMa $a mesma +onta# por e emplo# com ta a $e 1U. 'sso quer $izer que o novoSal#o passa a valer 1B1 reais 9linha Y:. /# nesse instante o escalona$or troca $e Hhrea$s novamente. /le e ecuta a linha 1K na Hhrea$ que fazia o $ep+sito? o sal$o passa a valer 11BB. 5caban$o o $eposita# o escalona$or volta pra Hhrea$ $o atualiza e e ecuta a linha A# fazen$o o sal$o valer 1B1 reais. Eesulta$o: o $ep+sito $e mil reais foi totalmente i%nora$o e seu Cliente ficar& pouco feliz com isso. 2erceba que n(o ) possvel $etectar esse erro# j& que to$o o c+$i%o foi e ecuta$o perfeitamente# sem problemas. O problema4 aqui4 -oi o acesso simultLneo de duas &$reads ao mesmo objeto. / o erro s+ ocorreu porque o escalona$or parou nossas Hhrea$s naqueles e atos lu%ares. 2o$e ser que nosso c+$i%o fique ro$an$o 1 ano sem $ar problema al%um e em um belo $ia o escalona$or resolve alternar nossas Hhrea$s $aquela forma. 0(o sabemos como o escalona$or se comportaO Hemos que prote%er nosso c+$i%o contra esse tipo $e problema. 3izemos que essa classe n(o ) thread sa"e# isso )# n(o est& pronta para ter uma inst[ncia utiliza$a entre v&rias threa$s concorrentemente. 1 que queramos era que n(o fosse possvel al%u)m atualizar a +onta enquanto outra pessoa est& $epositan$o um $inheiro. @ueramos que uma Hhrea$ n(o pu$esse me er em uma +onta enquanto

outra Hhrea$ est& me en$o nela. 0(o h& como impe$ir o escalona$or $e fazer tal escolha. /nt(o# o que fazerC 8ma i$eia seria criar uma trava e# no momento em que uma Hhrea$ entrasse em um $esses m)to$os# ela trancaria a entra$a com uma chave. 3essa maneira# mesmo que sen$o coloca$a $e la$o# nenhuma outra Hhrea$ po$eria entrar nesses m)to$os# pois a chave estaria com a outra Hhrea$. /ssa i$eia ) chama$a $e re#io cr"tica. L um pe$a,o $e c+$i%o que $efinimos como crtico e que n(o po$e ser e ecuta$o por $uas threa$s ao mesmo tempo. 5penas uma threa$ por vez conse%ue entrar em al%uma re%i(o crtica. 2o$emos fazer isso em .ava. 2o$emos usar qualquer objeto como um locM 9trava# chave:# para po$er sincroni.ar em cima $esse objeto# isto )# se uma Hhrea$ entrar em um bloco que foi $efini$o como sincroniza$o por esse locG# apenas uma Hhrea$ po$er& estar l& $entro ao mesmo tempo# pois a chave estar& com ela. 5 palavra chave synchroniMe# $& essa caracterstica a um bloco $e c+$i%o e recebe qual ) o objeto que ser& usa$o como chave. 5 chave s+ ) $evolvi$a no momento em que a Hhrea$ que tinha essa chave sair $o bloco# seja por return ou $isparo $e uma e ce,(o 9ou ain$a na utiliza,(o $o m)to$o wait():.. @ueremos# ent(o# bloquear o acesso simult[neo a uma mesma +onta:
pu"lic class +onta ! private #ou"le sal#o; (( outros mTto#os e atri"utos... pu"lic voi# atualiMa(#ou"le taAa) ! synchroniMe# (this) ! #ou"le sal#oJtualiMa#o G this.sal#o H (/ L taAa); this.sal#o G sal#oJtualiMa#o; & & pu"lic voi# #eposita(#ou"le valor) ! synchroniMe# (this) ! #ou"le novoSal#o G this.sal#o L valor; this.sal#o G novoSal#o; & & &

1bserve o uso $os blocos synchroniMe# $entro $os $ois m)to$os. /les bloqueiam uma Hhrea$ utilizan$o o mesmo objeto +onta# o this. /sses m)to$os s(o mutuamente e clusivos e s+ e ecutam $e maneira atImica. Hhrea$s que tentam pe%ar um locG que j& est& pe%o# ficar(o em um conjunto especial esperan$o pela libera,(o $o locG 9n(o necessariamente numa fila:. incroni.ando o bloco inteiro L comum sempre sincronizarmos um m)to$o inteiro# normalmente utilizan$o o this.
pu"lic voi# meto#o() ! synchroniMe# (this) ! (( conteU#o #o meto#o & &

2ara este mesmo efeito# e iste uma sinta e mais simples# on$e o synchroniMe# po$e ser usa$o como mo$ifica$or $o m)to$o:
pu"lic synchroniMe# voi# meto#o() ! (( conteU#o #o meto#o &

0ais sobre locMs4 monitores e concorr,ncia *e o m)to$o for est&tico# ser& sincroniza$o usan$o o locG $o objeto que representa a classe 9DomeEa+lasse.class:. 5l)m $isso# o pacote 'ava.util.concurrent# conheci$o como J)C# entrou no .ava J.B para facilitar uma s)rie $e trabalhos comuns que costumam aparecer em uma aplica,(o concorrente. /sse pacote aju$a at) mesmo criar threa$s e pool $e threa$s# atrav)s $os / ecutors.

1@.9 - Eara saber maisF +ector e 7as$table


3uas collections muito famosas s(o 5ector e ^ashta"le# a $iferen,a $elas com suas irm(s Jrray9ist e ^ashMap ) que as primeiras s(o threa$ safe. 4oc! po$e se per%untar porque n(o usamos sempre essas classes threa$ safe. 5$quirir um locG tem um custo# e caso um objeto n(o v& ser usa$o entre $iferentes threa$s# n(o h& porque usar essas classes que consomem mais recursos. "as nem sempre ) f&cil en er%ar se $evemos sincronizar um bloco# ou se $evemos utilizar blocos sincroniza$os. 5nti%amente o custo $e se usar locGs era altssimo# hoje em $ia isso custa pouco para a .4"# mas n(o ) motivo para voc! sincronizar tu$o sem necessi$a$e. +oc, no est1 nessa p1#ina a toa

4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile# Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

1@.< - )m pouco mais...


1. 4oc! po$e mu$ar a priori$a$e $e ca$a uma $e suas Hhrea$s# mas isto tamb)m ) apenas uma su%est(o ao escalona$or. =. / iste um m)to$o stop nas Hhrea$s# porque n(o ) boa pr&tica cham&-loC R. 8m t+pico mais avan,a$o ) a utiliza,(o $e wait# notifiy e notifyJll para que as Hhrea$s comuniquem-se $e eventos ocorri$os# in$ican$o que po$em ou n(o po$em avan,ar $e acor$o com con$i,-es K. 1 pacote 'ava.util.concurrent foi a$iciona$o no .ava J para facilitar o trabalho na pro%rama,(o concorrente. /le possui uma s)rie $e primitivas para que voc! n(o tenha $e trabalhar $iretamente com wait e notify# al)m $e ter $iversas cole,-es threa$ safe.

1@.@ - =!erc"cios
1. Heste o e emplo $este captulo para imprimir n6meros em paralelo.

/screva a classe 2ro%rama:


pu"lic class Pro rama implements [unna"le ! private int i#; (( colocar etter e setter pro atri"uto i# pu"lic voi# run () ! for (int i G -; i 3 /----; iLL) ! System.out.println("Pro rama " L i# L " valor, " L i); & &

&

/screva a classe $e Heste:


pu"lic class Peste ! pu"lic static voi# main(Strin $% ar s) ! Pro rama p/ G new Pro rama(); p/.setQ#(/); Phrea# t/ G new Phrea#(p/); t/.start(); Pro rama p7 G new Pro rama(); p7.setQ#(7); Phrea# t7 G new Phrea#(p7); t7.start(); & &

Eo$e v&rias vezes a classe Peste e observe os $iferentes resulta$os em ca$a e ecu,(o. 1 que mu$aC

1@.A - =!erc"cios avanados de pro#ramao concorrente e locMs


/ erccios s+ recomen$a$os se voc! j& tinha al%um conhecimento pr)vio $e pro%rama,(o concorrente# locGs# etc. 1. 4amos en er%ar o problema ao se usar uma classe que n(o ) thread)sa"e: a Jrray9ist por e emplo. 'ma%ine que temos um objeto que %uar$a to$as as mensa%ens que uma aplica,(o $e chat recebeu. 4amos usar uma Jrray9ist3Strin 4 para armazen&-las. 0ossa aplica,(o ) multi)thread# ent(o $iferentes threa$s v(o inserir $iferentes mensa%ens para serem re%istra$as. 0(o importa a or$em que elas sejam %uar$a$as# $es$e que elas um $ia sejamO 4amos usar a se%uinte classe para a$icionar as queries:
pu"lic class Pro#uMMensa ens implements [unna"le ! private int comeco; private int fim; private +ollection3Strin 4 mensa ens; pu"lic Pro#uMMensa ens(int comecoF int fimF +ollection3Strin 4 mensa ens) !

this.comeco G comeco; this.fim G fim; this.mensa ens G mensa ens; & pu"lic voi# run() ! for (int i G comeco; i 3 fim; iLL) ! mensa ens.a##("Mensa em " L i); & &

&

4amos criar tr!s threa$s que ro$em esse c+$i%o# to$as a$icionan$o as mensa%ens na mesmaJrray9ist. /m outras palavras# teremos threa$s compartilhan$o e acessan$o um mesmo objeto: ) aqui que mora o peri%o.
pu"lic class [e istroEeMensa ens ! pu"lic static voi# main(Strin $% ar s) throws Qnterrupte#CAception ! +ollection3Strin 4 mensa ens G new Jrray9ist3Strin 4(); Phrea# t/ G new Phrea#(new Pro#uMMensa ens(-F /----F mensa ens)); Phrea# t7 G new Phrea#(new Pro#uMMensa ens(/----F 7----F mensa ens)); Phrea# t: G new Phrea#(new Pro#uMMensa ens(7----F :----F mensa ens)); t/.start(); t7.start(); t:.start(); (( faM com )ue a threa# )ue ro#a o main a uar#e o fim #essas t/.'oin(); t7.'oin(); t:.'oin(); System.out.println("Phrea#s pro#utoras #e mensa ens finaliMa#as!"); (( verifica se to#as as mensa ens foram uar#a#as for (int i G -; i 3 /;---; iLL) ! if (!mensa ens.contains("Mensa em " L i)) ! throw new Qlle alStateCAception("no encontrei a mensa em, " L i); & & (( verifica se al uma mensa em ficou nula if (mensa ens.contains(null)) ! throw new Qlle alStateCAception("no #evia ter null a)ui #entro!"); & & & System.out.println("8im #a eAecucao com sucesso");

Eo$e al%umas vezes. 1 que aconteceC =. Heste o c+$i%o anterior# mas usan$o synchroniMe# ao a$icionar na cole,(o:
pu"lic voi# run() ! for (int i G comeco; i 3 fim; iLL) ! synchroniMe# (mensa ens) ! mensa ens.a##("Mensa em " L i); & &

&

R. *em usar o synchroniMe# teste com a classe 5ector# que uma+ollection e ) thread)sa"e. 1 que mu$ouC 1lhe o c+$i%o $o m)to$o a## na classe 5ector. 1 que tem $e $iferente neleC K. 0ovamente sem usar o synchroniMe## teste usar ^ashSet e 9in0e#9ist# em vez $e 5ector. ;a,a v&rios testes# pois as threa$s v(o se entrela,ar ca$a vez $e uma maneira $iferente# po$en$o ou n(o ter um efeito inespera$o. 0o captulo $e *ocGets usaremos threa$s para solucionar um problema real $e e ecu,-es paralelas. Captulo 1Y

= a#ora?
"5 primeira coisa a enten$er ) que voc! n(o enten$e." 1n$e continuar ao terminar os e erccios $e a.ava e 1rienta,(o a 1bjetosa.

1A.1 - Eraticando Java e usando bibliotecas


5 melhor maneira para fi ar tu$o o que foi visto nos captulos anteriores ) planejar e montar pequenos sistemas. 2ense na mo$ela%em $e suas classes# como e on$e usar heran,a# polimorfismo# encapsulamento e outros conceitos. 2ratique o uso $as 52's mais 6teis $o .ava inte%ran$o-as ao seus sistemas. 1 curso ;.-== ) um laborat+rio que al)m $e $emonstrar o uso $iversas 52's e boas pr&ticas# vai mostrar $iversos $esi%n patterns e seus casos $e uso.

1A.2 - 3eb
8m $os principais focos $e .ava# hoje em $ia# ) on$e a maior parte $as va%as e istem: pro%raman$o para a web. /ntram aqui tecnolo%ias como *ervlets# .*2s e ferramentas famosas $o merca$o# como o *truts. 5 Caelum oferece o curso ;.-=1# on$e voc! po$e estu$ar os t+picos necess&rios para come,ar a trabalhar com .ava na web usan$o as melhores pr&ticas# $esi%n patterns e tecnolo%ias $o merca$o. /ssa apostila tamb)m est& $isponvel para $ownloa$. A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.

1A.% - (rupos de )su1rios


3iversos pro%rama$ores com o mnimo ou m& imo $e conhecimento se re6nem online para a troca $e $6vi$as# informa,-es e i$eias sobre projetos# bibliotecas e muito mais. *(o os %rupos $e usu&rios

$e java. 8m $os mais importantes e conheci$os no Brasil ) o 78.: http://www.%uj.com.br

1A.6 - /alando em Java - Er*!imos m*dulos


1 a;alan$o em .avaa n(o p&ra por aqui. 5 Caelum oferece uma %ran$e varie$a$e $e cursos que voc! po$e se%uir. 5l%uns $os mais requisita$os: /J-21: .ava para $esenvolvimento Peb /J-22: Faborat+rio .ava com Hestes# .*;# Peb *ervices e 3esi%n 2atterns /J-29: 2ersist!ncia com .25# >ibernate e /.B lite /J-2<: Faborat+rio Peb com .*; e C3' /J-2A: 3esenvolvimento &%il para Peb =.B com 4Eaptor# >ibernate e 5.5M /J-%1: /nterprise .avaBeans 9/.B: /J-9@: 3esenvolvimento m+vel com 7oo%le 5n$roi$ /J-C1: 5rquitetura e 3esi%n $e 2rojetos .ava ;;-@1: 3esenvolvimento &%il para Peb =.B com EubD on Eails ;;-@9: EubD e Eails avan,a$os: li$an$o com problemas $o $ia a $ia Consulte mais informa,-es no nosso site e entre em contato conosco. Captulo 1A

Ap,ndice - ocMets
"1lho por olho# e o mun$o acabar& ce%o." Conectan$o-se a m&quinas remotas.

1C.1 - 0otivaoF uma AE8 que usa os conceitos aprendidos


0este captulo# voc! vai conhecer a 52' $e ocMets $o java pelo pacote 'ava.net. "ais 6til que conhecer a 52'# ) voc! perceber que estamos usan$o# aqui# to$os os conceitos e bibliotecas apren$i$as $urante os outros captulos. Eepare# tamb)m# que ) relativamente simples apren$er a utilizar uma 52'# a%ora que temos to$os os conceitos necess&rios para tal. Fembre-se $e fazer esse ap!n$ice com o java$oc aberto ao seu la$o.

1C.2 - Erotocolo
3a necessi$a$e $e $ois computa$ores se comunicarem# sur%iram $iversos protocolos que permitissem tal troca $e informa,(o: o protocolo que vamos usar aqui ) o &CE 9Transmission Control $rotocol:. 5trav)s $o &CE# ) possvel criar um flu o entre $ois computa$ores - como ) mostra$o no $ia%rama abai o:

L possvel conectar mais $e um cliente ao mesmo servi$or# como ) o caso $e $iversos banco $e

$a$os# servi$ores Peb# etc. 5o escrever um pro%rama em .ava que se comunique com outra aplica,(o# n(o ) necess&rio se preocupar com um nvel t(o bai o quanto o protocolo. 5s classes que trabalham com eles j& foram $isponibiliza$as para serem usa$as por n+s no pacote 'ava.net. 5 vanta%em $e se usar HC2# em vez $e criar nosso pr+prio protocolo $e bDtes# ) que o HC2 vai %arantir a entre%a $os pacotes que transferirmos e criar um protocolo base para isto ) al%o bem complica$o. +oc, pode tambm -a.er o curso /J-11 dessa apostila na Caelum

@ueren$o apren$er ain$a mais sobre .ava e boas pr&ticas $e orienta,(o a objetosC /sclarecer $6vi$as $os e ercciosC 1uvir e plica,-es $etalha$as com um instrutorC 5 Caelum oferece o curso /J-11 presencial nas ci$a$es $e *(o 2aulo# Eio $e .aneiro e Braslia# al)m $e turmas incompanD. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

1C.% - Eorta
5cabamos $e mencionar que $iversos computa$ores po$em se conectar a um s+# mas# na reali$a$e# ) muito comum encontrar m&quinas clientes com uma s+ cone (o fsica. /nt(o# como ) possvel se conectar a $ois pontosC Como ) possvel ser conecta$o por $iversos pontosC Ho$as as aplica,-es que est(o envian$o e receben$o $a$os fazem isso atrav)s $a mesma cone (o fsica# mas o computa$or conse%ue $iscernir# $urante a che%a$a $e novos $a$os# quais informa,-es pertencem a qual aplica,(o. "as comoC

5ssim como e iste o 8E para i$entificar uma m&quina# a porta ) a solu,(o para i$entificar $iversas aplica,-es em uma m&quina. /sta porta ) um n6mero $e = bDtes# varia de D a <99%9. *e to$as as portas $e uma m&quina estiverem ocupa$as# n(o ) possvel se conectar a ela enquanto nenhuma for libera$a. 5o confi%urar um servi$or para ro$ar na porta YB 9pa$r(o http:# ) possvel se conectar a esse servi$or atrav)s $essa porta que# junto com o ip# vai formar o en$ere,o $a aplica,(o. 2or e emplo# o servi$or web $a caelum4com4br po$e ser representa$o por: caelum4com4br:@A

1C.6 - ocMet
"as se um cliente se conecta a um pro%rama ro$an$o na porta YB $e um servi$or# enquanto ele n(o se $esconectar $essa porta# ser& impossvel que outra pessoa se conecteC 5contece que# ao efetuar e aceitar a cone (o# o servi$or re$ireciona o cliente $e uma porta para outra# liberan$o novamente sua porta inicial e permitin$o que outros clientes se conectem novamente.

/m .ava# isso $eve ser feito atrav)s $e threa$s e o processo $e aceitar a cone (o $eve ser ro$a$o o mais r&pi$o possvel.

1C.9 - ervidor
'nician$o um mo$elo $e servi$or $e chat# o servi,o $o computa$or que funciona como base $eve# primeiro# abrir uma porta e ficar ouvin$o at) al%u)m tentar se conectar.
import 'ava.net.H; pu"lic class Servi#or ! pu"lic static voi# main(Strin ar s$%) throws Q2CAception !

ServerSoc0et servi#or G new ServerSoc0et(/7:6;); System.out.println("Porta /7:6; a"erta!"); (( a continuao #o servi#or #eve ser escrita a)ui & &

*e o objeto for realmente cria$o# si%nifica que a porta 1=RKJ estava fecha$a e foi aberta. *e outro pro%rama possui o controle $esta porta neste instante# ) normal que o nosso e emplo n(o funcione# pois ele n(o conse%ue utilizar uma porta que j& est& em uso. 5p+s abrir a porta# precisamos esperar por um cliente atrav)s $o m)to$o accept $a ServerSoc0et. 5ssim que um cliente se conectar# o pro%rama continuar&# por isso $izemos que esse m)to$o ) blocante# se%ura a threa$ at) que al%o o notifique.
Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress() ); (( imprime o ip #o cliente

2or fim# basta ler to$as as informa,-es que o cliente nos enviar:
Scanner scanner G new Scanner(cliente. etQnputStream()); while (scanner.hasDeAt9ine()) ! System.out.println(scanner.neAt9ine()); &

;echamos as cone -es# come,an$o pelo flu o:


in.close(); cliente.close(); servi#or.close();

1 resulta$o ) a classe a se%uir:


pu"lic class Servi#or ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! ServerSoc0et servi#or G new ServerSoc0et(/7:6;); System.out.println("Porta /7:6; a"erta!"); Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress() ); Scanner s G new Scanner(cliente. etQnputStream()); while (s.hasDeAt9ine()) ! System.out.println(s.neAt9ine()); & s.close();

& &

servi#or.close(); cliente.close();

&ire suas d'vidas no novo ()J ;espostas

1 78. ) um $os principais f+runs brasileiros $e computa,(o e o maior em portu%u!s sobre .ava. 5 nova vers(o $o 78. ) basea$a em uma ferramenta $e perguntas e respostas 9@5: e tem uma comuni$a$e muito forte. *(o mais $e 1JB mil usu&rios pra aju$ar voc! a esclarecer suas $6vi$as. ;a,a sua per%unta.

1C.< - Cliente
5 nossa tarefa ) criar um pro%rama cliente que envie mensa%ens para o servi$or... o cliente ) ain$a mais simples $o que o servi$or. 1 c+$i%o a se%uir ) a parte principal e tenta se conectar a um servi$or no '2 1=N.B.B.1 9m&quina local: e porta 1=RKJ:
Soc0et cliente G new Soc0et("/7Z.-.-./"F/7:6;); System.out.println("2 cliente se conectou ao servi#or!");

@ueremos ler os $a$os $o cliente# $a entra$a pa$r(o 9tecla$o::


Scanner tecla#o G new Scanner(System.in); while (tecla#o.hasDeAt9ine()) ! (( lX a linha e faM al o com ela &

Basta ler as linhas que o usu&rio $i%itar atrav)s $o buffer $e entra$a 9in:# e jo%&-las no buffer $e sa$a:
PrintStream sai#a G new PrintStream(cliente. et2utputStream()); Scanner tecla#o G new Scanner(System.in); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close();

Eepare que usamos os conceito $e 'ava.io aqui novamente# para leitura $o tecla$o e envio $e mensa%ens para o servi$or. 2ara as classes Scanner e PrintStream# tanto faz $e on$e que se l! ou escreve os $a$os: o importante ) que esse stream seja um QnputStream / 2utputStream. L o po$er $as interfaces# $o polimorfismo# aparecen$o novamente. 0osso pro%rama final:
pu"lic class +liente ! pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et("/7Z.-.-./"F /7:6;); System.out.println("2 cliente se conectou ao servi#or!"); Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream());

while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close(); cliente.close();

& &

2ara testar o sistema# precisamos ro$ar primeiro o servi$or e# lo%o $epois# o cliente. Hu$o o que for $i%ita$o no cliente ser& envia$o para o servi$or. 0ultit$readin# 2ara que o servi$or seja capaz $e trabalhar com $ois clientes ao mesmo tempo ) necess&rio criar uma threa$ lo%o ap+s e ecutar o m)to$o accept. 5 threa$ cria$a ser& respons&vel pelo tratamento $essa cone (o# enquanto o la,o $o servi$or $isponibilizar& a porta para uma nova cone (o:
while (true) ! Soc0et cliente G servi#or.accept(); (( cria um o"'eto )ue vai tratar a coneAo Pratamento+lass tratamento G new Pratamento+lass(cliente); (( cria a threa# em cima #este o"'eto Phrea# t G new Phrea#(tratamento); (( inicia a threa# t.start(); &

1C.@ - 8ma#em #eral


5 socGet $o cliente tem um QnputStream# que recebe $o 2utputStream $o servi$or# e tem um 2utputStream# que transfere tu$o para o QnputStream $o servi$or. "uito pareci$o com um telefoneO Eepare que cliente e servi$or s(o r+tulos que in$icam um esta$o. 8m micro 9ou melhor# uma .4": po$e ser servi$or num caso# mas po$e ser cliente em outro caso.

1C.A - =!erc"ciosF ocMets


1. Crie um projeto soc0ets. 4amos fazer um pequeno sistema em que tu$o que ) $i%ita$o no micro cliente acaba aparecen$o no micro servi$or. 'sto )# apenas uma comunica,(o uni$irecional.

Crie a classe Servi#or como vimos nesse captulo. 5buse $os recursos $o /clipse para n(o ter $e escrever muitoO
pac0a e "r.com.caelum.chat; import import import import 'ava.io.Q2CAception; 'ava.net.ServerSoc0et; 'ava.net.Soc0et; 'ava.util.Scanner;

pu"lic class Servi#or ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! ServerSoc0et servi#or G new ServerSoc0et(/7:6;); System.out.println("Porta /7:6; a"erta!"); Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress()); Scanner entra#a G new Scanner(cliente. etQnputStream()); while (entra#a.hasDeAt9ine()) ! System.out.println(entra#a.neAt9ine()); & entra#a.close(); servi#or.close();

& &

=. Crie a classe +liente como vista anteriormente:


pac0a e "r.com.caelum.chat; import import import import import 'ava.io.Q2CAception; 'ava.io.PrintStream; 'ava.net.Soc0et; 'ava.net.en0nown^ostCAception; 'ava.util.Scanner;

pu"lic class +liente ! pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et("/7Z.-.-./"F /7:6;); System.out.println("2 cliente se conectou ao servi#or!"); Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream()); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close(); & &

8tilize $os quicG fi es e control espa,o para os imports e o throws. R. Eo$e a classe Servi#or: repare no console $o /clipse que o pro%rama fica esperan$o. Eo$e a classe +liente: a cone (o $eve ser feita e o /clipse $eve mostrar os $ois consoles para voc! 9e iste um pequeno cone na view $e Console para voc! alternar entre eles:.

3i%ite mensa%ens no cliente e veja se elas aparecem corretamente no servi$or. K. Heste seu pro%rama com um cole%a $o curso# usan$o comunica,(o remota entre as $uas m&quinas. Combinem entre si quem vai ro$ar o cliente e quem vai ro$ar o servi$or. @uem for ro$ar o cliente $eve e$itar o '2 na classe para in$icar o en$ere,o $a outra m&quina 9verifique tamb)m se est(o acessan$o a mesma porta:. >escobrindo o ip da m1quina 0o Pin$ows# abra o console e $i%ite ipcon"ig para saber qual ) o seu '2. 0o Finu 9ou no B*3# "ac# *olaris:# v& no console e $i%ite i"con"ig. J. 9opcional: / se voc! quisesse# em vez $e enviar tu$o o que o cliente $i%itou# transferir um arquivo te to $o micro $o cliente para servi$orC *eria $ifcilC 5buse $o polimorfismoO ;a,a o cliente ler $e um arquivo chama$o ar)uivo.tAt 9crieoO: e fa,a com que o servi$or %rave tu$o que recebe num arquivo que chama rece"i#o.tAt. Bova editora Casa do C*di#o com livros de uma -orma di-erente

/$itoras tra$icionais pouco li%am para ebooGs e novas tecnolo%ias. 0(o conhecem pro%rama,(o para revisar os livros tecnicamente a fun$o. 0(o t!m anos $e e peri!ncia em $i$&ticas com cursos. Conhe,a a Casa do C*di#o# uma e$itora $iferente# com cura$oria $a Caelum e obsess(o por livros $e quali$a$e a pre,os justos. Casa $o C+$i%o# ebooG com pre,o $e ebooG.

1C.C - >esa-ioF 0'ltiplos Clientes


@uan$o o servi$or aceita um cliente com a chama$a ao accept# ele po$eria chamar novamente este m)to$o para aceitar um novo cliente. /# se queremos aceitar v&rios clientes# simult[neos# basta chamar o accept v&rias vezes e tratar ca$a cliente em sua pr+pria Phrea# 9sen(o o m)to$o accept n(o ser& invoca$o novamenteO:. 8m esbo,o $e solu,(o para a classe Servi#or:
ServerSoc0et servi#or G new ServerSoc0et(/7:6;); (( servi#or fica eternamente aceitan#o clientes... while (true) ! Soc0et cliente G servi#or.accept(); (( #ispara uma Phrea# )ue trata esse cliente e 'I espera o prRAimo &

1C.1D - >esa-ioF broadcast das mensa#ens


5%ora que v&rios clientes po$em man$ar mensa%ens# %ostaramos que os clientes recebessem as mensa%ens envia$as pelas outras pessoas. 5o inv)s $o servi$or simplesmente escrever as mensa%ens no console# ele $eve man$ar ca$a mensa%em para to$os os clientes conecta$os. 2recisamos manter uma lista $e clientes conecta$os e# quan$o che%ar uma mensa%em 9$e qualquer cliente:# percorremos essa lista e man$amos para to$os. 8se um 9ist para %uar$ar os PrintStreams $os clientes. Fo%o $epois que o servi$or aceitar

um cliente novo# crie um PrintStream usan$o o 2utputStream $ele e a$icione na lista. /# quan$o receber uma mensa%em nova# envia para to$os na lista. 8m esbo,o: 5$icionan$o na lista:
while (true) ! Soc0et cliente G servi#or.accept(); this.lista.a##(new PrintStream(cliente. et2utputStream())); & (( #ispara uma Phrea# )ue trata esse cliente e 'I espera o prRAimo

")to$o que $istribui as mensa%ens:


voi# #istri"uiMensa em(Strin ms ) ! for (PrintStream cliente , lista) ! cliente.println(ms ); & &

"as nosso cliente tamb)m recebe mensa%ens. /nt(o precisamos fazer com que o Cliente# al)m $e ler mensa%ens $o tecla$o e enviar para o servi$or# simultaneamente tamb)m possa receber mensa%ens $e outros clientes envia$as pelo servi$or. 1u seja# precisamos $e uma se%un$a Hhrea$ na classe +liente que fica receben$o mensa%ens $o QnputStream $o servi$or e imprimin$o no console. 8m esbo,o:
Scanner servi#or G new Scanner(cliente. etQnputStream()); while (servi#or.hasDeAt9ine()) ! System.out.println(servi#or.neAt9ine()); &

Fembre que voc! precisar& $e no mnimo = threa$s para o cliente e = para o servi$or. /nt(o provavelmente voc! vai ter que escrever K classes. "elhorias possveis: ;a,a com o a primeira linha envia$a pelo cliente seja sempre o nicG $ele. / quan$o o servi$or enviar a mensa%em# fa,a ele enviar o nicG $e ca$a cliente antes $a mensa%em. / quan$o um cliente $esconectarC Como retir&-lo $a listaC L $ifcil fazer o envio $e arquivos pelo nosso sistema $e chatsC *aben$o que a leitura $e um arquivo ) feita pelo 8ileQnputStream# seria $ifcil man$ar esse QnputStream pelo 2utputStream $a cone (o $e re$eC

1C.11 - oluo do sistema de c$at


8ma solu,(o para o sistema $e chat cliente-servi$or com m6ltiplos clientes proposto nos $esafios acima. Eepare que a solu,(o n(o est& nem um pouco ele%ante: o main j& faz tu$o# al)m $e n(o tratarmos as e ceptions. 1 c+$i%o visa apenas mostrar o uso $e uma 52'. L uma p)ssima pr&tica colocar to$a a funcionali$a$e $o seu pro%rama no main e tamb)m $e jo%ar e ce,-es para tr&s. 0esta lista%em# faltam os $evi$os imports. 2rimeiro# as $uas classes para o cliente. Eepare que a 6nica mu$an,a %ran$e ) a classe nova# Eecebe$or:
pu"lic class +liente !

pu"lic static voi# main(Strin $% ar s) throws en0nown^ostCAceptionF Q2CAception ! (( #ispara cliente new +liente("/7Z.-.-./"F /7:6;).eAecuta(); & private Strin host; private int porta; pu"lic +liente (Strin this.host G host; this.porta G porta; & hostF int porta) !

pu"lic voi# eAecuta() throws en0nown^ostCAceptionF Q2CAception ! Soc0et cliente G new Soc0et(this.hostF this.porta); System.out.println("2 cliente se conectou ao servi#or!"); (( threa# para rece"er mensa ens #o servi#or [ece"e#or r G new [ece"e#or(cliente. etQnputStream()); new Phrea#(r).start(); (( lX ms s #o tecla#o e man#a pro servi#or Scanner tecla#o G new Scanner(System.in); PrintStream sai#a G new PrintStream(cliente. et2utputStream()); while (tecla#o.hasDeAt9ine()) ! sai#a.println(tecla#o.neAt9ine()); & sai#a.close(); tecla#o.close(); cliente.close();

& &

pu"lic class [ece"e#or implements [unna"le ! private QnputStream servi#or; pu"lic [ece"e#or(QnputStream servi#or) ! this.servi#or G servi#or; & pu"lic voi# run() ! (( rece"e ms s #o servi#or e imprime na tela Scanner s G new Scanner(this.servi#or); while (s.hasDeAt9ine()) ! System.out.println(s.neAt9ine()); & &

&

.& o *ervi$or sofreu bastante mo$ifica,-es. 5 classe Prata+liente ) a respons&vel por cui$ar $e ca$a cliente conecta$o no sistema:
pu"lic class Servi#or ! pu"lic static voi# main(Strin $% ar s) throws Q2CAception ! (( inicia o servi#or new Servi#or(/7:6;).eAecuta(); &

private int porta; private 9ist3PrintStream4 clientes; pu"lic Servi#or (int porta) ! this.porta G porta; this.clientes G new Jrray9ist3PrintStream4(); & pu"lic voi# eAecuta () throws Q2CAception ! ServerSoc0et servi#or G new ServerSoc0et(this.porta); System.out.println("Porta /7:6; a"erta!"); while (true) ! (( aceita um cliente Soc0et cliente G servi#or.accept(); System.out.println("Dova coneAo com o cliente " L cliente. etQnetJ##ress(). et^ostJ##ress() ); (( a#iciona sai#a #o cliente g lista PrintStream ps G new PrintStream(cliente. et2utputStream()); this.clientes.a##(ps); (( cria trata#or #e cliente numa nova threa# Prata+liente tc G new Prata+liente(cliente. etQnputStream()F this); new Phrea#(tc).start(); & & pu"lic voi# #istri"uiMensa em(Strin ms ) ! (( envia ms para to#o mun#o for (PrintStream cliente , this.clientes) ! cliente.println(ms ); & & & pu"lic class Prata+liente implements [unna"le ! private QnputStream cliente; private Servi#or servi#or; pu"lic Prata+liente(QnputStream clienteF Servi#or servi#or) ! this.cliente G cliente; this.servi#or G servi#or; & pu"lic voi# run() ! (( )uan#o che ar uma ms F #istri"ui pra to#os Scanner s G new Scanner(this.cliente); while (s.hasDeAt9ine()) ! servi#or.#istri"uiMensa em(s.neAt9ine()); & s.close(); & &

Captulo =B

Ap,ndice - 8nstalao do Java


"@uem pouco pensa# en%ana-se muito." Como vimos antes# a 4" ) apenas uma especifica,(o e $evemos bai ar uma implementa,(o. >& muitas empresas que implementam uma 4"# como a pr+pria 1racle# a 'B"# a 5pache e outros. 5 $a 1racle ) a mais usa$a e possui vers-es para Pin$ows# Finu e *olaris. 4oc! po$e bai ar o *3T acessan$o: http://www.oracle.com/technetworG/java/ 0esta p&%ina $a 1racle# voc! $eve escolher o .ava */# $entro $os top $ownloa$s. 3epois# escolha o .3T e seu sistema operacional.

2D.1 - 8nstalando no )buntu e em outros Ninu!


Ca$a $istribui,(o Finu tem sua pr+pria forma $e instala,(o. 5l%umas j& trazem o .ava junto# outras possibilitam que voc! instale pelos reposit+rios oficiais e em al%uns casos voc! precisa bai ar $ireto $a 1racle e confi%urar tu$o manualmente. 0o 8buntu# a $istribui,(o usa$a na Caelum# a instala,(o ) bastante simples. Basta ir no terminal e $i%itar:
su#o a##*apt*repository ppa,we"up#<team('ava su#o apt* et up#ate su#o apt* et install oracle*'avaZ*installer

Caso prefira utilizar o openj$G# a $istribui,(o opensource# basta fazer


su#o apt* et install open'#0*Z*'#0

0o linu fe$ora# voc! faria com su *c "yum install 'ava*/.Z.-*open'#0". *e voc! j& tiver outras vers-es instala$as no seu 8buntu# po$e utilizar su#o up#ate* alternatives **confi 'ava para escolher entre elas. 8ma instala,(o mais bra,al# sem usar reposit+rio # po$e ser feita bai an$o o instala$or no pr+prio site $a 1racle. L um tar. M que possui um ."in que $eve ser e ecuta$o. 3epois# ) necess&rio apontar JJ5J.^2MC para esse $iret+rio e a$icionar JJ5J.^2MC("in no seu PJP^.

2D.2 - Bo 0ac O R
1 "ac 1* M j& traz o .ava instala$o junto com o sistema operacional at) a vers(o 1B.Q. 5s vers-es mais novas# $o Fion em $iante# o instala$or $o "ac vai per%untar se voc! $eseja bai &-lo quan$o for ro$ar sua primeira aplica,(o .ava# como o /clipse. 5 vers(o para o .ava N ain$a n(o est& oficialmente $isponvel. 4oc! po$e bai &-la em: http://j$GN.java.net/macportpreview/ 4ai ser preciso trocar a vers(o pa$r(o $o .ava ap+s a instala,(o# in$o no painel $e 2references# e $epois .ava 2references. +oc, no est1 nessa p1#ina a toa

4oc! che%ou aqui porque a Caelum ) refer!ncia nacional em cursos $e .ava# EubD# 5%ile# "obile#

Peb e .0/H. ;a,a curso com quem escreveu essa apostila. Consulte as vanta%ens $o curso Java e Orientao a Objetos.

2D.% - 8nstalao do J>? em ambiente 3indo5s


2ara instalar o .3T no Pin$ows# primeiro bai e-o no site $a 1racle. L um simples arquivo e ecut&vel que cont)m o Pizar$ $e instala,(o: http://www.oracle.com/technetworG/java/

8nstalao
1. 3! um clique $uplo no arquivo '#0*3verso4*win#ows*i;<N*p.eAe e espere at) ele entrar no wizar$ $e instala,(o. =. 5ceite os pr+ imos $ois passos clican$o em *e#t. 5p+s um tempo# o instala$or pe$ir& para escolher em que $iret+rio instalar o *3T. 2o$e ser on$e ele j& oferece como pa$r(o. 5note qual foi o $iret+rio escolhi$o# vamos utilizar esse caminho mais a$iante. 5 c+pia $e arquivos iniciar&: R. 1 instala$or instalar& tamb)m o .ava;M =. 5p+s isso# voc! ser& $ireciona$o < uma p&%ina on$e voc! po$e# opcionalmente# criar uma conta na 1racle para re%istrar sua instala,(o.

Con-i#urando o ambiente
2recisamos confi%urar al%umas vari&veis $e ambiente ap+s a instala,(o# para que o compila$or seja acessvel via linha $e coman$o. Caso voc! v& utilizar $iretamente o /clipse# provavelmente n(o ser& necess&rio realizar esses passos. 1. Clique com o bot(o $ireito em cima $o cone Computador e selecione a op,(o $ropriedades. =. /scolha a aba "Confi%ura,-es 5van,a$as $e *istema" e $epois clique no bot(o "4ari&veis $e 5mbiente" R. 0esta tela# voc! ver&# na parte $e cima# as vari&veis $e ambiente $o usu&rio corrente e# embai o# as vari&veis $e ambiente $o computa$or 9servem para to$os os usu&rios:. Clique no bot(o *ovo444 $a parte $e bai o. K. /m *ome da <ari vel $i%ite JJ5J.^2MC e# em valor $a vari&vel# $i%ite o caminho que voc! utilizou na instala,(o $o .ava. 2rovavelmente ser& al%o como: +,=Pro ram

8iles=Java='#0/.Z.-.-:: e em O!.

Cliqu

J. 0(o vamos criar outra vari&vel# mas sim alterar. 2ara isso# procure a vari&vel 25H># ou 2ath 9$& no mesmo:# e clique no bot(o $e bai o "/$itar".

Q. 0(o altere o nome $a vari&velO 3ei e como est& e a$icione no final $o valor ; OJJ5J.^2MCO="in# n(o esque,a $o ponto-e-vr%ula - assim# voc! est& a$icionan$o mais

um caminho < sua vari&vel 2ath. N. 5bra o prompt# in$o em Iniciar# 2#ecutar e $i%ite cm#. Y. 0o console# $i%ite 'avac *version. 1 coman$o $eve mostrar a vers(o $o .ava

Compiler e al%umas op,-es. 4oc! po$e se%uir para a instala,(o $o /clipse# conforme visto no seu captulo# ou utilizar um e$itor $e te to simples como o bloco $e notas para os primeiros captulos $e apostila. @ualquer $6vi$a# n(o hesite $e post&-la no 7rupo $e 8su&rios .ava# em www.%uj.com.br. Captulo =1

Ap,ndice - >ebu##in#
"1lho por olho# e o mun$o acabar& ce%o."

21.1 - O que debu#ar


3ebu%%in% 9em portu%u!s# $epura,(o ou $epurar: ) um processo $e re$uzir ou encontrar bu%s no seu sistema. 3e uma forma %eral# $ebu%%in% n(o ) uma tarefa f&cil $e ser e ecuta$a. "uitas varia,-es po$em atrapalhar esse processo# por e emplo# a lin%ua%em que estamos utilizan$o e ferramentas $isponveis para fazermos $ebu%%in% $e um c+$i%o. 1 .ava em si facilita muito neste processo# pois nos fornece maneiras $e sabermos se o c+$i%o est& erra$o# por e emplo as e ceptions. /m lin%ua%ens $e bai o nvel saber on$e o bu% estava era e tremamente complica$o. 1 que tamb)m facilita nosso trabalho s(o as ferramentas $e $ebu%. 4eremos que elas s(o necess&rias nos casos que nossos testes $e uni$a$e $e lo%%in% n(o foram

suficientes para encontrar a raz(o $e um problema.

21.2 - >ebu#ando no =clipse


0o curso utilizamos o /clipse como '3/ para $esenvolvermos nosso c+$i%o. Como foi $ito ferramentas $e $ebu%%in% facilitam muito nosso trabalho# o /clipse ) uma $as '3/s mais po$erosas $o merca$o e nos fornece uma ferramenta que torna o processo e tremamente simples. 1 primeiro recurso que temos que conhecer quan$o come,amos a $ebu%ar no /clipse s(o os breaMpoints. /les s(o pontos $e parti$a em nosso c+$i%o para iniciarmos o processo $e $ebu%. 2or e emplo# no c+$i%o abai o# ima%ine que $esejamos $ebu%ar o comportamento $o m)to$o saca $a classe +onta# mais especificamente $o if que verifica se sal$o ) menor que o valor a ser saca$o. Colocaramos o breaMpoint e atamente na linha if (this.sal#o 3 valor) !:
pu"lic class +onta ! private #ou"le sal#o; pu"lic "oolean saca(#ou"le valor) ! if (this.sal#o 3 valor) ! return false; & else ! this.sal#o G this.sal#o * valor; return true; & & &

"as como fa,o issoC "uito simples# basta clicar na linha que $eseja a$icionar o breaGpoint# $epois clicar no menu ;un -Q &oo#le PreaMpoint.

/sse ) o tipo mais cl&ssico $e breaGpoint# veremos al%uns outros ao lon%o $o captulo. 5%ora que j& a$icionamos o breaGpoint que ) o ponto $e parti$a# vamos $ebu%ar nosso c+$i%o. 2recisamos ro$ar nosso c+$i%o# ou seja# chamar o m)to$o saca para que o breaGpoint seja encontra$o. Heremos um c+$i%o similar ao se%uinte:
pu"lic class Pesta+onta ! pu"lic static voi# main(Strin $% ar s) ! +onta conta G new +onta(); conta.saca(7--); & &

1 processo normal para e ecutarmos esse c+$i%o seria clicar no menu ,un )B ,un 8s )B Java 8pplication. 2or)m para ro$ar o nosso c+$i%o em modo debu# e ativar nosso breaGpoint# $evemos ro$ar o co$i%o no menu ,un )B 1ebug 8s )B Java 8pplication. @uan$o um breaGpoint for encontra$o no c+$i%o que est& sen$o e ecuta$o# o eclipse e ibir& uma perspectiva especfica $e $ebu%# apontan$o para a linha que tem o breaGpoint.

eus livros de tecnolo#ia parecem do sculo passado?

Conhe,a a Casa do C*di#o# uma nova e$itora# com autores $e $estaque no merca$o# foco em ebooMs 923;# epub# mobi:# pre,os imbat"veis e assuntos atuais. Com a cura$oria $a Caelum e e celentes autores# ) uma abor$a%em di-erente para livros $e tecnolo%ia no Brasil. Conhe,a os ttulos e a nova proposta# voc! vai %ostar. Casa $o C+$i%o# livros para o pro%rama$or.

21.% - Eerspectiva de debu#


Hemos v&rias informa,-es $isponveis nessa perspectiva# al%umas s(o essenciais e b&sicas para trabalharmos com $ebu% no nosso $ia-a-$ia# outras n(o t(o relevantes e s+ usamos em casos muito especficos. 3entro $a perspectiva $e $ebu%# temos uma aba chama$a 5aria"les. *(o e ibi$as to$as as vari&veis encontra$as $entro $o c+$i%o que voc! est& $ebu%an$o. 2or e emplo# no $ebu% que fizemos ser(o e ibi$as as vari&veis $o m)to$o saca# neste caso# valor. 5l)m $os atributos $e inst[ncia $o objeto.

2o$emos e ibir mais informa,-es sobre as vari&veis# basta a$icionarmos as colunas que $esejamos na tabela e ibi$a.

L possvel tamb)m a$icionarmos constantes e vari&veis est&ticas $a classe que est& sen$o $ebu%a$a.

0a aba Srea0points s(o e ibi$os to$os os breaGpoints que seu worGspace possui. "as por que isso ) importanteC L importante porque po$emos ver to$os os pontos $e $ebu% presentes e melhor# po$emos $esabilit&-los um a um ou to$os $e uma s+ vez. 4oc! po$e at) mesmo pe$ir para e portar os breaGpoints. 2ara $esabilitar ou habilitar to$os breaGpoints basta clicarmos no cone Mip All PreaMpoints. *e quisermos $esabilitar um a um# basta $esmarcar o checGbo e o breaGpoint ser& $esativa$o. Xs vezes# encontrar o c+$i%o on$e o breaGpoint foi coloca$o po$e ser complica$o# na aba Srea0points isso fica bem f&cil $e fazer# basta $ar um $uplo clique no breaGpoint e o eclipse automaticamente nos mostra a classe "$ona" $ele. @uan$o estamos $ebu%an$o c+$i%o# muitas vezes ) interessante saber o valor $e al%uma e press(o ou m)to$o. 2or e emplo# uma con$i,(o $entro $e um if# this.sal#o 4 valor. /sse valor n(o est& em uma vari&vel# ele est& em uma e press(o# o que po$e tornar saber o valor $ela complica$o. 5 feature $e CApressions $escomplica esse processo para n+s. 0a perspectiva $e 3ebu% temos a aba CApressions. Basta clicar com o $ireito $entro $a aba# e clicar em Add =!pression:

/ o resulta$o $a e press(o ) e ibi$o. Hemos outra aba importante chama$a $e Ee"u . 3entre as fun,-es $ela est(o:

&$reads - / ibe as threa$s que est(o sen$o e ecuta$as# e melhor# mostra qual threa$ efetuou a chama$a para o m)to$o on$e est& o $ebu%. 5l)m $isso mostra a pilha $e e ecu,(o# o que nos permite voltar a chama$a $e um m)to$o Parra de nave#ao - @ue permite alterarmos os caminhos que o $ebu% se%uir&.

5 lista a se%uir mostrar al%umas teclas e bot-es que alteram o caminho natural $os nosss $ebu%: /9 - 4ai para o pr+ imo passo $o seu pro%rama. *e o pr+ imo passo for um m)to$o# ele entrar& no c+$i%o associa$o? /< - Hamb)m vai para o pr+ imo passo# por)m se o pr+ imo passo for um m)to$o# ele n(o entrar& no c+$i%o associa$o? /@ - 4oltar& e mostrar& o m)to$o que fez a chama$a para o c+$i%o que est& sen$o $ebu%a$o. 0o nosso caso voltar& para o m)to$o main $a classe Pesta+onta? /A - 4ai para o pr+ imo breaGpoint# se nenhum for encontra$o# o pro%rama se%uir& seu flu o $e e ecu,(o normal. 4oc! tamb)m po$e usar os bot-es que est(o presentes na aba Ee"u .

21.6 - >ebu# avanado


3epois que colocamos um breaGpoint em al%um ponto $o nosso c+$i%o# po$emos colocar al%umas proprie$a$es nele# por e emplo# usar al%uma con$i,(o para restrin%ir quan$o o breaGpoint ser& ativa$o em tempo $e e ecu,(o. 2o$emos restrin%ir na proprie$a$e 7it Count que o breaGpoint s+ ser& ativa$o quan$o a linha em que ele encontra-se for e ecuta$a aMa vezes.

Como na ima%em acima o breaGpoint s+ ser& ativa$o quan$o a linha $e c+$i%o em que ele se encontra for e ecuta$a a=a vezes. 2o$emos tamb)m colocar al%uma e press(o con$icional# um if# por e emplo.

1 breaGpoint# neste caso# somente ser& ativa$o quan$o o ar%umento valor que foi passa$o ao m)to$o saca for maior que 1BB. 1 importante aqui ) notarmos que $evemos retornar sempre um valor booleano# se n(o o fizermos# teremos um erro em tempo $e e ecu,(o. /ssa proprie$a$e ) v&li$a quan$o queremos colocar aqueles famosos System.out.println("entrou no if tal") para efeito $e lo%# po$emos fazer isso colocan$o o lo% $entro $a e press(o con$icional nas proprie$a$es $o breaGpoint. 1 $isplaD ) uma $as partes mais interessantes $o $ebu% $o eclipse# ele prov! uma maneira $e e ecutarmos qualquer c+$i%o que quisermos quan$o estamos em $ebu%%in%. Criar uma classe# instanciar objetos $essa classe# utilizar ifas# foras# whileas# to$os os recursos $o .ava# al)m $e po$er utilizar as vari&veis# m)to$os# constantes $a classe que estamos $ebu%an$o. 8m e emplo cl&ssico ) quan$o estamos em $ebu%%in% e queremos saber o retorno $e al%um m)to$o $o qual n(o temos acesso# o que faramos antes seria colocar um amontoa$o $e System.out.println# poluin$o e tremamente nosso c+$i%o. 0o $isplaD o que fazemos ) efetuar a chama$a $esse c+$i%o e automaticamente os resulta$os s(o e ibi$os.

2ara vermos um efeito real $isso# vamos alterar um pouco o comportamento $a classe Conta# $e mo$o que a%ora o sal$o para saque tenha que ser o sal$o real mais o valor $o limite. 0osso c+$i%o fica assim:
pu"lic class +onta ! private #ou"le sal#o[eal; private #ou"le limite; pu"lic +onta(#ou"le limite) ! this.limite G limite; & pu"lic "oolean saca(#ou"le valor) ! if (!isSal#oSuficiente(valor)) ! return false; & else ! this.sal#o[eal G this.sal#o[eal * valor; return true; & & private "oolean isSal#oSuficiente(#ou"le valor) ! return (this.sal#o[eal L this.limite) 4 valor; & &

Eepare que o if que verifica se o sal$o ) suficiente para efetuarmos o saque chama um m)to$o isSal#oSuficiente# o que po$e ser um problema quan$o estamos $ebu%an$o# afinal a con$i,(o $o if ) um m)to$o. *e utilizarmos o $isplaD po$emos fazer a chama$a $o m)to$o isSal#oSuficiente# ver seu resulta$o e o melhor# n(o afetamos o $ebu%# apenas queremos ver o resulta$o $o m)to$o# por e emplo. 2ara e ibirmos a aba >ispla2 ) bem simples. Hecle Ctrl J %# $i%ite >ispla2 e a aba ser& e ibi$a. @uan$o ro$armos nosso c+$i%o em mo$o $ebu%# po$emos ir no $isplaD# $i%itarmos uma chama$a para o m)to$o isSal#oSuficiente# e ecutamos esse c+$i%o que foi $i%ita$o selecionan$o-o $entro $o $isplaD e teclan$o Ctrl J $i-t J > e o resulta$o ser& impresso# assim como na ima%em abai o:

"uitas vezes queremos "se%uir" al%uma vari&vel $e inst[ncia# ou seja# qualquer chama$a para essa vari&vel 9leitura ou escrita: queremos ser notifica$os $isso. 2o$emos usar o watchpoint# que far& nosso pro%rama entrar em mo$o $ebu%# quan$o qualquer altera,(o na vari&vel que estamos se%uin$o ocorrer# o pro%rama entrar& em $ebu% e atamente na linha que fez a altera,(o. 2ara colocarmos um watchpoint# basta $ar um $uplo clique no atributo $e inst[ncia que $eseja coloc&-lo.

L possvel alterar esse comportamento pa$r(o# e $efinir se voc! quer que o watchpoint seja ativa$o para leitura ou somente para escrita.

5 i$)ia $esse tipo $e breaGpoint ) fazer nosso pro%rama entrar em $ebu% quan$o al%uma e ce,(o especfica ocorrer. @uan$o $efinirmos essa e ce,(o no =!ception PreaMpoint e a mesma ocorrer# automaticamente nosso pro%rama entra em $ebu% na linha que %erou aquela e ce,(o. 2or e emplo#

vamos alterar o co$i%o $a classe Pesta+onta para que a mesma tenha uma DullPointerCAception:
pu"lic class Pesta+onta ! pu"lic static voi# main(Strin $% ar s) ! +onta conta G null; conta.saca(/-); & &

@uan$o ro$armos o c+$i%o acima# teremos uma DullPointerCAception. 2o$e ser 6til nesses casos $ebu%ar e saber on$e a e ce,(o est& ocorren$o $e fato# em qual linha mais especificamente. 2ara fazermos isso po$emos criar um / ception BreaGpoint# que $ebu%ar& c+$i%os que eventualmente lancem uma DullPointerCAception# por e emplo. Basta abrirmos a aba PreaMpoints e clicarmos no cone abai o:

*er& aberta uma janela on$e po$emos buscar por uma e ce,(o especfica.

2o$emos $efinir um breaGpoint que ) ativa$o ou antes ou $epois que o m)to$o ) chama$o. 2ara $efinirmos ele# basta estar em qualquer parte $o m)to$o que $esejamos $ebu%ar# clicar no menu ;un -Q &oo#le 0et$od PreaMpoint. 2o$emos e$itar as proprie$a$es $esse breaGpoint $izen$o se queremos que ele seja ativa$o antes9$efault: ou $epois $a e ecu,(o $o m)to$o. Basta acessar as proprie$a$es $o metho$ breaGpoint e alter&-las.

L util quan$o $esejamos que um breaGpoint seja ativa$o quan$o uma classe especfica for carre%a$a pela primeira vez# chamamos esse breaGpoint $e Class PreaMpoint. Basta clicarmos no menu ;un -Q Add Class Noad PreaMpoint# uma janela ser& aberta e basta $i%itarmos o nome $a classe e a$icionarmos:

21.9 - Ero-ilin#
8m $os principais h&bitos que n+s $esenvolve$ores $evemos evitar ) a quest(o $a otimiza,(o prematura# ou seja# quan$o $esenvolvemos uma aplica,(o para um cliente# $evemos nos preocupar em atender o requisitos -uncionais de maneira mais r1pida e mais simples poss"vel. 1 passo se%uinte ) refatorar seu c+$i%o para que ele seja melhora$o e para que no futuro possa se a$aptar as possveis mu$an,as. 5 re%ra ): "3ei e os problemas $o futuro# para serem resolvi$os no futuro". 8ma $as ferramentas que nos au iliam na quest(o $e n(o otimizar nosso c+$i%o prematuramente# s(o as ferramentas $e profilin%# que tornam aparentes# por e emplo# os problemas $e mem+ria e cpu# que po$em fazer com que otimizemos nosso c+$i%o. 5tualmente $evi$o as t)cnicas que utilizamos para entre%ar al%o $e valor para o cliente# focamos principalmente na quali$a$e# aspectos funcionais# testes# etc. 2or)m# muitos problemas que n(o fazem parte $os requisitos funcionais po$em acontecer apenas quan$o a aplica,(o est& em pro$u,(o# neste ponto as ferramentas $e profilin% tamb)m nos aju$am.

A#ora a mel$or $ora de aprender al#o novo

*e voc! %osta $e estu$ar essa apostila aberta $a Caelum# certamente vai %ostar $os novos cursos online que lan,amos na plataforma Alura. 4oc! estu$a a qualquer momento com a qualidade Caelum. Conhe,a a 5lura.

21.< - Ero-ilin# no =clipse &E&E


.untamente com o /clipse temos a op,(o $e instalar e utilizar uma ferramenta $e profilin% conheci$a como /clipse H2H2 9/clipse Hest b 2erformance Hools 2latform:# que nos fornece op,-es para isolar e i$entificar problemas $e performance# tais como: mem+ria 9memorD leaG:# recursos e processamento. 1 H2H2 nos permite analisar $e simples aplica,-es java at) aplica,-es que ro$am em m6ltiplas m&quinas e em m6ltiplas plataformas. Alternativas ao &E&E / istem al%umas alternativas ao H2H2# os mais conheci$os s(o 0etbeans 2rofiler 9http://profiler.netbeans.or%/: que ) %ratuito# e o .2rofiler 9http://www.ejtechnolo%ies.com/pro$ucts/jprofiler/overview.html: que ) pa%o. 1 H2H2 n(o vem por pa$r(o junto com o /clipse. 2ortanto# para utilizarmos ) necess&rio a instala,(o $o mesmo. 2o$emos fazer o processo $e instala,(o $e $uas maneiras. 5 primeira e mais f&cil ) utilizan$o o 8p$ate *ite $o /clipse que resolve as possveis $epen$!ncias e nos possibilita escolher quais features queremos instalar. 2ara instalar o H2H2 atrav)s $esse recurso# basta ir no menu: Help )B Install *e+ /o"t+are# uma janela ser& aberta# basta clicar em 5$$... e preench!-la conforme a ima%em a se%uir:

Basta a$icionar as ferramentas $o H2H2 em nosso eclipse# para isto# selecione o reposit+rio que acabamos $e a$icionar e a vers(o $o H2H2 que queremos instalar# neste caso# a vers(o K.Q.=.

8nstalando pelo Wip 4oc! tem a op,(o $e instalar o H2H2 bai an$o o zip $o projeto e colocan$o manualmente no $iret+rio $e instala,(o $o seu eclipse. "ais informa,-es no linG: http://www.eclipse.or%/tptp/home/$ownloa$s/K.Q.B/$ocuments/install%ui$e/'nstall7ui$eKQ.html 8m problema que po$e acontecer em aplica,-es e que muitas pessoas n(o conhecem a fun$o# ) a quest(o $o pool $e *trin%s que po$e eventualmente ficar muito %ran$e. /ste problema po$e ser causa$o porque objetos $o tipo *trin% s(o imut&veis# sen$o assim# se fizermos concatena,-es $e *trin%s muitas vezes# ca$a uma $essas concatena,-es pro$uzir& uma nova *trin%# que automaticamente ser& coloca$a no pool $a .4". 5 alternativa neste caso# seria trabalhar com objetos $o tipo *trin%Buil$er ou *trin%Buffer que funcionam como *trin%s# mas que n(o pro$uzem *trin%s novas em caso $e uma concatena,(o. "as como me$ir o tamanho $o nosso pool $e *trin%C 1 H2H2 possui uma aba $e estatsticas que nos mostra o tempo que um m)to$o levou para ser

e ecuta$o# quanto processamento esse m)to$o %astou# quanto $e mem+ria foi %asto com ca$a m)to$o. 4amos analisar al%umas $essas estatsticas crian$o um c+$i%o que concatene v&rias *trin%s# $e maneira que sobrecarre%ue o pool# %ere bastante processamento e consumo $e mem+ria.
pu"lic class Peste ! pu"lic static voi# main(Strin $% ar s) ! for (int i G -; i 3 /------; iLL) ! Strin A G "a" L i; System.out.println(A); & & &

2ara analisarmos o resulta$o $o c+$i%o# vamos ro$ar o c+$i%o $o main atrav)s $o menu ,un )B $ro"ile 8s )B Java 8pplication.

Das könnte Ihnen auch gefallen