Você está na página 1de 133

TUTORIAL:

A LINGUAGEM DE PROGRAMAO

JAVA

ORIENTAO A OBJETOS Instituto de Computao January, OO Andr Au!usto Cesta" aa#esta$d##"uni#amp"%r Orientadora& 'ro(a )ra Ce#*+ia ,ary -is#.er Ru%ira

INFORMAO SOBRE COPYRIGHT


Copyri!.t 01123 IC 3 4NICA,'" Este te5to e do#umentos re+a#ionados so prote!idos por #opyri!.t" Esta pu%+i#ao apresentada #omo est6 sem !arantia de erros e mudanas, se7am nos endereos 84R9:s; , te5to ou do #<di!o reuti+i=ado nos pro!ramas e5emp+o" 'ara o%ter a >+tima ?erso deste te5to #onsu+te http://www.dcc.unicamp.br/~aacesta ou http://www.dcc.unicamp.br Marcas Registradas: Sun, o +o!otipo da Sun, Sun ,i#rosystems, So+aris, @otJa?a e Ja?a so mar#as re!istradas de Sun ,i#rosystems, In#" nos Estados 4nidos e em a+!uns outros pa*ses" O persona!em A)uBeC mar#a re!istrada de Sun ,i#rosystems" 4NID mar#a re!istrada nos Estados 4nidos e outros pa*ses, e5#+usi?amente +i#en#iada por DEOpen Conpany, 9td"" Nets#ape Na?i!ator mar#a re!istrada de& ANets#ape Communi#ations CorporationC"

Pre !ci":
Este te5to (a= parte de um estudo #omparati?o de +in!ua!ens de pro!ramao orientadas a o%7etos" O #onte>do deste estudo tam% m est6 dispon*?e+ na AGor+d Gide Ge%C, 6rea mu+t*midia da internet, so% o endereo http://www.dcc.unicamp.br/~aacesta " Neste endereo, ?o#H pode #omp+ementar seu aprendi=ado, rodando e5er#*#ios iterati?os, a#essando A+inBsC para outros .iperte5tos so%re +in!ua!ens de pro!ramao, ?endo e5emp+os de pro!ramas e intera!indo #om ap+i#aIes para a internet" A di(erena entre este estudo e outros te5tos Jue ?o#H possa en#ontrar so%re o mesmo assunto o #ar6ter pr6ti#o" E5emp+os #omp+etos, di#as de pro!ramao, e5p+i#aIes so%re deta+.es norma+mente i!norados em +i?ros, tornaro seu aprendi=ado mais (6#i+, prin#ipa+mente na se!unda parte onde tratamos da #onstruo de ap+i#aIes para a internet" No ini#io, os e5emp+os podem ser #onsiderados (6#eis, mas e+es ?o se #omp+i#ando #ada ?e= mais de modo Jue importante Jue o +eitor a#ompan.e o te5to (a=endo os e5er#*#ios" -orne#eremos uma s rie de id ias de pro!ramas simp+es para Jue ?o#H possa testar seu #on.e#imento" Estes pro!ramas simp+es podem ser me+.orados atra? s do uso de inter(a#es !r6(i#as, assunto Jue no #o%erto neste tutoria+" #$EM %E&ERIA 'ER ESTE T$TORIA' Kua+Juer +eitor Jue ten.a e5periHn#ia #om pe+o menos uma +in!ua!em de pro!ramao" %IAGRAMAO %ESTE TE(TO Apesar de Java ser uma +in!ua!em Jue ser?e para ?6rios prop<sitos, o seu su#esso atua+ 8 po#a do seu +anamento; se de?e a possi%i+idade de e+a%orao de ap+i#aIes para a internet" )ada a importLn#ia deste aspe#to da +in!ua!em, este te5to est6 or!ani=ado de maneira seme+.ante as p6!inas en#ontradas na GGG, (reJuentemente ?o#H en#ontrar6 dia!ramas #omo o se!uinte& http://www.dcc.unicamp.br/~aacesta T4TORIA9
Estudo comparativo de linguagens de programao orientadas a objetos. Nesta pgina voc encontrar tutoriais sobre diversas linguagens orientadas a objetos, dentre elas: C , !odula"#, Java. $uanto a %ava, voc ter a oportunidade de ver c&digo de programas e test"los, al'm de poder ad(uirir a verso mais nova deste te)to.Encontrar tamb'm lin*s para sites sobre orientao a objetos.

Este dia!rama representa um .iperte5to Jue pode ser a#essado de modo a #omp+ementar seu estudo" A parte es#rita em +etra maior o endereo, o te5to em it6+i#o (a= um resumo do #onte>do desta p6!ina" 4sando estes A+inBsC ou dia!ramas ?o#H en#ontrar6 uma maneira ordenada de aprender sem se perder no mar de in(ormaIes da internet" 4R9& +ni,orm -esource .ocator, ' o endereo de um computador na internet O dia!rama a#ima apare#er6 toda ?e= Jue introdu=irmos uma pa+a?ra no?a" Caso ?o#H en#ontre a+!uma pa+a?ra des#on.e#ida, %asta usar o *ndi#e remissi?o para o%ter sua de(inio" M importante +em%rar Jue os .iperte5tos #itados neste tutoria+, no so de nossa responsa%i+idade" Como e+es esto su7eitos a mudanas, #ontamos #om a sua a7uda para e(etuarmos atua+i=aIes, #onte ?o#H tam% m #om a nossa a7uda na internet"
5

Os pro!ramas e5emp+o deste te5to so apresentados em #ai5as retan!u+ares, e todo #<di!o es#rito em (onte di(erente da usada neste te5to #omum" O tre#.os de #<di!o Jue apare#em desmem%rados de seus arJui?os, tem (undo #in=a #+aro" Todos os arJui?os presentes dentro dos retLn!u+os, so arJui?os Ate5t3on+yC, Jua+Juer (ormatao 8ne!rito; tem apenas (uno did6ti#a" Os resu+tados dos pro!ramas so indi#ados pe+o dia!rama ao +ado&

%I&ISO %O T$TORIA' Este tutoria+ #ont m uma seJuHn#ia de t<pi#os Jue permite apresentar a +in!ua!em so% a <ti#a da teoria de orientao a o%7etos" A apresentao do mode+o de o%7etos da +in!ua!em e #on#eitos re+a#ionados tais #omo po+imor(ismo, tratamento de e5#eIes est6 em primeiro p+ano" Ao +on!o dessa apresentao, em se!undo p+ano, ?o#H aprender6 os aspe#tos %6si#os da +in!ua!em tais #omo A+oopsC, des?ios #ondi#ionais, et#" Estes t<pi#os so (reJuentemente retomados, #ada ?e= de maneira mais apro(undada" Kuando terminamos o assunto m todos, ?o#H 76 est6 pronto para sa%er o Jue so #ontrutores, e e5atamente isto Jue ensinamos" 'or m o assunto #ontrutores no es!otado, ?o#H ainda ?ai aprender a usar #onstrutores em #on7unto #om a!re!ao e depois em #on7unto #om .erana" A maioria dos +eitores (i#a ansiosa para aprender #omo #riar ap+i#aIes para a internet, mas depois de satis(eita esta ansiedade ?o+tam para o ponto onde aprendem #omo pro!ramar na +in!ua!em e no apenas e5perimentar #om a #riao de %otIes, #ai5as de di6+o!o, ima!ens, et#" Se esse o seu #aso, re#omend6?e+ um AtourC pe+a GGG antes de #omear a pro!ramar, um %om AsiteC para #omear a pesJuisar #om um A%roNserC #ompat*?e+ #om Java 8Nets#ape Na?i!ator /"O ou superior; & http://www.Javasoft.com/applets A''9ETS
Links para vrios applets, divididos por categorias: games, sound, busines, animation... Divirtase...

/00.E12: 2o pe(uenos programas escritos em %ava (ue podem ser embebidos em documentos
3ipete)tos. 2o e)emplos de applets: anima4es, imagens, bot4es, etc. /pplets podem suportar e,eitos de multimidia como sons, itera4es com o usurio 5mouse, teclado6, imagens, anima4es, gr,icos, etc.

Ao +on!o do te5to,?o#H per#e%er6 Jue Ja?a e5#e+ente para desen?o+?er ap+i#aIes #omer#iais e para ser usada em uni?ersidades" Ja?a pode ser ?ista #omo uma (uso de ?6rias t #no+o!ias Jue ?Hm sendo desen?o+?idas na 6rea de #omputao, de modo Jue estudantes dessa +in!ua!em tem a oportunidade de tomar #ontato #om ?6rios t<pi#os re#entes& pro!ramao #on#orrente, sitemas distri%u*dos, orientao a o%7etos, proto#o+os da internet, e uma s rie de outros assuntos (6#eis de prati#ar nessa +in!ua!em" M #+aro Jue os resu+tados dependero de seu es(oro, portanto depois de +er esta introduo, des#anse um pou#o, tome um #a(e=in.o0" 'ois durante o restante do te5to esperaremos Jue ?o#H se en?o+?a #om a +in!ua!em, reuse pro!ramas en#ontrados na G"G"G, se #omuniJue #om #o+e!as
0

4m dos s*m%o+os da +in!ua!em uma 5*#ara de #a( Jue apare#e em animaIes #om sua (umaa Juente tremu+ando"

pro!ramadores, parti#ipe de +istas de dis#ussIes, neNs!roups 8#omp"+an!"Java P a+t"NNN".ot Java;, e o mais importante& 'ROQRA,E, 'ROQRA,E, RE3'ROQRA,ER A%#$IRIN%O O SOFT)ARE NECESS*RIO+ P'ATAFORMAS S$PORTA%AS 4m am%iente de pro!ramao Java norma+mente #omposto de um Bit de desen?o+?imento de ap+i#aIes Java e um A%roNser #ompat*?e+ #om esta +in!ua!em 8re#omend6?e+;" Se ?o#H no tem a#esso a esse am%iente de pro!ramao, tente estes endereos& http://Java.sun.com . -ai7 do 3iperte)to montado pelos criadores da linguagem. 2ob este endereo voc pode obter o
compilador e outras ,erramentas de desenvolvimento de aplica4es Java para a sua plata,orma de programao. 8i(ue atento9 :utros desenvolvedores esto criando ambientes de programao %ava.

A)OGN9OA) C

JAVA

http://www.netscape.com
A)OGN9OA) C ABROGSERSC

-ai7 do 3iperte)to montado pelos criadores do Netscape Navigator . 2ob este endereo voc pode obter o bro;ser Java compatible da Netscape Comunications <NC=.. :utros desenvolvedores esto lanando bro;sers compat>veis com Java.

http://www.microsoft.com
A)OGN9OA) C ABROGSERSC

/ microso,t licenciou a tecnologia %ava e a incorporou em seu novo bro;ser: <nternet E)plorer verso #.? ou superior.

@-:A2E-2: 2o uma categoria de programas (ue permitem voc visuali7ar um documento criado

em um certo padro, no caso 3tml 53iperte)t mar*up language6. /tualmente os bro;sers tem se tornado comple)os devido a (uantidade de padr4es e)istentes 5e). imagens .gi, .jpg, etc6. / linguagem %ava pode contribuir para minimi7ar esta comple)idade.

CARACTER,STICAS %A 'ING$AGEM Parecida c"- C+ C..: Java tem a aparHn#ia de C ou de CSS, em%ora a (i+oso(ia da +in!ua!em se7a di(erente" 'or este moti?o estaremos (reJuentemente (a=endo #omparaIes a+!uma destas +in!ua!ens" O +eitor Jue pro!rama em Jua+Juer uma de+as, ou em uma +in!ua!em orientada a o%7etos, se sentir6 mais a ?ontade e se tornar6 um %om pro!ramador Java em menos tempo" Java tam% m possui #ara#ter*sti#as .erdadas de muitas outras +in!ua!ens de pro!ramao& O%7e#ti?e3C, Sma++ta+B, Ei((e+, ,odu+a3T, et#" ,uitas das #ara#ter*sti#as desta +in!ua!em no so tota+mente no?as" Java uma (e+i= unio de te#no+o!ias testadas por ?6rios #entros de pesJuisa e desen?o+?imento de so(tNare" C"-/i0ada: 4m pro!rama em Java #ompi+ado para o #.amado A%yte3#odeC, Jue pr<5imo as instruIes de m6Juina, mas no de uma m6Juina rea+" O A%yte3#odeC um #<di!o de uma m6Juina ?irtua+ idea+i=ada

pe+os #riadores da +in!ua!em" 'or isso Java pode ser mais r6pida do Jue se (osse simp+esmente interpretada" P"rt!1e0: Java (oi #riada para ser port6?e+" O A%yte3#odeC !erado pe+o #ompi+ador para a sua ap+i#ao espe#*(i#a pode ser transportado entre p+ata(ormas distintas Jue suportam Java 8So+aris /"T, GindoNs3NT, GindoNs31U, ,a#EOs et#;" No ne#ess6rio re#ompi+ar um pro!rama para Jue e+e rode numa m6Juina e sistema di(erente, ao #ontr6rio do Jue a#onte#e por e5emp+o #om pro!ramas es#ritos em C e outras +in!ua!ens" Esta porta%i+idade importante para a #riao de ap+i#aIes para a .etero!Hnea internet" ,uitos d os pro!ramas e5emp+o deste tutoria+ (oram es#ritos e #ompi+ados numa p+ata(orma GindoNs31U e rodaram per(eitamente Juando simp+esmente #opiados para uma p+ata(orma So+aris /"T" Em Java um inteiro por e5emp+o, tem sempre T/ %its, independentemente da arJuitetura" O pr<prio #ompi+ador Java es#rito em Java, de modo Jue e+e port6?e+ para Jua+Juer sistema Jue possua o interpretador de A%yte3#odesC" 4m e5emp+o de pro!rama es#rito em Java o %roNser hotjava" Orie2tada a O34et"s: A porta%i+idade uma das #ara#ter*sti#as Jue se in#+ui nos o%7eti?os a+me7ados por uma +in!ua!em orientada a o%7etos" Em Java e+a (oi o%tida de maneira ino?adora #om re+ao ao !rupo atua+ de +in!ua!ens orientadas a o%7etos" Java suporta .erana, mas no .erana m>+tip+a" A ausHn#ia de .erana m>+tip+a pode ser #ompensada pe+o uso de .erana e inter(a#es, onde uma #+asse .erda o #omportamento de sua super#+asse a+ m de o(ere#er uma imp+ementao para uma ou mais inter(a#es" Java permite a #riao de #+asses a%stratas" Outra #ara#ter*sti#a importante em +in!ua!ens orientadas a o%7etos a se!urana" )ada a sua importLn#ia o t<pi#o (oi es#rito a parte" Seg5ra: A presena de #o+eta autom6ti#a de +i5o, e?ita erros #omuns Jue os pro!ramadores #ometem Juando so o%ri!ados a !eren#iar diretamente a mem<ria 8C , CSS, 'as#a+ ;" A e+iminao do uso de ponteiros, em (a?or do uso de ?etores, o%7etos e outras estruturas su%stituti?as tra= %ene(*#ios em termos de se!urana" O pro!ramador proi%ido de o%ter a#esso a mem<ria Jue no perten#e ao seu pro!rama, a+ m de no ter #.an#es de #ometer erros #omuns tais #omo Are(eren#e a+iasin!C e uso inde?ido de aritm ti#a de ponteiros" Estas medidas so parti#u+armente >teis Juando pensarmos em ap+i#aIes #omer#iais desen?o+?idas para a internet" Ser Astron!+y typedC tam% m uma ?anta!em em termos de se!urana, Jue est6 a+iada a e+iminao de #on?ersIes imp+*#itas de tipos de CSS" A presena de me#anismos de tratamento de e5#eIes torna as ap+i#aIes mais ro%ustas, no permitindo Jue e+as a%ortem, mesmo Juando rodando so% #ondiIes anormais" O tratamento de e5#eIes ser6 >ti+ na se!unda parte para mode+ar situaIes tais #omo (a+.as de transmisso e (ormatos in#ompat*?eis de arJui?os" S5/"rta c"2c"rr62cia:

A +in!ua!em permite a #riao de maneira (6#i+, de ?6rios At.readsC de e5e#uo" Este t<pi#o ser6 >ti+ Juando ?o#H estudar animaIes, e parti#u+armente poderoso nos am%ientes em Jue ap+i#aIes Java so suportadas, am%ientes estes Jue !era+mente podem mapear os t.reads da +in!ua!em em pro#essamento para+e+o rea+" E icie2te: Como Java (oi #riada para ser usada em #omputadores peJuenos, e+a e5i!e pou#o espao, pou#a mem<ria" Java muito mais e(i#iente Jue !rande parte das +in!ua!ens de As#riptin!C e5istentes, em%ora se7a #er#a de /O ?e=es mais +enta Jue C, o Jue no um mar#o de(initi?o" Com a e?o+uo da +in!ua!em, sero #riados !eradores de A%yte3#odesC #ada ?e= mais otimi=ados Jue traro as mar#as de per(orman#e da +in!ua!em mais pr<5imas das de CSS e C" A+ m disso um dia Java permitir6 a possi%i+idade de !erar #<di!o e5e#ut6?e+ de uma parti#u+ar arJuitetura Aon t.e (+yC, tudo a partir do A%yte3#odeC" S5/"rte /ara /r"gra-a78" de siste-as distri359d"s: Java (orne#e (a#i+idades para pro!ramao #om so#Bets, remote met.od #a++, t#p3ip, et#" Estes t<pi#os no sero a%ordados neste te5to"

PROGRAMAO ORIENTA%A A OB:ETOS


NOTA AOS PROGRAMA%ORES C A +eitura deste .iperte5to (ortemente re#omendada para os pro!ramadores Jue tem ACC ou CCS SC #omo sua prin#ipa+ +in!ua!em de pro!ramao, mesmo antes de ini#iar a +eitura deste tutoria+& http://www.dcc.unicamp.br/~aacesta/java/!roup.html "#li$ue em brewin! Java tutorial% A)OGN9OA) @re;ing Java: / 1utorial, +m tutorial de Java (ue segue o estilo do livro inicial sobre C, C
ABROGSERSC escrito por Bernig3an C -itc3ie DError: -e,erence source not ,oundE, ' a re,erncia bsica para este te)to. Cobre principalmente sinta)e de loops e outros assuntos ,ceis no abordados a(ui.

Ini#iaremos #om um pouJuin.o de teoria so%re orientao a o%7etos" Se ?o#H Juiser a+!um .iperte5to para apro(undamento ou para +er em para+e+o #om esta introduo so%re #+asses e o%7etos e use& http://www.dcc.unicamp.br/~aacesta/java/!roup.html
AT4TORIAISC Esta ' a 3omepage do grupo de estudos em Java. Foc vai encontrar lin*s atuali7ados para diversos lugares na internet onde se estuda %ava.

C'ASSES E OB:ETOS 4ma #+asse um tipo de(inido pe+o usu6rio Jue #ont m o mo+de, a espe#i(i#ao para os o%7etos, a+!o mais ou menos #omo o tipo inteiro #ont m o mo+de para as ?ari6?eis de#+aradas #omo inteiros" A #+asse en?o+?e, asso#ia, (unIes e dados, #ontro+ando o a#esso a estes, de(in*3+a imp+i#a em espe#i(i#ar os seus atri%utos 8dados; e seus m todos 8(unIes;" 4m pro!rama Jue uti+i=a uma inter(a#e #ontro+adora de um motor e+ tri#o pro?a?e+mente de(iniria a #+asse motor" Os atri%utos desta #+asse seriam& temperatura, ?e+o#idade, tenso ap+i#ada" Estes pro?a?e+mente seriam representados na #+asse por tipos #omo int ou float" Os m todos desta #+asse seriam (unIes para a+terar a ?e+o#idade, +er a temperatura, et#" 4m pro!rama editor de te5tos de(iniria a #+asse par6!ra(o Jue teria #omo um de seus atri%utos uma &trin! ou um ?etor de &trin!s, e #omo m todos, (unIes Jue operam so%re estas strin!s" Kuando um no?o par6!ra(o di!itado no te5to, o editor #ria a partir da #+asse 'ar(!rafo um o%7eto #ontendo as in(ormaIes parti#u+ares do no?o te5to" Isto se #.ama instan#iao ou #riao do o%7eto" ESPECIFICAN%O $MA C'ASSE Supon.a um pro!rama Jue #ontro+a um motor e+ tri#o atra? s de uma sa*da seria+" A ?e+o#idade do motor propor#iona+ a tenso ap+i#ada e esta propor#iona+ aos %its Jue ?o para sa*da seria+ e passam por um #on?ersor di!ita+ ana+<!i#o" Wamos a%strair todos estes deta+.es por enJuanto e mode+ar somente a inter(a#e do motor #omo uma #+asse, a per!unta Jue m todos e Jue atri%utos de?e ter nossa #+asse, Jue ar!umentos e ?a+ores de retorno de?em ter os m todosX Re/rese2ta78" da 1e0"cidade:
0O

A ?e+o#idade do motor ser6 representada por um atri%uto inteiro 8int;" 4saremos a (ai5a de %its Jue pre#isarmos, #aso o ?a+or de %its ne#ess6rio no possa ser (orne#ido pe+o tipo , usaremos ento o tipo lon!, isto depende do #on?ersor di!ita+ ana+<!i#o uti+i=ado" Re/rese2ta78" da sa9da seria0: O motor pre#isa #on.e#er a sua sa*da seria+, a sua +i!ao #om o Amotor do mundo rea+C" Supon.a uma representao em .e5ade#ima+ do atri%uto endereo de porta seria+, um poss*?e+ nome para o atri%uto: enderecomotor" No se preo#upe em sa%er #omo usar a representao .e5ade#ima+" A0tera78" d" 1a0"r da 1e0"cidade: Internamente o usu6rio da #+asse motor pode dese7ar a+terar a ?e+o#idade, #ria3se ento o m todo& public void altera)velocidade"int novav%*" O #<di!o anterior #orresponde ao #a%ea+.o do m todo e+e de(inido 7unto #om a #+asse motor, asso#iado a e+a" O ?a+or de retorno da (uno Jue Aimp+ementaC o m todo void, poderia ser #riado um ?a+or de retorno 8boolean; Jue indi#asse se o ?a+or de ?e+o#idade era permitido e (oi a+terado ou no era permitido e portanto no (oi a+terado" O ato de in?o#ar um m todo tam% m #.amado de passar uma mensa!em para o o%7eto Jue est6 e5e#utando este m todo" No (a= sentido usar, #.amar, este m todo separado de uma ?ari6?e+ do tipo motor, mas ento porJue na +ista de ar!umentos da (uno no se en#ontra um motorX Este pensamento re(+ete a maneira de asso#iar dados e #<di!o 8(unIes; das +in!ua!ens pro#edurais" Em +in!ua!ens orientadas a o%7etos o #<di!o e os dados so +i!ados de (orma di(erente, a pr<pria de#+arao de um tipo de(inido pe+o usu6rio 76 en!+o%a as de#+araIes das (unIes inerentes a este tipo, isto ser6 e5p+i#ado em " O o%7eto ao Jua+ ap+i#ado o m todo passado de outra (orma" Note Jue no (orne#emos o #<di!o do m todo, isto no importante, por .ora a preo#upao #om a inter(a#e de(inida pe+a #+asse& seus #a%ea+.os de m todos e atri%utos" Apenas pense Jue sua inter(a#e de?e ser (+e5*?e+ de modo a no apresentar entra?es para a #riao do #<di!o Jue seria (eita numa outra etapa" Nesta etapa ter*amos Jue ima!inar Jue o ?a+or num ri#o da ?e+o#idade de?e ir para o #on?ersor onde ir6 se trans(ormar numa di(erena de poten#ia+ a ser ap+i#ada nos terminais do motor, et#" $- diagra-a si-/0i icad" da c0asse -"t"r c"- "s atri35t"s e -;t"d"s:

Este e outros dia!ramas deste te5to (oram e+a%orados #om uma (erramenta #ase para Ao%7e#t oriented mode+in! and desi!nC se!undo a metodo+o!ia des#rita em YZ

E<erc9ci"s: =>
++

9em%re3se de a+!um pro!rama em Jue ?o#H tra%a+.ou, #ite Jue tipos de #+asses seriam #riadas se esse pro!rama (osse es#rito em Java, Jue atri%utos e Jue m todos estariam asso#iados a esses o%7etosX E<e-/0": AEu tra%a+.ei em um pro!rama de #ontas a pa!ar e #ontas a re#e%er" Se esse pro!rama (osse es#rito em Java eu de(iniria a #+asse conta)bancaria" Os atri%utos seriam& saldo, ta,a)de)juros, limite)de)sa$ue, et#" ,in.a opo seria por represent63+os #omo ?ari6?eis do tipo double 8no se preo#upe em usar os tipos da +in!ua!em inda%C" A)entre os m todos desta #+asse estariam (unIes para e(etuar saJues, dep<sitos e #omputar 7uros"C OB:ETOS EM JAVA O%7etos so instLn#ias de uma #+asse" Kuando um o%7eto #riado e+e pre#isa ser ini#ia+i=ado, ou se7a para uma >ni#a #+asse de nome -studante.e/raduacao podemos ter ?6rios o%7etos durante a e5e#uo de um pro!rama" Estudante de !raduao Andre[ Identi(i#ao 017+2[ Curso #omputacao \ Estudante de !raduao 3ui4a , Identi(i#ao 2 350 , Curso 6edicina""" A #+asse representa somente o mo+de para a #riao dos o%7etos, estes sim #ont m in(ormao, ?e7a t<pi#o C9ASSES E OBJETOS" O atri%uto Identi(i#ao tem ?a+or 1FO]0V para a instLn#ia 8o%7eto; Andr da #+asse Estudantes de Qraduao" <N21/NC</2: +m objeto e)istente durante um momento da e)ecuo de um programa ' uma
instancia de uma classe.

4ma #+asse e suas instan#ias&

Cada estudante 8ou instan#ia; poderia ser mode+ado, desen.ado #omo&

O%7etos podem #onter o%7etos, ou se7a os atri%utos de um o%7eto podem ser o%7etos, da mesma #+asse ou no" O%7etos podem ser passados pe+a rede, arma=enados em meio (*si#o" O%7etos possuem um estado e um #omportamento" , todos podem re#e%er o%7etos #omo ar!umentos, podem de#+arar o%7etos #omo ?ari6?eis +o#ais, podem #.amar outros m todos" Wo#H pode #.amar um m todo 8mandar uma mensa!em; para o%7etos em outras m6Juinas atra? s de sua rede" 4m o%7eto pode ser ?isto #omo um RECOR), s< Jue #om uma ta%e+a de (unIes Jue podem ser #.amadas para e+e" Na ?erdade esta de(inio no muito te<ri#a, mas um %om #omeo para os pro!ramadores Jue esto a#ostumados #om +in!ua!ens pro#edurais" Na ?erdade podemos (a=er #om o%7etos muito mais do Jue (a=emos #om re#ords e pro#edimentos em 'as#a+" Em Java, ao #ontr6rio de CSS e ,odu+a3T, no e5istem (unIes des?in#u+adas de #+asses, (unIes iso+adas" Isto imp+i#a Jue todo tre#.o de #<di!o Jue (or es#rito de?e perten#er a uma #+asse, mais pre#isamente de?e ser um m todo desta" O pro!rama mais simp+es em Java de?e #onter pe+o menos uma #+asse e um m todo de in*#io de pro!rama, e este pro!rama Jue (aremos a!ora" Esta (i+oso(ia simp+es e seme+.ante a adotada em Ei((e+, tudo o Jue se pode (a=er #om pro#edimentos, (unIes iso+adas e ?ari6?eis de pro#edimentos, tam% m se pode (a=er #om #+asses e
0/

m todos" CSS tin.a Jue permitir a #riao de (unIes iso+adas para manter a #ompati%i+idade #om ACC, mas Java no" Kuando neste te5to usarmos o termo (uno no +u!ar de m todos estaremos mais interessados em en(ati=ar a parte de imp+ementao em detrimento da inter(a#e, ?o#H pensar Jue em Java toda (uno imp+ementa um m todo de uma #+asse" O +eitor no a#ostumado #om o paradi!ma de orientao a o%7etos, pode a#.ar estran.as as a(irmaIes a#ima, e a per!unta mais #omum neste momento & A,as ento #omo ?o#H sa%e aonde ?ai #omear o pro!ramaXC" Antes da resposta a essa per!unta, +eia o primeiro pro!rama e5emp+o, Jue seme+.ante ao primeiro pro!rama em C, A@e++o Gor+dC, presente em YZ" PROGRAMA HE''O INTERNET? Este e5emp+o ?isa apresentar um pro!rama simp+es para imprimir uma mensa!em na te+a, este pro?a?e+mente ser6 seu primeiro pro!rama em Ja?a" COMPILANDO UM PRIMEIRO PROGRAMA: =3Certi(iJue3se de ter adi#ionado a sua +ista de pat.:s o pat. do #ompi+ador e interpretador Java. Javac e Java respe#ti?amente" @3Crie o arJui?o ao +ado em um diret<rio Jua+Juer 8A(o+derC para usu6rios ma#; e sa+?e #om o nome& 7ello8nternet.Java A3C.ame o #ompi+ador Java para este arJui?o& Javac 7ello8nternet.Java B3Seu diret<rio de?e ter re#e%ido um no?o arJui?o ap<s essa #ompi+ao& HelloInternet.class C3C.ame o interpretador Java para este arJui?o 8omita a e5tenso "#+ass de arJui?o;& Java HelloInternet D3O%ser?e o resu+tado na te+a& 7ello 8nternet9 ?

//#omentario de uma linha public class HelloInternet : public static void main "&trin! ar!s;<% : &=stem.out.println">7ello 8nternet9>%* ?

Hello Internet!

Res"01e2d" "s e1e2t5ais /r"30e-as: Compi+e este pro!rama" Wo#H pode de#idir por no prosse!uir enJuanto no #ompi+63+o" Se ?o#H (or #omo eu, e prin#ipa+mente se ti?er di!itado tudo ao en? s de usar A#opy and pasteC, %em pro?6?e+ Jue e+e no #ompi+e, se isto o#orrer, +eia atentamente o pro!rama" Wo#H no esJue#eu o ponto e ?*r!u+aX E as #.a?esX 7ellointernet #omea #om +etra mai>s#u+a, e isso (a= di(erena0, ?o#H (oi #oerente #om a #on?eno adotada de +etras mai>s#u+as e min>s#u+as para seus identi(i#adoresX Wo#H esta?a no mesmo diret<rio de 7ello8nternet.java Juando #.amou o #ompi+adorX E Juando #.amou o interpretadorX Tam% mX
0

Identi(i#adores em +etras mai>s#u+as e min>s#u+as so di(erentes, a +in!ua!em A#ase3sensiti?eC" +3

Se ainda no der #erto, no se desespere, +eia as e5p+i#aIes passo a passo do pro!rama e depois re#orra a um usu6rio mais e5periente" Norma+mente a Java muito (6#i+ de se pro!ramar, e ?o#H pre#isar6 de pou#a a7uda, o seu interesse o (ar6 #ada ?e= mais (ami+iar #om esta +in!ua!em" E</0ica78" /ass" a /ass" d" /r"gra-a e<e-/0": //#omentario de uma linha Coment6rios em Java se!uem a mesma sinta5e de CSS, AEEC ini#ia uma +in.a de #oment6rio, todo o restante da +in.a i!norado" E5iste tam% m um outro tipo de #oment6rio (ormado por /@ 8nsira a$ui o te,to a ser i!norado @/ , este tipo de #oment6rio pode ser inter#a+ado em uma +in.a de #<di!o" Coment6rios so tratados #omo espaos em %ran#o" public class 7ello8nternet : class a pa+a?ra reser?ada Jue mar#a o ini#io da de#+arao de uma #+asse" 'ublic um espe#i(i#ador, por enJuanto !uarde public class #omo o in*#io da de#+arao de uma #+asse" Toda #+asses sero de#+aradas assim at o t<pi#o ENCA'S49A,ENTO )E ATRIB4TOS E ,MTO)OS CO, 'AC^AQESENCA'S49A,ENTO )E C9ASSES CO, 'AC^AQES" 7ello8nternet M o nome dado a esta #+asse" O Aa%re #.a?esC mar#a o in*#io das de#+araIes da #+asse Jue so os atri%utos e m todos" Esta #+asse s< possui uma de#+arao, a do m todo main, note Jue um m todo, ao #ontr6rio de CSS, s< pode ser de#+arado _internamente` a #+asse a Jua+ perten#e, e?itando as #on(usIes so%re Aes#opoC" )esta (orma, todo pedao de #<di!o em Java de?e perten#er ao a%re #.a?es, (e#.a #.a?es da de(inio de uma #+asse" public static void main "&trin! ar!s;<% : &=stem.out.println">7ello 8nternet9>%* ? public M um Jua+i(i#ador do m todo Jue indi#a Jue este a#ess*?e+ e5ternamente a esta #+asse 8para outras #+asses Jue e?entua+mente seriam #riadas;, no se preo#upe #om e+e a!ora, apenas de#+are todos os m todos #omo public" Wo+taremos a este assunto em " ENCA'S49AN)O ,MTO)OS E ATRIB4TOS static M um outro Jua+i(i#ador ou Aspe#i(ierC, Jue indi#a Jue o m todo de?e ser #omparti+.ado por todos os o%7etos Jue so #riados a partir desta #+asse" Os m todos static podem ser in?o#ados, mesmo Juando no (oi #riado nen.um o%7eto para a #+asse, para ta+ de?e3se se!uir a sinta5e: ABome#lasseC.ABomemetodo&taticC"ar!umentos%*. Retornaremos a esta e5p+i#ao mais tarde, por .ora ?o#H pre#isa sa%er Jue parti#u+armente o m todo main pre#isa ter essa Jua+i(i#ao porJue e+e #.amado sem Jue se #rie nen.um o%7eto de sua #+asse 8a #+asse 7ello8nternet;" C5ri"sidade: Se ?o#H !osta de parado5os e 76 #on.e#e um pou#o de orientao a o%7etos, pense Jue se o m todo main ti?esse Jue ser #.amado para um o%7eto 8o Jue no o #aso; este o%7eto teria Jue ter
0F

sido #riado em a+!um outro +u!ar ento este +u!ar seria o in*#io do pro!rama e main+ dei5aria de ter esta (ina+idade" A +in!ua!em de pro!ramao Ei((e+ adota uma t #ni#a di(erente para reso+?er este pro%+ema& todo pro!rama #omea #om a #riao de um o%7eto 8e no mais a #.amada autom6ti#a de main;, este o%7eto #.amado ROOT, e+e pode #onter atri%utos Jue so ini#ia+i=ados e um m todo de ini#ia+i=ao, #onstrutor do o%7eto, Jue o in*#io do #<di!o do pro!rama" void Seme+.ante ao void CSS ou C, o ?a+or de retorno da (uno, Juando a (uno no retorna nen.um ?a+or e+a retorna void, uma esp #ie de ?a+or ?a=io Jue tem Jue ser espe#i(i#ado" main Este um nome parti#u+ar de m todo Jue indi#a para o #ompi+ador o in*#io do pro!rama, dentro deste m todo e atra? s das iteraIes entre os atri%utos, ?ari6?eis e ar!umentos ?is*?eis ne+e Jue o pro!rama se desen?o+?e" "&trin! ar!s;<% M o ar!umento de main e por #onseJuHn#ia do pro!rama todo, e+e um ?etor de Strin!s Jue (ormado Juando so passados ou no ar!umentos atra? s da in?o#ao do nome do pro!rama na +in.a de #omando do sistema opera#iona+, e5emp+o& Java 7ello8nternet ar!umentote,to+ ar!umentote,to5 No nosso #aso, i!noramos a poss*?e+ passa!em de ar!umentos ?ia +in.a de #omando, retornaremos a este assunto em " _ """ ` AA%re #.a?esC e A(e#.a #.a?esC" 'ara Juem no #on.e#e C ou CSS, e+es podem ser entendidos #omo a+!o seme+.ante ao D-/8B -B. de 'as#a+ ou ,odu+a3T, ou se7a& de+imitam um %+o#o de #<di!o" Os pro!ramadores 'as#a+ notaro Jue ?ari6?eis +o#ais dos m todos podem ser de#+aradas em Jua+Juer +o#a+ entre as #.a?es" ,as por moti?os de #+are=a do #<di!o de#+araremos todas no in*#io do a%re #.a?es" &=stem.out.println">7ello 8nternet9>%* C.amada do m todo println para o atri%uto out da #+asse ou o%7eto &=stem, o ar!umento uma #onstante do tipo Strin!" println assim #omo writeln de 'as#a+, imprime a &trin! e posi#iona o #ursor na +in.a a%ai5o , ana+o!amente print no a?ana +in.a" 'or .ora ?o#H pode !uardar esta +in.a de #<di!o #omo o #omando para imprimir mensa!ens na te+a, onde o ar!umento Jue ?em entre aspas a &trin! a ser impressa" O [ Aponto e ?*r!u+aC separa operaIes" ` -ina+mente o (e#.a #.a?es termina #om a de#+arao da #+asse 7ello8nternet" C"2c05s8": Norma+mente o ?o+ume de #on#eitos presentes num primeiro pro!rama de uma +in!ua!em orientada a o%7etos #omo Java ou Ei((e+ !rande se #omparado #om o de um primeiro pro!rama em C
0

main, do in!+Hs& 'rin#ipa+" +5

ou 'as#a+" Esses #on#eitos ainda sero apro(undados e so #itados aJui apenas por #uriosidade, norma+ Jue ?o#H no ten.a entendido tudo" )e a!ora em diante no e5p+i#aremos mais #omo #ompi+ar os pro!ramas" E<erc9ci"s: => E5perimente (a=er modi(i#aIes no pro!rama 7ello8nternet" Imprima outras mensa!ens na te+a, adi#ione #oment6rios" ATRIB$TOS No pro!rama anterior, no o%ser?amos a #riao de nen.um o%7eto, apenas a de#+arao da #+asse 7ello8nternet Jue #ontin.a o m todo main" O nosso pro!rama (un#ionou, porJue o m todo main no pre#isa de um o%7eto espe#*(i#o para ser in?o#ado" Este e5emp+o de#+ara uma #+asse 8#irculo; e em se!uida #ria um o%7eto deste tipo em main e a+tera o #onte>do desta ?ari6?e+" 4ma #+asse pare#ida #om um re#ord de 'as#a+, a nossa representa um #*r#u+o #om os atri%utos raio e , , =, Jue so #oordenadas #artesianas" Note Jue este o%7eto no possui m todos ainda" A #+asse #*r#u+o espe#i(i#ada em um arJui?o separado do arJui?o da #+asse Jue #ont m o m todo main 8in*#io do pro!rama;, um arJui?o neste te5to representado pe+o retLn!u+o en?o+?endo um tre#.o de #<di!o, at o t<pi#o ENCA'S49A,ENTO )E C9ASSES CO, 'AC^AQES #ada #+asse ser6 espe#i(i#ada em um arJui?o" M importante entender este e5emp+o, Juando ?o#H estudar inter(a#es !r6(i#as, poder6 usar a #+asse #*r#u+o pr 3de(inida na +in!ua!em para desen.ar #*r#u+os Jue se mo?em na te+a" Em%ora no ten.amos e5p+i#ado #om deta+.es os tipos %6si#os da +in!ua!em, usaremos neste e5emp+o o tipo float 8rea+;, e nas e5p+i#aIes o tipo &trin! e o tipo int 8inteiro;" No (ina+ deste t<pi#o (orne#eremos uma e5p+i#ao deta+.ada so%re tipos"

//#lasse circuloE ar$uivo #irculo.Java public class #irculo : //so atributos entre as chaves public float raio !!atributo raio "o circulo public float # //posicoes em coordenadas cartesianas public float $ ? //#lasse principalE Ar$uivo 'rincipal.Java

02

public class 'rincipal : public static void main"&trin! ar!s;<% : Circulo u%circ //declaracao de uma variavel circulo no metodo main. u%circ&ne' Circulo() !!alocacao "e**a +aria+el &=stem.out.println">">Fu%circ,#F>E>Fu%circ,$F>E>Fu%circ,raioF>%>%* u%circ,#&u%circ,#-./ &=stem.out.println">">Fu%circ,#F>E>Fu%circ,$F>E>Fu%circ,raioF>%>%* ? ? "1E1E1% "+7E1E1%

P"rE5e "s -ate-!tic"s 28" g"sta- de C+ C..+ Ja+a e Basic: A de#+arao umcirc.,Gumcirc.,F+7 presente em nosso pro!rama dei5a os matem6ti#os doidos pois de ?o#H su%trair umcirc., de #ada um dos +ados da Ai!ua+dadeC a e5presso se torna 1G+7" O#orre Jue a no o operador de teste de i!ua+dade e sim de atri%uio, e+e tem a mesma (uno do &a de 'as#a+ a Jua+ os matem6ti#os adoram" O operador de teste de i!ua+dade em Java & GG Mais s"3re arE5i1"s: Como pode ser o%ser?ado, #ada arJui?o te5to do pro!rama est6 en?o+?ido em uma mo+dura retan!u+ar" Neste #aso as duas #+asses #riadas& #irculo e 'rincipal, esto em arJui?os separados" A seJuHn#ia de a+teraIes em seu diret<rio ou (o+der & I2ici": A/Fs Ja+ac A*Dua*Junta*,Ja+a:

O #ompi+ador de?e ser #.amado para am%os arJui?os" Ou ?o#H pode usar os #.amados ANi+d#ardsC0 javac @.java" Se- I2c05des:

Gi+d3Card, do in!+Hs& Corin!a , #arta de %ara+.o" O b su%stitui os nomes de todos os arJui?os, assim #omo o #orin!a pode sus%tituir todas as #artas em 7o!os de %ara+.o"
0

+7

Se ?o#H 76 pro!rama em a+!uma outra +in!ua!em pro?a?e+mente de?e estar #om a se!uinte d>?ida& AWo#Hs usaram o nome da #+asse #irculo na #+asse 'rincipal, am%as esto em arJui?os separados, #omo o #ompi+ador sa%e em Jue diret<rio est6 a #+asse #irculoX No pre#iso (a=er uma esp #ie de in#+ude para poder usar a #+asse #irculo em outro arJui?oXC A resposta no" O #ompi+ador sa%e a#.ar se e+a esti?er so% o diret<rio de seu pro!rama" Se ?o#H ti?er Jue dei5ar esta #+asse em outro diret<rio ento e+a de?e (a=er parte de um pa#Ba!e e ?o#H ter6 Jue importar e5p+i#itamente este pa#Ba!e, ?eremos #omo (a=H3+o mais tarde" C0asse Circulo e dec0ara78" de atri35t"s: O primeiro arJui?o deste e5emp+o #ont m o #<di!o da #+asse #irculo, esta #+asse #ont m trHs atri%utos " A de#+arao de atri%utos se!ue sinta5e seme+.ante a de CSS 8.a?ero a#r s#imos a esta sinta5e;& -specificador6odoAcesso BomeHipo BomeAtributo* public float raio* public float ,* public float =* Todos os atri%utos perten#entes a #+asse so do tipo float 8'onto (+utuante T/3%it IEEE]UF, ?e7a ta%e+a de tipos %6si#os;" Esto espe#i(i#ados #omo public o Jue si!ni(i#a Jue podem ser modi(i#ados a partir de uma #+asse Jue usa um o%7eto #irculo se7a #omo ?ari6?e+ de m todo ou #omo atri%uto 8este tipo de modi(i#ao ser6 e5emp+i(i#ado na #+asse 'rincipal;" E5istem outros espe#i(i#adores Jue a%ordaremos mais adiante, por .ora todos os m todos e atri%utos Jue #riarmos de?ero ser public" Wa+e +em%rar Jue na de#+arao de ?ari6?eis simp+es em m todos, no (a= sentido usar o -specificador6odoAcesso. Esta #+asse #irculo no possui m todos" Como e5emp+o de de#+arao de ?ari6?eis simp+es tome a de#+arao de uma ?ari6?e+ Cir#u+o no m todo main" Se!uida de sua a+o#ao& u%circ&ne' Circulo() !!alocacao "e**a +aria+el, Sem a a+o#ao a ?ari6?e+ no pode ser usada" Note Jue os atri%utos so por de(au+t ini#ia+i=ados para =ero" C0asse Pri2ci/a0 dec0ara78" e i2icia0iGa78" de atri35t"s: A #+asse 'rincipal no possui atri%utos, porJue nen.um o%7eto desta #+asse #riado, apenas seu m todo main #.amado" O m todo main de#+ara uma re(erHn#ia para o%7eto da #+asse #irculo& #irculo umcirc*" Note Jue di(erentemente de CSS no so ne#ess6rios Ain#+udesC ou A.eader (i+esC para poder de#+arar essa ?ari6?e+ de um AtipoC de(inido pe+o usu6rio e e5istente em outro arJui?o" Antes da re(erHn#ia ao o%7eto ser usada, este pre#isa ser a+o#ado na mem<ria o Jue (eito atra? s de umcircGnew #irculo"%*. Se ?o#H ti?esse de#+arado um o%7eto da #+asse &trin!, 76 de(inida na +in!ua!em, e depois (i=esse sua a+o#ao, o #<di!o seria seme+.ante ao se!uinte& &trin! umastrin!* umastrin!Gnew &trin!"IValor inicialJ%* A di(erena #om a a+o#ao do o%7eto #irculo Jue entre os parHnteses in#+uem um ar!umento AWa+or ini#ia+C, isto o#orre porJue a +in!ua!em permite Jue ?o#H apro?eite a a+o#ao de um o%7eto para ini#ia+i=ar a+!uns de seus atri%utos, isto ser6 e5p+i#ado em "CONSTR4TORES" Neste nosso pro!rama, os atri%utos #ontidos na 6rea de mem<ria a+o#ada por new, so a+terados de outra (orma"
0V

C"0eta a5t"-!tica de 0i<": A desa+o#ao do o%7eto (eita pe+a +in!ua!em, 8Aautomati# !ar%a!e #o++e#tionC;, ?o#H no pre#isa se preo#upar #om e+a" Ap<s o (e#.a #.a?es de main, a mem<ria do o%7eto umcirc 76 pode ser +i%erada, o Jue norma+mente no o#orre de imediato, pois o am%iente da +in!ua!em e5e#uta um AtreadC em %ai5a prioridade Jue +i%era de tempos em tempos os espaos inuti+i=ados de mem<ria, tirando pro?eito por e5emp+o de e?entuais pausas de iterao do usu6rio #om o pro!rama" 'or e5e#utar em um AtreadC entenda para+e+amente ou Juase para+e+amente, ?o+taremos a este t<pi#o mais adiante" Acess" a"s atri35t"s e -;t"d"s e a0tera7Hes d"s atri35t"s: O a#esso aos atri%utos da ?ari6?e+ 8o%7eto; umcirc de?e ser (eito usando o nome do o%7eto e o nome do atri%uto deste, separados por um ponto& umcirc.raioG+1.1* " Note Jue raio so=in.o no (a= sentido no pro!rama, pre#isa3se espe#i(i#ar de Jue o%7eto se dese7a a+terar ou o%ter o raio" A sinta5e de #.amadas de m todos seme+.ante a sinta5e des#rita a#ima, s< Jue ao en? s de nome do atri%uto temos o nome do m todo se!uido dos parHnteses Jue podem #onter =ero ou mais ar!umentos" Wo+te ao primeiro pro!rama 87ello8nternet; e ?eri(iJue a de#+arao do m todo mainE onde #.amamos o m todo println"% para o o%7eto &=stem.out . I-/ri-i2d" 1ari!1eis d" ti/" float e i2teir" IintJ 2a te0a: &=stem.out.println">">Fumcirc.,F>E>Fumcirc.=F>E>Fumcirc.raioF>%>%* O ar!umento de println Jue #on.e#emos uma >ni#a ?ari6?e+ do tipo &trin!, no entanto o #<di!o a#ima mistura nos ar!umentos desse m todo os se!uintes e+ementos& &trin!s: I"I, operadores & F, e ?ari6?eis float& umcirc.=" -i#a muito (6#i+ de ?o#H entender porJue isto (un#iona se pensar Jue S tam% m operador de #on#atenao de &trin!s e Jue os ar!umentos int ou float e de outros tipos %6si#os desse m todo so #on?ertidos para &trin!s. I-/"rta2te a"s E5e 28" /r"gra-a- e- C "5 C..+ "s "/erad"res & e &&: Em Java, C, e CSS o operador a 8i!ua+; tem a (uno de atri%uio e o operador GG 8i!ua+ i!ua+; tem a (uno de #omparao entre ?a+ores, retornando o ?a+or %oo+eano ?erdadeiro se estes ?a+ores (orem idHnti#os" A+!uns podem no a#.ar esta es#o+.a de operadores sensata, prin#ipa+mente os matem6ti#os, mas #om um pou#o de uso da +in!ua!em e+a se tornar6 autom6ti#a" C$RIOSI%A%E IsF /ara /r"gra-ad"res C e C..J+ e0i-i2a78" d" /r"30e-a E5e "c"rre e- C e C. . c"- "s "/erad"res K e KK : Em C, CSS e tam% m em Java permitido es#re?er& int iEjEK* iG1* jGKGiF3* //finalE j vale 3E K vale 3 e i continua valendo 1 Essas atri%uiIes em #adeia permitem es#re?er #<di!o mais #ompa#to, e+as (a=em sentido porJue atri%uiIes nessas +in!ua!ens possuem ?a+ores, assim KGiF3[ no (ina+ tem o ?a+or de K Jue i!ua+ a iF3" O ?a+or de jG... "no nosso e5emp+o des#artado, i!norado pois no .6 nada a esJuerda desta atri%uio"

Em C e CSS e5iste um pro%+ema !ra?e Jue (reJuentemente uma #i+ada para os pro!ramadores 'as#a+ e outros" O pro%+ema Jue nessas duas +in!ua!ens 8C e CSS; no e5iste o tipo %oo+ean, no +u!ar deste tipo usado o tipo int 8inteiro;, onde 0 si!ni(i#a ?erdadeiro e O (a+so" Assim em C e CSS 8mas no em Java; aGGa tem ?a+or + #om o si!ni(i#ado dad" /e0" /r"gra-ad"r de true ou ?erdadeiro, mas aG+F1* tam% m tem #omo resu+tado o ?a+or +E mas a!ora #om o si!ni(i#ado inteiro, num ri#o" O #ompi+ador no sa%e distin!uir entre os si!ni(i#ados num ri#o e %oo+eano" Essa am%i!uidade (a= #om Jue pro!ramadores 8C ou CSS; no a#ostumados #om esta #on?eno de operadores G e GGE in#orram no erro de es#re?er jG+ Juando na ?erdade Jueriam di=er jGG+, mas para o #ompi+ador am%as as e5pressIes tem ?a+or inteiro de modo Jue se esse en!ano o#orrer num teste de parada de um +oop, pode o#orrer Jue e+e nun#a pare, pois 0 tem o mesmo ?a+or de true" Java e+imina este tipo de erro introdu=indo o tipo boolean #om os ?a+ores true e false, Jue no tem nen.uma re+ao #om o tipo int e Jua+Juer outros tipos" TIPOS B*SICOS E CONSTANTES O$ &A'ORES 'ITERAIS
8para nossa sorte os tipos %6si#os so os mesmos para Jua+Juer am%iente de pro!ramao Ja?a, porJue a +in!ua!em port6?e+;&

char

Cara#tere 4NICO)E 023%it

O tipo char 8#ara#tere 4NICO)E; representado #om 023%its sem sina+, o Jue permite enderear de O a L5535" O o%7eti?o desta opo permitir interna#iona+i=ao da +in!ua!em, %em #omo a padroni=ao" Constantes do tipo #ara#tere apare#em entre ap<stro(es& ca:, c0:, cd:" Ta3e0a de caracteres es/eciais:
8ao #ontr6rio de CECSS, no e5iste um #ara#tere espe#ia+ para o som de %eep ou %e++ ;

Representao ?isua+& Mn Mr Mb Mt Mf MN MJ MM Mu553d M!fa Mfff boolean

-uno, si!ni(i#ado& 'u+a +in.a, +ine(eed Retorno de #arro Ba#Bspa#e Ta%u+ao -orm(eed Ap<stro(e Aspas Barra in?ersa Cara#tere uni#ode O#ta+ @e5ade#ima+

Wa+or true ou false, di(erente representao de CSS, sem #on?erso em outros tipos"

O tipo boolean no tem re+ao nen.uma #om outros tipos 8#oero;" E+iminando pro%+emas Jue sur!iram por e5emp+o em CSS Jue usa inteiros para representar ?a+ores %oo+eanos" Os poss*?eis ?a+ores so true e false Jue so os resu+tado dos testes +<!i#os" boolean pertenceAo#onjunto* //declara variavel pertenceAo#onjuntoGtrue* //e,emplo

/O

b=te short int lon!

Inteiro V3%it , #omp+emento de /, (ai5a&30/V at 0/] Inteiro 023%it, #omp+emento de /, (ai5a&3T/]2V at T/]2] Inteiro T/3%it, #omp+emento de /, (ai5a&3/0F]FVT2FV at /0F]FVT2F] Inteiro 2F3%it, #omp+" de /, (ai5a&31//TT]/OT2VUF]]UVOV at 1//TT]/OT2VUF]]UVO]

No e5istem espe#i(i#adores de tipos #omo unsi!ned, todos os tipos AinteirosC tem sina+" &a0"res 0iterais& O Jue ?o#H ?H nem sempre o Jue ?o#H tem : 4m ?a+or #omo 5 7 5052 #onsiderado int #omo padro, se ?o#H Juer atri%uir esta #onstante a um lon!, (aa o Atype #astC e5p+i#itamente& lon! a* aG"lon!%5 7 5052* //a recebe '8 Ou ento use uma terminao em 3 para indi#ar Jue o n>mero de?e ser representado #omo lon!& lon! aG5 7 50523* //ou 3 minusculo 'ara indi#ar ?a+ores o#tais ante#eda3os #om um =ero& 1000 , 76 para ?a+ores .e5ade#imais ante#eda3os #om 1O ou 1,, e5emp+o& 1,D#.0 float double 'onto (+utuante T/3%it IEEE]UF 'onto (+utuante 2F3%it IEEE]UF

4m ?a+or #omo 3.+0+5 5L5 #onsiderado double #omo padro, se ?o#H Juer atri%uir esta #onstante a um float, (aa o type #ast e5p+i#itamente& float a* aG"float%3.+0+5 5L5* //a recebe '8 Ou ento usar uma terminao em ( para indi#ar Jue o n>mero de?e ser representado #omo float& float aG3.+0+5 5L5f //ou P maiusculo E5poentes podem ser es#ritos usando o #ara#ter e ou E& LE15-53 ou +.321L52eQ53 . Onde eQ+, si!ni(i#a mu+tip+i#ado por de= e+e?ado a menos 0 ou @1.+" O separador de #asas de#imais o ponto" Apesar de todas estas re!ras para uso de ?a+ores +iterais, Juando dois n>meros de tipo di(erentes #omo double e int so usados em um #a+#u+o do +ado direito de uma atri%uio, ?o#H no pre#isa (a=er o type #ast desses ?a+ores" O #ompi+ador promo?e o n>mero do tipo mais (ra#o para o tipo mais (orte antes de (a=er o #a+#u+o" Wo#H pode dese7ar (a=er o type #ast do resu+tado, para atri%uir a uma ?ari6?e+ lon! por e5emp+o" E<erc9ci"s: => Repita o mesmo e5emp+o s< Jue a!ora mo?a o #*r#u+o a+terando as #omponentes 5 e y" Co+oJue o #*r#u+o na posio 80"O,0"O;, atra? s de atri%uiIes do tipo acirc.,G+.1* " A#ompan.e todas as modi(i#aIes do o%7eto imprimindo seus atri%utos na te+a" @> Simp+i(iJue o pro!rama anterior retirando o atri%uto raio" Wo#H pode dar o nome de 'onto ou 'onto)!eometrico para esta #+asse" No se esJuea de #ompi+ar, use o #ompi+ador #omo (erramenta para ?eri(i#ar se ?o#H aprendeu #orretamente a sinta5e da +in!ua!em" Rees#re?a a #+asse #irculo para tra%a+.ar #om atri%utos do tipo int"

A3

5+

ATRIB$TOS E MLTO%OS Os m todos determinam o #omportamento dos o%7etos de um #+asse" Kuando um m todo in?o#ado, se di= Jue o o%7eto est6 re#e%endo uma mensa!em 8para e5e#utar uma ao;" 'ro!ramas #omp+e5os (ormam #on7untos de o%7etos Jue tro#am mensa!ens entre si !eren#iando in#+usi?e os re#ursos do sistema" O pro!rama a se!uir e5emp+i(i#a #.amadas de m todos, para ta+ de(ine um o%7eto Jue ser?e #omo #ontador, a imp+ementao representa a #onta!em no atri%uto num Jue um n>mero inteiro" Os m todos so simp+es& incrementa adi#iona um ao #ontador em Jua+Juer estado e comeca ini#ia+i=a a #onta!em em =ero" .ecrementa (a= o oposto de incrementa"

//#lasse #ontadorE ar$uivo #ontador.Java public class #ontador : public int num* //este R o atributo //numero do contador public +oi" incre%enta() !!incre%enta conta"or 0 nu%&nu%-. !!ace**o ao atributo 1 public +oi" "ecre%enta() !!"ecre%enta conta"or 0 nu%&nu%2. 1 public +oi" co%eca(int n) !!co%eca a contar 0 nu%&n 1 ? //#lasse principalE Ar$uivo 'rinc.Java public class 'rincipal : public static void main"&trin! ar!s;<% :
//

#ontador umcont* //declaracao de atributo contador umcontGnew #ontador"%* //alocacao u%cont,co%eca(3) &=stem.out.println"umcont.num%* u%cont,incre%enta() &=stem.out.println"umcont.num%* ? ? 1 +

E<erc9ci"s: => )e(ina um m todo #.amado mostra para a #+asse #ontador" Este m todo de?e imprimir o estado do #ontador na te+a" A imp+ementao deste m todo depende de onde ?o#H est6 imprimindo o estado do #ontadorX 'ense em pro!ramas de inter(a#es !r6(i#as e de +in.a de #omando" @> Crie uma #+asse #ontador #*#+i#o, e5emp+o o #ontador de minutos de re+<!ios di!itais& O,0,/,""",U],UV,U1,O,0,/,""" " A operao modu+o ou resto da di?iso inteira, tem sinta5e seme+.ante a de CSS& a S bGGaQ""int%a/b%@b. No tente usar a estrutura de de#iso if ainda" M!E5i2as de estad"s: O+.ando para o desen.o #ontido no #anto direito superior do arJui?o da C+asse #ontador, ?o#H #onse!ue ima!inar este #ontador #omo uma m6Juina de estadoX O uso de o%7etos #omo m6Juinas de estados um dos #on#eitos Jue e5emp+i(i#aremos deste te5to" Si2ta<e de dec0ara78" de -;t"d"s: A sinta5e simp+i(i#ada para a de#+arao de m todos de uma #+asse & especificadordeacesso tipoderetorno nomedometodo"lista)de)ar!umentos% : /@codi!o @/ ?. 4ma di(erena do uso de (unIes #omuns em +in!ua!ens no orientadas a o%7etos e do uso de m todos Jue #omo o m todo est6 de(inido na #+asse, e+e !an.a a#esso direto aos atri%utos, sem pre#isar usar o ApontoC, e5emp+o um)objeto.atributo*. 9em%re3se Jue as #.amadas de m todos em

53

um pro!rama 76 se re(erem a um o%7eto espe#*(i#o, em%ora os m todos se7am de(inidos de uma (orma !era+ e parametri=ada para toda a #+asse" Wo+te a!ora ao m todo main e ?eri(iJue sua sinta5e" t4i*5 this uma pa+a?ra #.a?e usada num m todo #omo re(erHn#ia para o o%7eto #orrente, e+a tem o si!ni(i#ado de& Ao o%7eto para o Jua+ este tre#.o de #<di!o est6 sendo e5e#utadoC" Supon.a uma #+asse Jue possui a se!uinte de#+arao de atri%uto& public int $ual$uer* " Se Juisermos em um m todo desta #+asse a+terar o atri%uto $ual$uer para o ?a+or 3, %asta es#re?er $ual$uerG3* , mas este #<di!o es#rito dentro de um m todo da #+asse Jue de#+ara $ual$uer, tota+mente eJui?a+ente a this.$ual$uerG3* , sendo o >+timo uma opo mais #+ara e #apa= de e+iminar am%i!uidades entre os nomes dos atri%utos de uma #+asse e os nomes dos ar!umentos de um dos m todos desta 8Juando estes nomes (orem i!uais;" O uso de this tam% m ?6+ido (a=er para #.amadas de m todos para o o%7eto #orrente" Si2ta<e de cMa-ada "5 acess" a -;t"d"s: A sinta5e de #.amada ou a#esso e m todos seme+.ante a sinta5e de a#esso aos atri%utos, #om e5#eo dos parHnteses Jue #ont m a +ista de ar!umentos da (uno Jue imp+ementa o m todo, mesmo Jue a +ista se7a ?a=ia e+es de?em estar presentes& umcontador.incrementa"%*. 'rimeiro insere3se o nome do o%7eto e depois a #.amada da (uno, estes so separados por um ponto" Cuidado para no esJue#er os parHnteses em pro!ramas (uturos, este um erro %astante #omum"

N"1a 1ers8" d" /r"gra-a Circulo:


A!ora reapresentaremos o pro!rama #irculo %aseado no e5emp+o , por m um pou#o mais #omp+i#ado& M;t"d" %o+e: O m todo move a+tera as #oordenadas do o%7eto" O o%7eto tem suas #oordenadas , e = somadas #om os ar!umentos dessa (uno" Note Jue este m todo representa uma maneira mais se!ura, #+ara, e+e!ante de a+terar as #oordenadas do o%7eto do Jue a#ess63+as diretamente da se!uinte (orma& ac.,FGd,*. ac.=FGd=*. 9em%re3se Jue ac.,FGd, uma a%re?iao para ac.,Gac.,Fd,*. M;t"d" %o*tra: O m todo mostra imprime na te+a, de (orma #ompa#ta, os atri%utos do o%7eto"

//#lasse circulo public class #irculo : public float raio*

/F

public float ,* //posicoes em coordenadas cartesianas public float =* public +oi" %o+e(float "#6float "$) !!%o+e o circulo "e lu7ar 0 t4i*,#-&"# $-&"$ 1 public +oi" %o*tra() !!i%pri%e na tela e*ta"o "o ob8eto 0 9$*te%,out,println(:(:-#-:6:-$-:6:-raio-:):) 1 ? //fim da declaracao da classe //#lasse principalE Ar$uivo 'rincipal.Java class 'rincipal : public static void main"&trin! ar!s;<% : #irculo umcirc* //declaracao de atributo circulo umcircGnew #irculo"%* umcirc.,G1* umcirc.=G1* umcirc.raioG+5* u%circ,%o*tra() u%circ,%o+e(.36.3) u%circ,%o*tra() umcirc.,G+11* u%circ,%o*tra() ? ? "1E1E+5% "+1E+1E+5% "+11E+1E+5%

C"-" 52ci"2a- 2" c"-/i0ad"r as cMa-adas de -;t"d"s:

55

M poss*?e+ ima!inar Jue as de(iniIes de m todos o#upam um !rande espao na representao interna dos o%7etos, mas +em%re3se Jue e+as so todas i!uais para uma #+asse ento %asta manter para #ada #+asse uma ta%e+a de m todos Jue #onsu+tada no momento da #.amada " Os o%7etos s< pre#isam ter uma re(erHn#ia para esta ta%e+a" E<erc9ci"s: => -aa as se!uintes modi(i#aIes no pro!rama 7ello8nternet& Adi#ione a de#+arao e ini#ia+i=ao de ?ari6?e+ &trin! +o!o ap<s o a%re #.a?es do m todo main& &trin! nome$ual$uer* nome$ual$uerGnew &trin!"ITma constante do tipo strin!J%* ,odi(iJue o ar!umento de println para nome$ual$uer" No use aspas em nome$ual$uer, temos uma ?ari6?e+ a!ora" E5e#ute o pro!rama, Jua+ o resu+tadoX No pro!rama deste e5emp+o, #rie um m todo #.amado iniciali4a para a #+asse #irculo" Este m todo de?e ter #omo ar!umentos um ?a+or para ,, um para = e outro para o raio, e de?e a+terar os atri%utos ini#ia+i=ando3os #om os ?a+ores passados" Wo#H pode a%strair o uso desse m todo #omo uma maneira de ini#ia+i=ar o o%7eto de uma s< ?e= em%ora isto se7a (eito seJfen#ia+mente" Comente as ?anta!ens desta a%orda!em, #omparando #om as outras opIes, ten.a sempre em mente a Juesto de se!urana Juando a?a+iar t #ni#as di(erentes de pro!ramao" No pro!rama anterior, ?eri(iJue Jue nada impede Jue ?o#H a#esse diretamente os ?a+ores de , , = e raio e os modi(iJue, #omo a+ias (oi (eito nos e5emp+os anteriores" Como se pode #riar um n>mero enorme de m todos & altera),"float a%* move)raio"float dr%* seria dese76?e+ Jue somente essas (unIes pudessem modi(i#ar ,, = e raio" Wo#H ?er6 Jue isso poss*?e+ em en#apsu+amento " 'or .ora, #rie esses m todos se preo#upando em permitir atra? s #.amadas a e+es tudo o Jue (or poss*?e+ (a=er #om a#esso direto aos atri%utos" Comente tam% m as duas opIes eJui?a+entes de imp+ementao a%ai5o 8os nomes so auto e5p+i#ati?os;, ten.a em mente o n>mero de m todos a serem #riados para !arantir (+e5i%i+idade a #+asse& umcirculo.multiplica)atributo),"+1%* ou umcirculo.altera)atributo),"umcirculo.retorna)atributo),"%@+1%* //chamadas aninhadas de metodos //o resultado de uma chamada compoe o ar!umento da outra Teste o m todo move #om ar!umentos ne!ati?os, e5emp+o ac.move"Q+.1EQ+.5%*. O resu+tado #oerenteX C> C@6 uma tendHn#ia em de(inir o maior n>mero de m todos em uma #+asse, porJue nun#a se pode pre?er e5atamente o seu uso em pro!ramas (uturosC" Comente esta (rase, tendo em ?ista o #on#eito de porta%i+idade" Wo#H 76 #apa= de #itar outras medidas Jue tornem suas #+asses mais port6?eis, (+e5*?eis e !en ri#asX 9eia o e5er#*#io anterior e o e5er#*#io T"
/2

@>

A>

B2

MLTO%OS #$E RETORNAM &A'ORESN At a!ora s< .a?*amos ?isto m todos #om ?a+or de retorno i!ua+ a void" 4m m todo, assim #omo uma (uno #omum, pode retornar um >ni#o e+emento de Jua+Juer tipo, in#+usi?e os de(inidos pe+o usu6rio ou se7a& o%7etos" Sendo assim, sua #.amada no pro!rama se ap+i#a a Jua+Juer +u!ar onde se espera um tipo i!ua+ ou eJui?a+ente ao tipo do seu ?a+or de retorno, se7a numa +ista de ar!umentos de outro m todo , numa atri%uio ou num operadorS em &=stem.out.println" variavel -chamada)de)metodo)$ue)retorna)valor%* C0asse tra1a: O estado da tra?a representado no atri%uto public boolean travado* e pode ser o%tido atra? s de uma #.amada ao m todo estado"%" Este e5emp+o %astante simp+es e no tem a pretenso de ser uma imp+ementao #omp+eta de uma #+asse Jue mode+e uma tra?a Jue possa ser usada para e?itar o a#esso a um arJui?o, por e5emp+o"

public class Hrava : public &trin! $uem* public boolean travado* public void atrave"&trin! $% //move o circulo de lu!ar : this.travadoGtrue* this.$uemG$* ? public void adestrave"&trin! $% : this.travadoGfalse* this.$uemG$* ? public boolean estado"% //estado"true/false% do objeto : return travado* ? ?

57

//#lasse principalE Ar$uivo 'rincipal.Java public class 'rincipal : public static void main"&trin! ar!s;<% : Hrava umatrava* umatravaGnew Hrava"%* umatrava.atrave">'ro!rama'rincipal>%* &=stem.out.println"umatrava.estado"%%* umatrava.adestrave">'ro!rama'rincipal>%* &=stem.out.println"umatrava.estado"%%* ? ? true false

//COMEN;ARIO9 A #+asse tra?a demasiadamente simp+es, mas se no o (osse no estaria na parte introdut<ria deste tutoria+" Esta #+asse a#a%a tendo a (un#iona+idade de uma ?ari6?e+ %oo+eana e o #usto de um o%7eto, mas neste ponto #a%e a ?o#H estender este mode+o para representar uma tra?a de arJui?o 8arma=ena o nome e Apat.C deste; ou uma tra?a de um o%7eto, e?itando Jue este se7a a+terado" E<erc9ci"s: => ,e+.ore a #+asse #ontador de ATRIB4TOS E ,MTO)OS, de(ina um m todo Jue imprime o #ontador na te+a" Se ?o#H esti?esse (a=endo um pro!rama para (un#ionar em uma inter(a#e !r6(i#a #om o usu6rio este m todo para imprimir na te+a seria o mesmoX )e(inir um m todo Jue retorna uma #<pia do ?a+or atua+ do #ontador !arante maior porta%i+idadeX 'or JuHX 'ara aprender a retornar ?a+ores #onsu+te este t<pi#o" @> Insira um no?o m todo na #+asse Hrava Jue ten.a a (uno de a+ternar entre os estados do o%7eto, independente do estado atua+ 8tra?ado ou destra?ado;" No use a estrutura de#iso if ainda, use o operador not Jue ser?e para ne!ar um ?a+or %oo+eano& aG9valorbooleano* // 9trueGGfalse ou trueGG9false. Imp+emente a #.e#a!em do estado de o?er(+oN no e5emp+o do #ontador, #onsidere o uso de um m todo retornando um ?a+or do tipo boolean. Considere a adio de um atri%uto"
/V

A2

COMPARAO COM $M PROGRAMA EM PASCA' Este e5emp+o de pro!rama em Java seme+.ante ao e5emp+o da #+asse #irculo de ATRIB4TOS, e+e ser6 #omparado #om um pro!rama es#rito em 'as#a+, a+ m disso introdu=imos um no?o m todo #.amado iniciali4a e m todos public float retorna)raio"void%* e void altera)raio"float a%. iniciali4a #o+o#a o ponto nas #oordenadas passadas #omo seus ar!umentos" A introduo deste m todo prepara a e5p+i#ao so%re #onstrutores dada no pr<5imo t<pi#o& " 'ara me+.or entendimento +eia os e5emp+os anteriores #om a #+asse #irculo"

Ja+a: 'ro!rama e5emp+o #*r#u+o, %aseado no e5emp+o de ATRIB4TOS:


//#lasse circulo public class #irculo : public float raioE,E=* public +oi" iniciali<a(float a#6float a$6float ar) !!7arante o e*ta"o "o ob8eto 0 t4i*,#&a# t4i*,$&a$ t4i*,raio&ar 1 public +oi" altera=raio(float a) 0 t4i*,raio&a 1 public float retorna=raio() 0 return t4i*,raio 1 public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>E>Fthis.retorna)raio"%F>%>%* ? ?

//#lasse principalE Ar$uivo 'rincipal.Java public class 'rincipal : public static void main"&trin! ar!s;<% : #irculo ac* acGnew #irculo"%* ac.iniciali4a"1E1E+1%* ac.mostra"%* ac.move"+E+%* ac.mostra"%* ac.,G+11* ac.altera)raio"+5%* ac.mostra"%* ? ? %is/"si78" d"s -;t"d"s e atri35t"s 2a dec0ara78" de 5-a c0asse: Em uma de#+arao de uma #+asse norma+mente se #o+o#a a de#+arao de m todos depois da de#+arao dos atri%utos, por m podemos (a=er inter#a+aIes ou adotar Jua+Juer ordem Jue nos #on?en.a" 4ma %oa t #ni#a de pro!ramao, Jue a#onse+.amos ?o#H adotar em seus pro!ramas usar +in.as de #oment6rios para de+imitar uma 6rea do #<di!o de suas #+asses Jue en!+o%e tudo o Jue interessa a um usu6rio desta" Nestes pro!ramas e5emp+os prati#amente tudo de interesse de um usu6rio 8#+iente; de sua #+asse, mas nos e5emp+os mais a?anados isto no ser6 ?erdade" C"-e2t!ri"s: O%ser?e Jue o m todo mostra #.ama o m todo public float retorna)raio"void% Jue da mesma #+asse" -i#a #+aro da de(inio de mostra Jue this.retorna)raio"% se ap+i#a ao mesmo o%7eto instan#iado Jue re#e%eu a #.amada de mostra. Isto (oi (eito somente para re?e+ar Jue #.amadas anin.adas de m todos tam% m so permitidas, pois nesse #aso esta #.amada de m todo poderia ser su%stitu*da pe+o pr<prio atri%uto raio, o Jue seria mais e(i#iente" Pr"gra-a78" "rie2tada a "34et"s e i2ter aces gr! icas c"- " 5s5!ri": E5istem A+i%rariesC de #+asses Jue permitem o pro!ramador CSS desen?o+?er ap+i#aIes para am%ientes #omo o ,i#roso(t GindoNsg de uma maneira %astante a%strata, este um e5emp+o #+aro de reuso de #<di!o, a(ina+ no pre#iso sa%er de deta+.es da inter(a#e para pro!ramar ne+a" Na se!unda parte (a+aremos so%re a AJava Ap+i#ation 'ro!rammin! Inter(a#eC Jue permite pro!ramar de maneira %astante a%strata sistemas de inter(a#es !r6(i#as #om o usu6rio se7a para

TO

ap+i#aIes para a internet 8rodando em %roNsers; ou para sistemas #omo o GindoNs ou ,a#EOs e D3GindoNs " "1E1E+1% "+E+E+1% "+11E+E+5%

Pascal:

4m pro!rama pare#ido s< Jue em Pascal:

'UV/UA6 #omparacao* :#V6'AUA#AV #V6 T6 'UV/UA6A Java? HW'- #irculoGU-#VU. ,:real* :#VVU.-BA.A& O - W? =:real* r:real* :somente dados? -B.* var ac:circulo* leitura:inte!er* 'UV#-.TU- 8niciali4a"var altereme:#irculo*a,Eb=Ecr:real%* :#V3V#A V #8U#T3V -6 .-H-U68BA.A 'V&8#AV? D-/8B altereme.,:Ga,* altereme.=:Gb=* altereme.r:Gcr* -B.* 'UV#-.TU- Altera)Uaio"var altereme:#irculo*ar:real%* :A3H-UA V UA8V .V #8U#T3V? D-/8B altereme.r:Gar* -B.* PTB#H8VB Uetorna)Uaio"copieme:#irculo%:real* D-/8B Uetorna)Uaio:Gcopieme.r* -B.* 'UV#-.TU- 6ove"var altereme:#irculo*d,Ed=:real%*

3+

:6V.- A& #VVU.-BA.A& O - W A#U-&#-BHAB.V .O - .W? D-/8B altereme.,:Galtereme.,Fd,* altereme.=:Galtereme.=Fd=* -B.* 'UV#-.TU- 6ostra"copieme:#irculo%* :6V&HUA V #8U#T3V BA H-3A? D-/8B writeln"XO:XEcopieme.,EX W:XEcopieme.=EX U:XEcopieme.r%* -B.* D-/8B :H-&H-&? 8niciali4a"acE1.1E1.1E+1.1%* 6ostra"ac%* 6ove"acE+.1E+.1%* 6ostra"ac%* ac.,:G+11.1* Altera)Uaio"acE+5.1%* 6ostra"ac%* read"leitura%* -B.. O: 1.1111111111-F11 W: 1.1111111111-F11 U: +.1111111111-F1+ O: +.1111111111-F11 W: +.1111111111-F11 U: +.1111111111-F1+ O: +.1111111111-F15 W: +.1111111111-F11 U: +.5111111111-F1+ !!COMEN;ARIO9 JAVA5 As #+asses em Java so #ompostas de atri%utos e m todos" 'ara e5e#utar uma ao so%re o o%7eto ou re+ati?a a este %asta #.amar um m todo & ac.mostra"%* O m todo no pre#isa de muitos ar!umentos, porJue pr<prio da #+asse e portanto !an.a a#esso aos atri%utos do o%7eto para ao Jua+ e+a (oi asso#iado& public float retorna)raio"void% : return raio* //tenho acesso direto a raio. ? { cOMEntariOs Pascal: } Em 'as#a+ os pro#edimentos e os dados so #riados de (orma separada, mesmo Jue s< ten.am sentido 7untos" A 7uno entre os dados e pro#edimentos se d6 atra? s de passa!em de parLmetros" No #aso de uma +in!ua!em pro#edura+, o Jue norma+mente (eito se asseme+.a ao #<di!o se!uinte& 6ove"acE+.1E+.1%*. Nesse #aso A# um Are#ordC, a+!o seme+.ante ao stru#t de C 8no CSS;" 6ove,
T/

a#essa os dados do Are#ordC a+terando os #ampos" O parLmetro passado por re(erHn#ia e o pro#edimento de(inido a parte do re!istro, em%ora s< sir?a para a#eitar ar!umentos do tipo #irculo e mo?er suas #oordenadas" Seg5ra27a: Em am%os pro!ramas 8'as#a+, Java; o pro!ramador pode o%ter a#esso direto aos dados do tipo de(inido pe+o usu6rio& ac.,5G+11.1* 8'as#a+; ou ac.,G+11.1* 8Java;" Weremos em ENCA'S49A,ENTO maneiras de proi%ir este tipo de a#esso direto ao atri%uto, dei5ando este ser modi(i#ado somente pe+os m todos" Isto nos !arante maior se!urana e +i%erdade pois podemos permitir ou no o a#esso para #ada atri%uto de a#ordo #om nossa ?ontade" E ici62cia: A+!u m pode ar!umentar Jue pro!ramas Jue usam %astante #.amadas de m todos podem se tornar pou#o e(i#ientes e Jue poderia ser me+.or o%ter a#esso direto aos dados de um tipo de(inido pe+o usu6rio ao en? s de passar por todo o tra%a+.o de #<pia de ar!umentos, insero de (uno na pi+.a, et#" Em ?erdade no se perde muito em e(i#iHn#ia, por Jue ta+ metodo+o!ia de pro!ramao nos +e?a a or!ani=ar o #<di!o de maneira mais #ompa#ta" E a+ m disso muitas ?e=es no se dese7a permitir sempre o a#esso direto aos dados de um tipo de(inido pe+o usu6rio por ra=Ies de se!urana" E<erc9ci"s: => Imp+emente outros m todos do esti+o retorna)raio"void; para os atri%utos O e W" @> -aa um pro!rama simp+es para testar uma #+asse Jue representa um mouse e Jue (orne#e a posio na te+a, os indi#adores de estado dos %otIes e os m todos& clica)botao" %* move"float d,E float d=%*. No pre#iso (a=er a +i!ao do o%7eto #om o mouse rea+, em%ora o +eitor interessado possa en#ontrar na se!unda parte su%s*dios para esta tare(a" Seu mouse de?e ser #apa= de #amin.ar para Jua+Juer +u!ar da te+a atra? s de #.amadas de m todos, no de?e u+trapassar os +imites esta%e+e#idos, de?e indi#ar o %oto est6 pressionado ou no atra? s de um m todo seme+.ante ao mostra" % deste e5emp+o" O mouse "e+e ter de 0 %oto" Wo#H pode su%stituir m todo move"float d,Efloat d=% por #om%inaIes de move),"float d,%* e move)="float d=%* Wo#H pode a#.ar o (ato de o mouse ser o%ri!ado a ter um %oto um tanto estran.o, mas no " Os mouses dos ma#.intos.es tHm um %oto, a+!uns mouses de p#:s tHm dois %otIes e mouses de NorBstations tHm trHs %otIes" 'ara seu pro!rama ser port6?e+ e+e de?e #ontar apenas #om a e5istHn#ia de um %oto e isso ?a+e a pena Juando se (a+a em porta%i+idade" O Jue tem sido usado em #asos e5tremos a #om%inao de pressionamento dos %otIes e pressionamento de te#+as para di(eren#iar #ertas aIes" A> public void altera)raio"float a% e float

33

Weri(iJue Jue em main"% ?o#H pode modi(i#ar o atri%uto , do o%7eto da #+asse #irculo da se!uinte (orma& a.,G+5.5* " Isto pode no ser muito >ti+, ima!ine3se #riando uma +i%rary 8em Java pa#Ba!e; Jue imp+ementa a #+asse #irculo e uma s rie de m todos re+a#ionados, por #ertas ra=Ies ?o#H !ostaria Jue o usu6rio se +imitasse ao uso da inter(a#e do o%7eto, #omo (a=H3+o ser6 e5p+i#ado em en#apsu+amento" 'or .ora, apenas #rie m todos Jue sir?am #omo a+ternati?as a este tipo de a#esso direto" CONSTR$TORES Construtores so m todos espe#iais #.amados pe+o sistema no momento da #riao de um o%7eto" E+es no possuem ?a+or de retorno, porJue ?o#H no pode #.amar um #onstrutor para um o%7eto, ?o#H s< usa o #onstrutor no momento da ini#ia+i=ao do o%7eto" Construtores representam uma oportunidade de ini#ia+i=ar seus dados de (orma or!ani=ada, ima!ine se ?o#H esJue#e de ini#ia+i=ar #orretamente ou o (a= duas ?e=es, et#" 4m #onstrutor tem sempre o mesmo nome da #+asse a Jua+ perten#e" 'ara a #+asse &trin!E pr 3 de(inida na +in!ua!em o #onstrutor tem a (orma &trin!"I#onstante do tipo &trin!J%* #om o ar!umento entre aspas Jue espe#i(i#ado pe+o pro!ramador" E+e seria #.amado automati#amente no momento da #riao, de#+arao de uma &trin!E sem ne#essidade de uso do nome do #onstrutor #omo m todo, apenas dos ar!umentos& Strin! a* aGnew &trin!"IHe,toJ%* //alocacao e iniciali4acao atraves do construtor a.mostra"%* //mostra so pode ser chamada depois do construtor Nos e5emp+os anteriores tam% m us6?amos #onstrutores no momento de ini#ia+i=ar nossos o%7etos, s< Jue e+es no possu*am ar!umentos" E5istem ?ariaIes so%re o tema Jue ?eremos mais tarde& so%re#ar!a de #onstrutor, A#opy #onstru#torC, #onstrutor de #orpo ?a=io" O e5emp+o a se!uir simp+es, seme+.ante aos anteriores, preste ateno no m todo #om o mesmo nome Jue a #+asse, este o #onstrutor&

//#lasse ponto public class Ponto : public float ,E=* public Ponto"float a,Efloat a=% // sempre o%ita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=*
TF

? public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>%>%* ? ? //#lasse principalE Ar$uivo 'rincipal.java public class 'rincipal : public static void main"&trin! ar!s;<% : 'onto ap* apGnew Ponto((float)3,36(float)3,3) ap.mostra"%* ap.move"+E+%* ap.mostra"%* ap.,G+11* ap.mostra"%* ? ? "1E1% "+E+% "+11E+% !!COMEN;ARIO95 Note Jue #om a de(inio do #onstrutor, ?o#H o%ri!ado a passar os ar!umentos deste no momento da a+o#ao do o%7eto" Se ?o#H pre#isa ter a opo de no passar esses ?a+ores ou passar outros, as poss*?eis so+uIes sero dadas em " "float%1.1 indi#a Jue para ser (eita a #on?erso de +.1 para ponto (+utuante" +.1 so=in.o #onsiderado double" "int%+.1 i!ua+ a +. "int% 5.3 i!ua+ a dois. Esta operao indi#ada por "nometipo%tipo)a)ser)convertido tam% m #.amada de Atype #astC" A o#orrHn#ia de rotinas de #riao de o%7etos em di?ersos +o#ais de um pro!rama muito #omum" O%7etos podem ser #riados dentro de estruturas #ondi#ionais, arma=enados em arJui?os, passados #omo parLmetros, inseridos em estruturas dinLmi#as dentro de outros o%7etos, et#" E<erc9ci"s:

35

=> 4m m todo pode #.amar outro m todo da mesma #+asse" 'arta do e5emp+o de e #rie um #onstrutor Jue #.ama o anti!o m todo iniciali4a"float aEfloat b% repassando os ar!umentos do #onstrutor& ponto"float aE float b% : iniciali4a"aEb%* ? Na #.amada de iniciali4a"% (i#a imp+*#ito Jue e+a se ap+i#a ao o%7eto #u7o #onstrutor (oi #.amado" Isto ?6+ido tam% m para outros m todos Jue #.amam m todos, ou se7a, no ne#ess6rio o operador identificador.iniciali4a"aEb%* , ?e7a uso de this" Este e5er#*#io >ti+ para mostrar outro re#urso de Java, o ponteiro this" this uma pa+a?ra reser?ada e dentro de Jua+Juer m todo this um AponteiroC para o o%7eto em Juesto, ento o #<di!o des#rito a#ima poderia tam% m assumir a se!uinte (orma eJui?a+ente& ponto"float aE float b% : this.iniciali4a"aEb%* ? //Verifi$ue9 M +<!i#o Jue neste e5emp+o this no tem muita uti+idade, mas e5istem #asos onde um o%7eto pre#isa passar seu AponteiroC para a+!uma (uno Jue o modi(i#a, ou (i#a possuindo uma re(erHn#ia para e+e, ento usa3se this" Weremos outras ap+i#aIes mais adiante" @> Introdu=a mensa!ens no #onstrutor tipo& &=stem.out.println"IVbjeto instanciadoJ%* introdu=a tre#.os pare#idos em outros pontos de seu pro!rama" O o%7eti?o a#ompan.ar ?isua+mente a seJfHn#ia de #riao e modi(i#ao dos o%7etos" A> Esta #+asse 'onto pode ser adaptada para (un#ionar #omo representao de ?etores em duas dimensIes, para ta+ (ornea outros m todos >teis& m todos para tornar o ?etor unit6rio, retornar o m<du+o do ?etor, a #omponente , e =" 'ara ta+ ?o#H ter6 Jue (a=er uso de 6ath.cos"double a%* 6ath.sin"double a%* e 6ath.s$rt"double a%* , respe#ti?amente o #osseno, o seno e a rai= Juadrada de um ponto (+utuante de dup+a pre#iso" No ne#ess6rio (a=er nada seme+.ante a um in#+ude de CSS para usar esses m todos, %asta adi#ion63+os ao seu #<di!o, outro m todo >ti+ 6ath.ma,"aEb%* Jue retorna o maior ?a+or entre a e b "floatE doubleE int. lon!E etc;" 4se Atype #astC e5p+i#ado nos #oment6rios deste e5emp+o" Crie uma #+asse reta Jue tem #omo atri%utos dois o%7etos da #+asse ponto" )i#a& N8" 5se c"2str5t"res, use (unIes do tipo iniciali4a"%E 76 apresentadas" Kuando seu pro!rama (i#ar pronto a#res#ente m todos para esta reta tais #omo in#+inao, #oe(i#iente +inear, et#" 'ara a#res#entar #onstrutores +eia N E5istem maneiras mais e(i#ientes e #ompa#tas de representar uma reta, por m (aa #omo (oi su!erido, neste #aso o o%7eti?o no e(i#iHn#ia" CONSTR$TORES E AGREGAO Este e5emp+o o resu+tado do e5er#*#io anterior 8e5er#*#io F t<pi#o CONSTR4TORES;, e+e #ria uma #+asse Ueta #om dois atri%utos da #+asse 'onto" Ou se7a ?o#H estar6 reuti+i=ando a #+asse 'onto na #+asse Jue representa uma Ueta, a (orma #omo essa reuti+i=ao de #<di!o o#orre #.amada de agrega78""
T2

B>

O nome reuti+i=ao de #<di!o %astante apropriado, pois a #+asse Ueta estar6 uti+i=ando todos os m todos es#ritos para a #+asse 'onto" Em #asos #omo este #omum di=er Jue a #+asse Ueta #+iente da #+asse 'onto em uma ana+o!ia #om as re+aIes #omer#iais" Este pro!rama %us#a #.amar sua ateno para o (ato de Jue o%7etos so a+o#ados dinami#amente e Jue #aso ?o#H se esJuea de a+o#63+os, e+es (i#am possuindo o ?a+or null" O%ter a#esso a uma ?ari6?e+ #om ?a+or null um erro Jue !era+mente ?eri(i#ado em tempo de e5e#uo" Nos pro!ramas anteriores a+o#ar os o%7etos era (6#i+, mas a!ora Jue temos o%7etos (un#ionando dentro de outros o%7etos .6 ne#essidade de adotar t #ni#as me+.ores" Weremos a se!uir duas a+ternati?as para a+o#ar os atri%utos 'onto presentes na #+asse Ueta& A0ter2ati1a =: 'rimeiro a+o#a3se o o%7eto da #+asse Ueta, depois #.ama3se para #ada atri%uto da #+asse 'onto a rotina de a+o#ao& Ueta r+* r+Gnew Ueta"%* r+.ponto+Gnew 'onto""float%+.1E"float%5.1%* r+.ponto5Gnew 'onto""float%3.1E"float%0.1%* Esta a+ternati?a em muitos #asos pior Jue a se!uinte" A0ter2ati1a @: 'assamos para o #onstrutor da #+asse Ueta a tare(a de a+o#ar e ini#ia+i=ar os atri%utos de (orma #oerente" Os ar!umentos do #onstrutor da #+asse Ueta passam a #onter ?a+ores >teis para a #.amada dos #onstrutores de seus atri%utos" Esta a+ternati?a e5e#utada pe+o pro!rama a se!uir&

//Ueutili4e o ar$uivo da classe 'onto definida anteriormente. //#lasse Ueta class Ueta : public Ponto aEb* public Ueta"float a,Efloat a=Efloat b,Efloat b=% : a&ne' Ponto(a#6a$) !!c4a%a"a* "o* contrutore* "a cla**e Ponto b&ne' Ponto(b#6b$) ? public void mostra"% : a.mostra"%* b.mostra"%* ? ?

37

//#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : Ueta ar* ar&ne' Reta((float)3,36(float)3,36(float).,36(float).,3) ar.mostra"%* ? ? A+!uns podem ar!umentar Jue esta maneira de representar uma reta no muito e(i#iente, mas no do es#opo deste te5to tratar de pro%+emas dessa nature=a, o Jue a+i6s #omp+i#aria muito o #<di!o , des?iando3nos do o%7eti?o prin#ipa+& simp+i#idade na apresentao de #on#eitos de orientao a o%7etos" O +eitor de?e amp+iar os mode+os aJui su!eridos em ap+i#aIes na sua 6rea de interesse" Como ainda (a+tam #on#eitos importantes para serem apresentados este tipo de ap+i#ao de?e ser (eita em para+e+o #om a +eitura" E<erc9ci"s: => Imp+emente um pro!rama Jue use a mesma +<!i#a do e5emp+o anterior para #riar uma #+asse #omposta de outras " Wo#H estar6 usando a!re!ao" 'or e5emp+o um triLn!u+o pre#isa de trHs pontos para ser de(inido" @> 4ma imp+ementao mais e(i#iente da #+asse Ueta seria (eita arma=enando apenas um #oe(i#iente an!u+ar e um +inear, mas esta reta de?eria pro?er tam% m um #onstrutor Jue a#eitasse dois pontos #omo ar!umentos" Como ?o#H no aprendeu so%re#ar!a de #onstrutores 8de(inir ?6rios #onstrutores;, use s< um #onstrutor Jue tem #oe(i#iente an!u+ar e +inear #omo ar!umentos e imp+emente esta no?a #+asse reta 8sem usar a!re!ao a!ora;" )e(ina um m todo para a #+asse Ueta Jue retorna o ponto de inter#esso #om outra reta& public 'onto intercessao"Ueta a%*. No se esJuea de tratar os #asos de!enerados, tais #omo retas para+e+as e #oin#identes, use por e5emp+o mensa!ens de erro ou ?a+or de retorno i!ua+ a null" Weri(iJue Jue um m todo de uma reta re#e%e outra reta 8mesmo tipo; #omo ar!umento" )entro do m todo os atri%utos do ar!umento a de?em ser a#essados do se!uinte modo& ap+.,* ,ais tarde, em tratamento de e5#eIes, ?eremos maneiras me+.ores de +idar #om esses #asos de!enerados" B> )e(ina um m todo #.amado move para a #+asse Ueta, +em%re3se de mo?er os dois pontos 7untos 8a in#+inao no de?e mudar;"
TV

A>

C>

)e(ina um m todo public void !ira"tipo, an!ulo%* para a #+asse Ueta" Este m todo re#e%e um Ln!u+o #omo ar!umento, ?o#H pode optar por representar o Ln!u+o em radianos 8 float; ou #riar a #+asse Ln!u+o 8!raus, minutos, se!undos;" Reso+?a tam% m o pro%+ema da es#o+.a do ponto em torno do Jua+ a reta de?e ser !irada 8?o#H pode usar mais de um ar!umento;" 4se (unIes matem6ti#as 8seno #osseno; e outras des#ritas no e5er#*#io T de %ESTR$TORES O$ finali<er*

A presena de #o+eta autom6ti#a de +i5o torna o #on#eito de destrutores um pou#o di(erente de seus eJui?a+entes em outras +in!ua!ens orientadas a o%7etos" Em Java destrutores so m todos #.amados pe+o sistema Juando a mem<ria de um o%7eto est6 para ser +i%erada pe+o #o+etor autom6ti#o de +i5o 8no Juando est6 para ser #o+etada;" A sinta5e dos destrutores a se!uinte& protected void finali4e"% : //codi!o para arrumar a casaE antes $ue o objeto seja apa!ado ? Note Jue o Jue #ara#teri=a o #onstrutor ter o mesmo nome da #+asse, 76 o destrutor #ara#teri=ado por possuir o nome finali4e. Wo#H pode #.amar o destrutor, mas isso no imp+i#a Jue o o%7eto ser6 de+etado" Ao #ontr6rio dos #onstrutores, os destrutores no tem ar!umentos, mas possuem ?a+or de retorno Jue i!ua+ a void" Os destrutores so muito >teis para A+impar a #asaC Juando um o%7eto dei5a de ser usado" 4m e5emp+o %astante #omum do uso de destrutores o de um o%7eto Jue +ida #om arJui?os Jue de?em ser (e#.ados Juando o o%7eto (or destru*do" E5istem outros #asos onde um o%7eto de?e #omuni#ar aos outros o%7etos Jue ser6 inuti+i=ado, destru*do, ou se7a & sair6 do pro!rama" Em Java, Jue possui #o+eta autom6ti#a de +i5o, um o%7eto passa a no e5istir mais no pro!rama Juando nen.uma ?ari6?e+ (a= re(erHn#ia a e+e" Nesse ponto, e+e arma=enado no #o+etor autom6ti#o de +i5o, onde re#e%er6 o tratamento adeJuado" 4m n< de uma +ista +i!ada pode ser apa!ado simp+esmente (a=endo o n< anterior apontar para o posterior a e+e" Os pro!ramadores no a#ostumados #om esse #on#eito pre#isam ou?ir a se!uinte (rase& AWo#H no o%ri!ado a +i%erar e5p+i#itamente a mem<ria de um o%7eto #omo (eito em CSS e outras +in!ua!ensC" Se esti? ssemos por e5emp+o em CSS, Jue no possui #o+eta autom6ti#a de +i5o, o destrutor seria #.amado sempre Jue a mem<ria de um o%7eto (osse desa+o#ada, o Jue (eito pe+o pro!ramador atra? s de uma #.amada a delete nomedoobjeto"%* . Em Java a +i%erao de mem<ria Jue (eita pe+o #o+etor autom6ti#o de +i5o Jue e5e#utado de modo ass*n#rono #om o restante do pro!rama, ou se7a ?o#H no pode #ontar #om o (ato de Jue o destrutor ser6 #.amado imediatamente ap<s o momento em Jue seu o%7eto sai de es#opo, a no ser Jue o pro!rama se7a e5e#utado #om o modo ass*n#rono do #o+etor autom6ti#o de +i5o des+i!ado 8java Qnoas=nc!c Bome'ro!rama;" Na ?erso %eta, ?o#H no pode nem mesmo #ontar #om a #.amada do destrutor pe+o !ar%a!e #o++e#tor, de modo Jue e+e de?e ser usado apenas para otimi=aIes do #<di!o"

PONTEIROS+ POINTERS+ REFERONCIAS E OB:ETOS A+!u m pode ter a#.ado estran.o Jue no (oram dis#utidos ponteiros em Java, o#orre Jue e+es no e5istem nessa +in!ua!em" E5istem estudos Jue a(irmam Jue erros #om ponteiros so um dos prin#ipais !eradores de A%u!sC em pro!ramas, a+ m disso #om todos os re#ursos Jue temos no pre#isaremos de+es" Os pro!ramadores a#ostumados ao uso de ponteiros 8e aos erros de#orrentes desse uso;, a#.aro muito natura+ e se!ura a transio para Java onde passaro a usar prin#ipa+mente ?etores e #+asses" A estruturao de seu #<di!o de?er6 a!ora ser (eita em um mode+o Jue se %aseia no uso de o%7etos 8?etores e &trin!s tam% m so o%7etos;" O%7etos superam a representati?idade o%tida #om re#ords, (unIes iso+adas e ponteiros" )e #erto modo ?o#H estar6 usando re(erHn#ias, mas de (orma imp+*#ita" 'or e5emp+o& o%7etos so a+o#ados dinami#amente #om new, e+es so re(erHn#ias ou ponteiros para posiIes na mem<ria, mas a +in!ua!em mas#ara este (ato por ra=Ies de se!urana" Como o%7etos so ponteiros 8s< Jue transparentes para ?o#H;, nos depararemos #om o pro%+ema de re(eren#e a+iasin! Juando dis#utirmos #<pia de o%7etos #om outros o%7etos #omo atri%utos" PASSAGEM POR REFERONCIA 9in!ua!ens #omo 'as#a+ ou C #riam meios de passar parLmetros por ?a+or ou por re(erHn#ia" Como Java no possui ponteiros, a passa!em por re(erHn#ia de?e ser (eita atra? s de o%7etos" Se o parLmetro 76 um o%7eto, ento a passa!em de+e o%ri!atoriamente por re(erHn#ia" No #aso de tipos simp+es, podemos pass63+os dentro de ?etores Jue so o%7etos, ou ento #riar #+asses para em%a+ar, empa#otar estes tipos" )ada a ne#essidade destas #+asses, e+as 76 (oram de(inidas na +in!ua!em" So #+asses de(inidas para #onter #ada tipo %6si#os e permitir #ertas #on?ersIes entre e+es, (a+aremos destas #+asses #on(orme ne#essitarmos de seu uso" As ?e=es estas #+asses so #.amadas de ANrappersC" E<erc9ci"s& => class O : public void troca"O valores% : int a* aGval* valGvalores.val* valores.valGa* ? //imprima os atributos de um objeto VDJ da classe O //chame o metodo troca de outro objetoE usando VDJ como ar!umeto //verifi$ue a alteracao nos atributos desse ar!umento O #<di!o a#ima mostra #omo de(inir um m todo Jue usa a e5istHn#ia imp+*#ita de ponteiros na +in!ua!em para #riar um m todo Jue tro#a os atri%utos de dois o%7etos da mesma #+asse" Imp+emente este m todo e (aa os testes su!eridos nos #oment6rios desse #<di!o"
FO

&ETORES E MATRIPES Wetores so o%7etos, e+es possuem pape+ importante no esti+o de pro!ramao desta +in!ua!em Jue e5#+ui ponteiros" 'or serem o%7etos, ?etores so o%ri!atoriamente a+o#ados de maneira dinLmi#a" O e5emp+o a se!uir a+o#a um ?etor de inteiros #om trHs posiIes, se!uindo uma sinta5e seme+.ante a de a+o#ao de o%7etos&

class VetorHest : public static void main "&trin! ar!s;<% : int +etor>?&ne' int>@? +etor>3?&3 //inde,acao semelhante a # E #FF +etor>.?&.3 +etor>A?&A3 9$*te%,out,println(+etor>3?-: :-+etor>.?-: :-+etor>A?-: :) ? ? O 0O /O

Res5-" da si2ta<e de 1et"res: int a;<* //declara vetor de inteiros a aGnew int;+1<* //aloca vetor a com de4 posicoes //as duas linhas anteriores podem ser abreviadas por: int a;<Gnew int;+1<* //alem disso se voce $uiser iniciali4ar o vetor aE jaN na declaracao: int a;3<G:1E+1E51?* O an6+o!o para matri=es & int a;<;<* //declara matri4 de inteiros a aGnew int;3<;3<* //aloca matri4 3,3E celulas //as duas linhas anteriores podem ser abreviadas por: int a;<Gnew int;3<;3<* //alem disso se voce $uiser iniciali4ar a matri4 a ja na declaracao: int a;3<;3<G::1E+1E51?E:31E01E51?E:L1E71E21??* Em m todos, ar!umentos e ?a+ores de retorno Jue so ?etores, so es#ritos da se!uinte (orma& intYZ , ou tipoYZ nomeda?aria?e+ EEno #aso de ar!umentos" )ia!rama do ?etor&

0+

'er#e%a Jue a (ai5a >ti+ do ?etor ?ai de O at 8n30; onde n o ?a+or dado #omo taman.o do ?etor no momento de sua #riao, no nosso #aso T" O mesmo o#orre #om matri=es" Esta #on?eno pode #on(undir pro!ramadores 'as#a+ onde a inde5ao ?ai de 0 at n" Java #.e#a se ?o#H usa #orretamente os *ndi#es do ?etor" Se o#orrer um a#esso ao vetor;i< onde i um *ndi#e in?6+ido 8(ora da (ai5a de ?a+ores permitidos;, ?o#H re#e%er6 uma mensa!em pare#ida #om& java"lan!"Arra=8nde,VutVfDounds-,ception& h" Retornaremos ao assunto desta mensa!em mais adiante, e+a uma e5#eo !erada pe+o #<di!o Jue a#ompan.a a +in!ua!em" E5iste um atri%uto muito >ti+ Juando se tra%a+.a em um ?etor de dados& a.len!th* //arma4ena o numero de elementos do vetor a )e#+arar um ?etor de o%7etos, por e5emp+o o%7etos da #+asse 'onto, no imp+i#a Jue os o%7etos de #ada posio do ?etor 76 estaro ini#ia+i=ados, para ini#ia+i=ar os e+ementos, si!a se!uinte sinta5e& 'onto a;<* //declaracaoE todas as posicoes com null a G new 'onto;3<* //alocacao for "int i G 1* i A a.len!th"%* iFF% : a;i< G new 'onto"1E1%* ? //iniciali4acao
8o #<di!o a#ima representa um dos usos de ?etores no +u!ar de ponteiros;

E<erc9ci"s: => Es#re?a um pro!rama simp+es Jue toma um ?etor de preos e um de des#ontos 8UOia"U;, e a+tera o ?etor de preos de modo Jue estes produtos 76 in#+uam os des#ontos no seu ?a+or de ?enda" E5emp+o& 'reos & FO,U TO,T 0/,2 0OO )es#ontos& "U "T "/ "U Wetor #a+#u+ado& /O"/U 1"O1 /"U/ UO A +in!ua!em Java ser6 muito usada no #om r#io da internet, ta%e+in.as assim, usadas para #6+#u+os de preos de produtos 76 esto se tornando #omuns" Os nomes Jue ?o#H pode dar as #+asses e m todos so& #lasse: Habela'recos Atributo: boolean #om.esconto* Atributo: double;< 'recos* 6Rtodo: void Aplica.escontos"int;< descontos%* COPIA + COMPARAO E %ETERMINAO %A C'ASSE EM OB:ETOS Este tF/ic" ai2da 28" est! c"-/0et"+ de1id" a i2de i2i7Hes s"3re " E5e estar! c"2tid" 2as /acQages e i2ter aces da :a1a APIN O%7etos so imp+i#itamente re(erHn#ias, portanto sua #<pia 8atra? s do operador a; est6 su7eita ao pro%+ema de Are(eren#e a+iasin!C e e(eitos #o+aterais" A #omparao de o%7etos atra? s do operador GG

F/

tem o si!ni(i#ado da #omparao de re(erHn#ias, ou se7a e+a ?eri(i#a se os o%7etos0 #omparti+.am o mesmo espao a+o#ado na mem<ria" O%ser?e Jue #om as operaIes #on.e#idas at a!ora, no #onse!uimos #omparar dois o%7etos Juanto ao #onte>do a no ser Jue #omparemos atri%uto por atri%uto, o mesmo ?a+e para a #<pia" Seria >ti+ dispor de um #on7unto de operaIes de i!ua+dade, desi!ua+dade e #opia Jue se ap+i#asse ao #onte>do dos o%7etos e no ao endereo de mem<ria de suas ?ari6?eis" 4ma outra ne#essidade seria ?eri(i#ar a #+asse de um o%7eto em tempo de e5e#uo" Antes de ?er a so+uo pro#ure sentir o pro%+ema no e5emp+o a se!uir& 4saremos o arJui?o da #+asse 'onto, 76 apresentado em CONSTR4TORES ", mas #om uma modi(i#ao no m todo mostra" No +u!ar de mostra #riaremos um m todo #.amado public &trin! to&trin!"%. Este m todo padro em muitas #+asses e de?e ser de(inido de modo a retornar uma &trin! des#riti?a do o%7eto" -a=endo isto ?o#H pode #on#atenar uma ?ari6?e+ 'onto #om uma &trin! no ar!umento do m todo &=stem.out.println"meu'onto+F I Ba vi4inhanca de IFmeu'onto5%*" Esta de#iso de imp+ementao #ertamente mais !en ri#a Jue mostra, ?isto Jue nem sempre estaremos imprimindo atra? s de &=stem.out.println"%, por e5emp+o na se!unda parte o#orrero #asos em Jue temos Jue ApintarC &trin!s em 6reas espe#iais na te+a" Apresentao do pro%+ema //#lasse ponto class 'onto : public float ,E=* public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public 9trin7 to9trin7() 0 return :(:-t4i*,#-:6:-t4i*,$-:): 1 ? //#lasse principalE Ar$uivo 'rincipal.java

!!(#6$)

Strin!s e ?etores so o%7etos de #+asses pr de(inidas na +in!ua!em, portanto as a(irmaIes (eitas aJui se ap+i#am a e+es tam% m"
0

03

class 'rincipal : public static void main"&trin! ar!s;<% : !!preparacao "a* +aria+ei* copia "e ob8eto* 'onto pVri!inalEpAliasEp#opia* pVri!inalGnew 'onto""float%1.1E1.1f%* //"float%1.1 ou 1.1f* 1.1 eh double pAliasGpVri!inal* //copiando atraves de atribuica p#opiaGnew 'onto"pVri!inal.,EpVri!inal.=%* //copiando atributo por atributo //resultados &=stem.out.println">Vri!inal:>FpVri!inal%* &=stem.out.println">Alias:>FpVri!inal%* &=stem.out.println">6odificando Alias., para 5>%* pAlias.,G5.1f* &=stem.out.println">Veja como o ori!inal ficou:>FpVri!inal%* &=stem.out.println">p#opia nao se modifica:>Fp#opia%* !!co%paracao "e ob8eto* &=stem.out.println">Vri!inalGGAlias:>F"pVri!inalGGpAlias% %* &=stem.out.println">#opiaGGVri!inal:>F"p#opiaGGpVri!inal% %* &=stem.out.println">.ei,ando atributos de #opia i!uais aos de Vri!inal>%* p#opia.,G5* &=stem.out.println">#opiaGGVri!inal:> F"p#opiaGGpVri!inal% %* &=stem.out.println">Vri!inal.,GG#opia.,:>F"p#opia.,GGpVri!inal.,% %* &=stem.out.println">Vri!inal.=GG#opia.=:>F"p#opia.=GGpVri!inal.=% %* ? Vri!inal:"1E1% Alias:"1E1% 6odificando Alias., para 5 Veja como o ori!inal ficou:"5E1% p#opia nao se modifica:"1E1% Vri!inalGGAlis:true #opiaGGVri!inal:false .ei,ando atributos de copia i!uais aos de Vri!inal #opiaGGVri!inal:false Vri!inal.,GG#opia.,:true Vri!inal.=GG#opia.=:true !!COMEN;ARIO9 !!preparacao "a* +aria+ei*6 copia "e ob8eto*5

FF

pAlias e uma re(erHn#ia para o mesmo +o#a+ de mem<ria Jue pVri!inal, por este moti?o Juando pAlias a+terado, pVri!inal se a+tera por Ae(eito #o+atera+C, e+es #omparti+.am o mesmo o%7eto pois a atri%uio pAliasGpVri!inal, #opia o endereo de pVri!inal" J6 p#opia, o resu+tado de uma no?a a+o#ao de mem<ria, portanto um no?o endereo, um o%7eto independente dos outros" !!co%paracao "e ob8eto*5 pVri!inalGGpAlias e outras #omparaIes eJui?a+entes tHm o si!ni(i#ado de #omparao do endereo de mem<ria e no do #onte>do" pVri!inal.,GGp#opia., tem o si!ni(i#ado de #omparao do ?a+or desses atri%utos, assim #omo uma #omparao entre inteiros" Se esses atri%utos por sua ?e= (ossem o%7etos, esta operao teria o si!ni(i#ado de #omparao entre endereos de mem<ria dos o%7etos" As poss*?eis so+uIes, #omentadas in#+uindo ?eri(i#ao da #+asse dos o%7etos //#lasse 'onto class 'onto : public float ,E=* public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public &trin! to&trin!"% : return >">Fthis.,F>E>Fthis.=F>%>* //",E=% ? public boolean i7ual(Ponto outro) 0 return ((outro,#&&t4i*,#) BB (outro,$&&t4i*,$)) !!t4i*&&outroC 1 ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal :
05

public static void main"&trin! ar!s;<% : //preparacao das variaveis 'onto pVri!inalEp#opia+Ep#opia5* pVri!inalGnew 'onto""float%1.1E1.1f%* //"float%1.1 ou 1.1f* 1.1 eh double p#opia+Gnew 'onto"1.1fE1.1f%* pCopia.,Cop$(pOri7inal) !!pCopia. copia conteu"o "e pOri7inal nele %e*%o pCopiaA&(Ponto) pOri7inal,Clone() //copia de objetos &=stem.out.println">Vri!inal:>FpVri!inal%* &=stem.out.println">#opia+:>Fp#opia+%* &=stem.out.println">#opia5:>Fp#opia5%* &=stem.out.println">6odificando #opia+., para 5>%* p#opia+.,G5.1f* &=stem.out.println">Veja como o ori!inal ficou:>FpVri!inal%* &=stem.out.println">#opia5 nao se modifica:>Fp#opia5%* //comparacao de objetos &=stem.out.println">Vri!inalGG#opia5:>F"pVri!inalGGp#opia5% %* &=stem.out.println">Vri!inal.i!ual"#opia5%:>FpOri7inal,i7ual(pCopiaA) %* &=stem.out.println">.ei,ando atributos de #opia i!uais aos de Vri!inal>%* //verificacao da classe dos objetos &=stem.out.println">Vbtendo a classe dos objetos>%* &=stem.out.println"pVri!inal.!et#lass"%.!etBame"%%* &=stem.out.print">Vri!inal e da classe &trin!Y>%* boolean re*ult&(pOri7inal in*tanceof 9trin7) &=stem.out.println"result%* ? ? Este pro!rama e5emp+o no opera #orretamente, isto se de?e a no imp+ementao destes m todos na ?erso %eta 8a dispon*?e+ atua+mente;" OBTEN%O &A'ORES %O $S$*RIO Este t<pi#o (oi introdu=ido porJue os pro!ramas se!uintes so mais #omp+e5os e pre#isam ser testados iterati?amente" ,esmo Jue ?o#H s< ?6 (a=er pro!ramas em inter(a#es !r6(i#as interessante sa%er #omo testar #ertas #+asses ?ia te#+ado ou +in.a de #omando, sem #ontar Jue sem o #onte>do deste t<pi#o os pro!ramas se!uintes no sero poss*?eis" A+ m do Jue ?o#H pode dese7ar (a=er a+!um pro!rama de +in.a de #omando 8%at#.; em Java, por e5emp+o um pro!rama de #omuni#ao entre as di?ersas m6Juinas de uma rede ou um pro!rama Jue re#e%a ar!umentos ?ia +in.a de #omando"

F2

'EN%O %O TEC'A%O Este t<pi#o #ont m dois e5emp+os Jue ensinam #omo +er &trin!s do te#+ado, #omo #on?ertH3+as para n>meros, e #omo #ontro+ar me+.or a entrada e sa*da de dados" 'EIT$RA %E 9;RING9 $SAN%O $M &ETOR %E BYTESN Em Java prati#amente um padro +er dados em %ytes, se7a do te#+ado, da rede, do dis#o ou de Jua+Juer outro +u!ar" 'or este moti?o o primeiro e5emp+o +H em um ?etor de %ytes" Como sa%emos Jue ?o#H Juer mais do Jue isso8 e5" +er outros tipos da +in!ua!em ;, o se!undo e5emp+o tratar6 desse #aso"

+ 5 3 0 5 L 7 2 +1 ++ +5 +3 +0 +5 +L +7 +2 + 51 5+ 55

import java.io.@* class -ntra.ados : public static void main "&trin! ar!s;<% : b$te +etorte#to>? & ne' b$te>A33? !!"eclaracao "e u% +etor "e b$te* int b$te*li"o* & 3 &=stem.out.println">-screva al!o:>%* tr= : b$te*li"o* & 9$*te%,in,rea"(+etorte#to) &=stem.out.print">Voce escreveu:>%* 9$*te%,out,'rite(+etorte#to636b$te*li"o*) ? catch "8V-,ception e% : // Al!uma acao de recuperacao da falha ? ? ? -screva al!o: #omo assim escreva al!oY Voce escreveu:#omo assim escreva al!oY

!!COMEN;ARIO95

07

Este pro!rama usa o m todo &=stem.in.read"vetorte,to%* para +er do te#+ado" Este m todo pre#isa de um ?etor de %ytes #omo ar!umento8onde sero +idos os #ara#teres; e a+ m disso retorna o n>mero de %ytes +idos, para Jue ?o#H possa usar o ?etor #orretamente" 'ara des#arre!ar o ?etor no ?*deo use o m todo &=stem.out.write"vetorte,toE1Eb=teslidos%* Jue imprime na te+a as posiIes de O at b=teslidos do ?etor de %ytes passado #omo o primeiro ar!umento" Wo#H de?e estar se per!untando Jua+ a (uno dos %+o#os de #<di!o tr= :? catch :? deste pro!rama e5emp+o" E+es so importantes no tratamento de e5#eIes, t<pi#o Jue ser6 a%ordado no (ina+ deste te5to" 'or enJuanto apenas ?e7a estes %+o#os de #<di!o #omo ne#ess6rios para es#re?er dentro do %+o#o tr=:? as operaIes de +eitura de te#+ado, Jue so operaIes Jue podem !erar e5#eIes" $MA &ISO GERA' SOBRE PACRAGES E 9;REAM9 A maneira ensinada nos t<pi#os anteriores 8+eitura de %ytes; su(i#iente para Jue ?o#H +eia do te#+ado, mas apro?eitaremos a!ora Jue ?o#H 76 est6 mais e5periente para ensinar uma outra maneira e+e!ante Jue ser?e para +er do te#+ado, de um arJui?o ou de uma #one5o da rede Jue a#eita por e5emp+o a +eitura direta para uma &trin! e outros tipos desta +in!ua!em e no s< para um ?etor de %ytes" Nestes e5emp+os usaremos um #on#eitos Jue somente sero e5p+i#ados a (undo nos pr<5imos t<pi#os, so os #on#eito de pa#Ba!es e Streams" 'a#Ba!es so #on7untos de #+asses" At a!ora s< t*n.amos uti+i=ados e+ementos da pa#Ba!e java.lan! Jue importada imp+i#itamente em todos os pro!ramas, permitindo por e5emp+o es#re?er na te+a 8&=stem.out uma #+asse presente em java.lan!;" A pa#Ba!e java.io (orne#e a a%strao de streams para +idar #om a #omp+e5idade de entrada e sa*da de dados" Esta a%strao poderosa e ser6 uti+i=ada aJui para +er do te#+ado" 4m stream #omo um #ano por onde passam os %ytes, a ?anta!em deste #ano Jue no pre#isamos nos preo#upar de onde ?em esses %ytes, para n<s e+es ?em do #ano" 'ara Juem es#re?e no stream tam% m ?a+e a mesma id ia do Jue a!ora do outro +ado, empurrando os %ytes para dentro"

Neste e5emp+o usamos um stream para +er do te#+ado, esta poderosa a%strao ser6 estendida mais tarde para tratar a entrada e sa*da de dados atra? s de portas de #omuni#ao e pro!ramao #+iente ser?idor, e5p+orando as #apa#idades de AnetNorBin!C da +in!ua!em, a+ m da +eitura e es#rita em arJui?os, no t<pi#o adeJuado" Este pro!rama simp+esmente +H uma +in.a do te#+ado e a imprime no?amente" +
FV

i%port 8a+a,io,DataInput9trea% !!cla**e DataInput9trea% para a entra"a "e "a"o*

5 3 0 5 L 7 2

public class Uead&trin! : public static void main"&trin! ar!s;<% : &trin! linhaG>>*

+1 DataInput9trea% %euDataInput9trea% ++ +5 meu.ata8nput&tream G new .ata8nput&tream"&=stem.in%* +3 +0 tr=: +5 linha G meu.ata8nput&tream.read3ine"%* +L ? +7 catch "-,ception erro% : &=stem.out.println"I-rro de leituraJ%* ? +2 //antes de imprimir ou arma4enar a strin!E eN obvio $ue voce poderia e,ecutar al!um + //processamentoE mas nao estudamos a classe strin! aindaE por isso tenha paciencia. 51 &=stem.out.println"linha%* 5+ 55 53 ?/ 50 55 ? Voce pode andar rapido com paciencia Voce pode andar rapido com paciencia

//COMEN;ARIO9 O #ano de nosso e5emp+o ponta de onde sai a 6!ua"

mais pare#ido #om uma man!ueira de 7ardim, n<s (i#amos #om a

0&Nesta +in.a di=emos Jue dese7amos usar, importar, um stream de entrada de dados de nome .ata8nput&tream presente na pa#Ba!e java.io V& Nesta +in.a de#+aramos o Jue seria o %a+de para re#o+.er a 6!ua da man!ueira 84ma &trin!;" O %a+de #omea ?a=io 8IJ;" 0O&Esta +in.a di= para pe!ar a man!ueira 8.ata8nput&tream; do dep<sito 8pa#Ba!e java.io;" 0/&Esta +in.a #one#ta a outra ponta da man!ueira na torneira 8 &=stem.in a torneira, Jue si!ni(i#a te#+ado em Juase todos os #omputadores;" 0U&En#.a o %a+de #om o Jue sair da torneira at .a?er uma interrupo no (orne#imento" 89eia o Jue puder do stream at en#ontrar um #ara#tere de no?a +in.a ZMnN" )a* o nome readline Jue si!ni(i#a +eia +in.a;" /O&Es?a=ie o %a+de no #ano de sa*da 8Copie o ?a+or da &trin! +ida na entrada do stream &=stem.out, Jue si!ni(i#a ?*deo na maioria das m6Juinas;"
0

As +in.as 0F,0U e 0] so ne#ess6rias para es#re?er line G m=.ata8nput&tream.read3ine"%*. Essas +in.as permitem aIes de re#uperao de (a+.as Jue possam o#orrer no pro#esso de +eitura, a%ordaremos este t<pi#o %em mais adiante, de modo Jue aJui apenas daremos uma ?iso !era+ s< a t*tu+o de #uriosidade& No %+o#o tr= : ?, de?e3se inserir as operaIes pass*?eis de (a+.as" Este %+o#o de?e ser se!uido por catch "-,ception erro% : /@ nao faco nada @/ ?. No +u!ar de /@ nao faco nada @/ de?eriam estar as poss*?eis aIes de re#uperao de (a+.as #omo no #aso adotamos& &=stem.out.println"I-rro de leituraJ%*" line G m=.ata8nput&tream.read3ine"%* o m todo Jue (a= #om Jue o &tream +eia da entrada de dados em Jue (oi asso#iado uma +in.a" Este m todo o%?iamente %+oJueia a e5e#uo do pro!rama at Jue se di!ite A#arria!e returnC, o Jue no pro%+em6ti#o pois isto poderia ser (eito para+e+amente, usando At.readsC" C"-" c"21erter 9trin7* /ara i2teir"s: Se ?o#H inserir o se!uinte m todo na nossa #+asse Uead&trin!, poder6 +er ?a+ores inteiros do te#+ado" static int le8nteiro"% : &trin! line* .ata8nput&tream in G new .ata8nput&tream"&=stem.in%* tr= : line G in.read3ine"%* int i G 8nte!er.valueVf"line%.intValue"%* return i* ? catch "-,ception e% : return Q+* ? ? int i G 8nte!er.valueVf"line%.intValue"%* M um e5emp+o de #.amadas #onse#uti?as ou anin.adas de m todos" O+.e da esJuerda para a direita" 'rimeiro o m todo valueVf"line% #.amado para a #+asse0 8nte!er retornando um o%7eto da #+asse 8nte!er" )epois o o%7eto da #+asse 8nte!er tem seu m todo intValue"% in?o#ado retornando um ?a+or do tipo int Jue #orrespondente a &trin! line" Wo#H se +em%ra Jue n<s (a+amos Jue a +in!ua!em (orne#e uma au5i+iar8ANrapperC; para #ada tipo %6si#o da +in!ua!emX A #+asse Inte!er uma #+asse Jue mapeia em termos de o%7etos o tipo %6si#o int de T/ %its" A!ora Jue ?o#H 76 #on.e#e o nome da #+asse, pesJuise mais so%re e+a na JAWA A'I" E<erc9ci"s:
M poss*?e+ #riar m todos para serem #.amados para #+asses e no s< para o%7etos, so os #.amados A#+ass met.odsC em #ontraposio a Ainstan#e met.odsC"
0

UO

=> Wo+taremos a (a+ar so%re &trin!s, por m por .ora, ?o#H 76 tem #ondiIes de +er as %i%+io!ra(ias adi#ionais so%re e+es" ARG$MENTOS %E 'INHA %E COMAN%O Na se!unda parte ?eremos Jue os pro!ramas Java Jue rodam em%e%idos em .iperte5tos podem re#e%er parLmetros ini#iais de (un#ionamento do .iperte5to" Os pro!ramas Jue estamos des#re?endo nesta parte so ap+i#aIes e5e#utadas ?ia +in.a de #omando" )e modo an6+o!o, essas ap+i#aIes podem re#e%er ar!umentos de +in.a de #omando" E5emp+o de passa!em de trHs ar!umentos de +in.a de #omando para um pro!rama Java& java teste IHe,toJ 5 Bome Interrompa sua +eitura a!ora e e5perimente passar ar!umentos para um dos pro!ramas #riados anteriormente, os ar!umentos o%?iamente sero i!norados pe+o pro!rama e este se #omportar6 da mesma (orma Jue antes" O ?etor de &trin!s o ar!umento do m todo main Jue norma+mente #.am6?amos de &trin! ar!s;<& public static void main (9trin7 ar7*>?) ...

class 6ostraAr!umentos : public static void main"&trin! ar!s;<% : for "int iG1* i A ar!s.len!th* iFF% : &=stem.out.println">Ar!umento> F iF>: >F ar!s;i<%* ? ? ? Resu+tado do pro!rama para a #.amada& java 6ostraAr!umentos 'assando 3 Iar!umento sJ Ar!umento1: 'assando Ar!umento+: 3 Ar!umento5: ar!umento s

ar!s.len!th* Retorna o #omprimento do ?etor de &trin!s, este ?a+or usado para iterar so%re os ar!umentos Jue so &trin!s arma=enadas em ar!s;i<" 'er#e%a Jue as aspas (a=em #om Jue nomes separados por espaos se7am #onsiderados s< um ar!umento" Os ar!umentos passados para seu pro!rama so !ra?ados em um ?etor de Strin!s, para usar o ar!umento T Jue (i#ou !uardado #omo &trin!, na (orma de inteiro, pre#iso primeiro #on?ertH3+o para inteiro" Isto pode ser (eito no #aso do nosso e5emp+o atra? s de uma #.amada a& 8nte!er.parse8nt"ar!s;+<%* A #+asse Inte!er usada no #<di!o a#ima um dos ANrappersC Jue des#re?emos em " A operao #ontr6ria a Jue (oi (eita 8nte!er.to&trin!"int a%*. O m todo parse8nt a#eita tam% m um se!undo ar!umento Jue a %ase em Jue o n>mero est6 representado na &trin!.

5+

E<erc9ci"s: => ,ude o primeiro pro!rama em Java 87ello8nternet; para imprimir I7elloJ se!uido do primeiro ar!umento de +in.a de #omando 8se e5istir& ar!s.len!thC1 ;" /3 Construa um pro!rama simp+es Jue re#e%e ar!umentos da +in.a de #omando e os imprime atra? s de cout" Norma+mente isso Jue de?e ser (eito antes de usar um re#urso da +in!ua!em pe+a primeira ?e=, e5periment63+o em pro!ramas simp+es"

ENCAPS$'AMENTO COM PRIVA;E6 PUDLIC6 EPACFAGEG e PRO;EC;ED En#apsu+amento, Adata .idin!C um #on#eito %astante importante em orientao a o%7etos" Neste t<pi#o ?amos (a+ar das maneiras de restrin!ir o a#esso as de#+araIes de uma #+asse e a pr<pria #+asse, isto (eito atra? s do uso das pa+a?ras reser?adas publicE private e protected+ 5 Jue so Jua+i(i#adores" A+!u m pode estar se per!untando o porJuH de se restrin!ir o a#esso a #ertas partes de uma #+asse" A id ia simp+es, de?emos (orne#er ao usu6rio, #+iente de uma #+asse, o ne#ess6rio e somente o ne#ess6rio para Jue e+e tire pro?eito da (un#iona+idade desta #+asse" Os deta+.es de?em ser omitidos, somente a +ista de operaIes a Jua+ uma #+asse de?e atender (i#a ?is*?e+" Os %ene(*#ios so muitos& #+are=a do #<di!o, minimi=ao de erros, (a#i+idade de e5tenso" Ta+?e= a (a#i+idade de modi(i#ao se7a o mais importante dos %ene(*#ios" Como a #+asse #on.e#ida pe+a sua inter(a#e, muito (6#i+ mudar a representao interna sem Jue o #+iente, usu6rio, per#e%a a di(erena Estaremos preo#upados em separar desi!n de imp+ementao, Java uma +in!ua!em %oa de se pro!ramar em termos de desi!n e em termos de imp+ementao" 'ro!ramar tendo em ?ista o desi!n tam% m #.amado de Apro!rammin! in t.e +ar!eC, enJuanto Jue pro!ramar tendo em ?ista imp+ementao, #odi(i#ao #.amado de Apro!rammin! in t.e sma++C" A+!uns pro!ramadores e5perientes a(irmam Jue Java se pare#e #om C Juando estamos preo#upados #om #odi(i#ao, mas Juando estamos preo#upados #om desi!n, Java se asseme+.a a Sma++ta+B" Com en#apsu+amento ?o#H ser6 #apa= de #riar #omponentes de so(tNare reuti+i=6?eis, se!uros, (6#eis de modi(i#ar" ENCAPS$'AN%O MLTO%OS E ATRIB$TOS At a!ora no nos preo#up6?amos #om o modo de a#esso de de#+araIes de uma #+asse pois, mesmo sem sa%er porJue, ?o#H (oi a?isado para Jua+i(i#ar todos os atri%utos e m todos de suas #+asses #omo public o Jue si!ni(i#a Jue e+es so a#ess*?eis, ?is*?eis, em Jua+Juer +o#a+ de seu #<di!o" 'or ?is*?e+ entenda o se!uinte& se o atri%uto , do o%7eto Tm'onto no ?is*?e+ por e5emp+o (ora de sua #+asse, ento no (a= sentido es#re?er em main& Tm'onto.,G1* "

0 /

'rotected ser6 e5p+i#ada 7untamente #om .erana na seo /" 'AC^AQE ser6 e5p+i#ado 7untamente #om pa#Ba!es"

U/

,as ento #omo #ontro+ar o a#esso de atri%utos e m todos em uma #+asseX Simp+es, atra? s das pa+a?ras reser?adas privateE public e protected #u7os si!ni(i#ados Juando Jua+i(i#ando m todos e atri%utos 8private e public podem tam% m Jua+i(i#ar #+asses; so des#ritos a%ai5o& public private protected Nada espe#i(i#ado, eJui?a+e Apa#Ba!eC ou A(riend+yC Estes atri%utos e m todos so sempre a#ess*?eis em todos os m todos de todas as #+asses" Este o n*?e+ menos r*!ido de en#apsu+amento, Jue eJui?a+e a no en#apsu+ar" Estes atri%utos e m todos so a#ess*?eis somente nos m todos8todos; da pr<pria #+asse" Este o n*?e+ mais r*!ido de en#apsu+amento" Estes atri%utos e m todos so a#ess*?eis nos m todos da pr<pria #+asse e suas su%#+asses, o Jue ser6 ?isto em @erana " Estes atri%utos e m todos so a#ess*?eis somente nos m todos das #+asses Jue perten#em ao Apa#Ba!eC em Jue (oram #riados" Este modo de a#esso tam% m #.amado de A(riend+yC"

8e5istem outros Jua+i(i#adores, no re+a#ionados #om en#apsu+amento Jue sero e5p+i#ados depois;

0ac*age e ,riendlG: /parecem entre aspas por(ue no so palavras reservadas da linguagem, so apenas nomes dados para o tipo de encapsulamento padro 5de,ault6, (ue ocorre (uando no e)iste um especi,icador. 2o nomes ,ceis de memori7ar. 8riendlG signi,ica amigvel, no sentido de (ue as classes (ue permitem este tipo de acesso possuem um encapsulamento mais rela)ado com relao as classes do mesmo pac*age 5amigas6. 0ac*age ' um grupo de classes relacionadas. 'rotected ser6 e5p+i#ada em pois est6 re+a#ionada #om .erana, por .ora ?amos (o#a+i=ar nossa ateno em private e public Jue Jua+i(i#am os atri%utos e m todos de uma #+asse Juanto ao tipo de a#esso 8onde e+es so ?is*?eis; " 'ublic, private e protected podem ser ?istos #omo Jua+i(i#adores ou Aspe#i(iersC" 'ara (a#i+itar a e5p+i#ao supon.a a se!uinte de#+arao de uma #+asse& 0; rea private" class 'onto : private float , private float = public void iniciali4a"float aEfloat b% :,Ga* =Gb*?* public void move "float d,Efloat d=%* ? -i#a (6#i+ entender essas de#+araIes se ?o#H pensar no se!uinte& esses Jua+i(i#adores se ap+i#am aos m todos e atri%utos Jue ?em imediatamente ap<s e+es" Os e+ementos da #+asse Jua+i(i#ados #omo private apare#em #om (undo #in=a es#uro indi#ando Jue sua A?isi%i+idadeC mais +imitada Jue os atri%utos Jua+i(i#ados #omo public 8#in=a #+aro;" A!ora ?amos entender o Jue private e o Jue 8#riou; um o%7eto do tipo 'onto em seu pro!rama& 'onto meu* //instanciacao public" Wamos supor Jue ?o#H instan#iou

53

meuGnew 'onto"%* Se!undo o uso da de(inio da #+asse 'onto dada a#ima ?o#H 28" pode es#re?er no seu pro!rama& meu.,G"float%5.1* //erro ! ,#omo (a=*amos nos e5emp+os anteriores, a no ser Jue , (osse de#+arado #omo public na de(inio da #+asse o Jue no o#orre aJui" ,as ?o#H pode es#re?er ,G5.1* na imp+ementao 8dentro; de um m todo porJue enJuanto no (or (eito uso de .erana, pode3se di=er Jue um m todo tem a#esso a tudo Jue de sua #+asse, ?e7a o pro!rama se!uinte" Wo#H pode es#re?er: meu.move"5.1E5.1%* ,porJue sua de#+arao "move% est6 #omo public na #+asse, em Jua+Juer +u!ar se pode es#re?er meu.move"5.1E5.1%*" Wisi%i+idade das de#+araIes de uma #+asse, (ora de+a ,de sua .ierarJuia e de seu pa#Ba!e" We7a Jue s< a parte pu%+i# ?is*?e+ neste #aso& '4B9IC 'RIWATE 'ROTECTE) A'AC^AQEC '4B9IC 'RIWATE 'ROTECTE) A'AC^AQEC

Wisi%i+idade das de#+araIes de uma #+asse, dentro de+a mesma&

ATRIB$TOS PRIVA;E+ MLTO%OS PUDLIC Ap+i#ando en#apsu+amento a #+asse ponto de(inida anteriormente, dei5ando os atri%utos en#apsu+ados e de(inindo a inter(a#e pu%+i#a da #+asse somente atra? s de m todos" //#lasse ponto public class 'onto : pri+ate float ,E=* //atributos private

public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public float retorna),"% :
UF

return ,* ? public void mostra"% : &=stem.out.println" >"> F this., F >E> F this.= F >%> %* ? ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : 'onto ap* apGnew 'onto""float%1.1E"float%1.1%* ap.mostra"%* ? ? "1E1%

!!COMEN;ARIO95 Este pro!rama no dei5a ?o#H tirar o ponto de "1E1% a no ser Jue se7a #.amada iniciali4a no?amente" -i#a #+aro Jue a!ora, en#apsu+ando , e = pre#isamos de mais m todos para Jue a #+asse no ten.a sua (un#iona+idade +imitada" No?amente& es#re?er ap.,G+1* em main um erroR 'ois , est6 Jua+i(i#ada #omo private" Sempre +eia os e5er#*#ios, mesmo Jue no ?6 (a=e3+os" O Jue o#orre em #+asses mais #omp+i#adas, Jue ao de(inir mais m todos na inter(a#e da #+asse, estamos permitindo Jue a representao interna possa ser mudada sem Jue os usu6rios tomem #on.e#imento disto" E<erc9ci"s: => Imp+emente os m todos public void altera),"float a% E public float retorna),"void%E public void move "float d,Efloat d= %* "Imp+emente outros m todos Jue a#.ar importantes e5emp+o public void distancia"ponto a% : return dist"OEWEa.OEa.W%* ?E onde dist representa o #on7unto de operaIes matem6ti#as ne#ess6rias para o%ter a distLn#ia entre 8D,j; 8a"D,a"j;" Wo#H pro?a?e+mente usar6 a (uno 6ath.s$rt"% Jue de(ine a rai= Juadrada de um double, no pre#iso (a=er nen.um import para usar 6ath.s$rt"%, mas pre#iso #on?erter os ar!umentos de float para double e o ?a+or de retorno de double para float.

55

We7a Jue no m todo distancia, podemos o%ter a#esso aos atri%utos private O e W do ar!umento a, isto permitido porJue distancia um m todo da mesma #+asse de a, em%ora no do mesmo o%7eto, uma maneira de pro?er este tipo de a#esso para outras #+asses 8distan#ia de reta a ponto; dotar a #+asse 'onto de m todos do tipo float retorna),"void%*" @> Es#o+.a um pro!rama imp+ementado anteriormente e ap+iJue en#apsu+amento, ana+ise a (un#iona+idade de sua #+asse" Wo#H te?e Jue imp+ementar mais m todosX KuaisX $M ATRIB$TO L PUDLIC Neste t<pi#o pedimos Jue o +eitor (aa uma ?ariante do pro!rama anterior, a >ni#a di(erena Jue W de?e ser #o+o#ado na parte public da de(inio da #+asse podendo ser a#essado diretamente" 'ara es#re?er a ?ariante, tome o #<di!o do pro!rama anterior e su%stitua pri+ate float ,E=* por pri+ate float ,* public float =* //= pode ser acessado C"-e2t!ri"s: O%ser?e Jue a!ora nada impede Jue ?o#H a#esse diretamente y& ap.=G+11.1E por m ap.,G+1.11 um erro" O%ser?e em Jue parte 86rea; da #+asse #ada um desses atri%utos (oi de#+arado" E<erc9ci"s: => Crie os m todos float retorna),"void%E void altera),"float a%* Jue de?em ser?ir para retornar o ?a+or arma=enado em , e para a+terar o ?a+or arma=enado em , respe#ti?amente" Crie tam% m os respe#ti?os m todos retorna e altera para o atri%uto =" @> Kua+ das se!uintes de#+araIes permite Jue se a#esse em main s"-e2te os m todos move e iniciali4a, en#apsu+ando todos os outros e+ementos da #+asseX O%s"& A ordem das de#+araIes private e public pode estar in?ertida #om re+ao aos e5emp+os anteriores"

a; public class 'onto 0 public float ,* public float =* public void iniciali4a"float aE float b% :,Ga* =Gb*?* public void move"float d,E float d=% * :,FGd,* =FGd=* ?* 1* %; public class 'onto 0
U2

public void iniciali4a"float aE float b% :,Ga* =Gb*?* public void move"float d,E float d=% * :,FGd,* =FGd=* ?* pri+ate float ,* pri+ate float =* 1* #; public class 'onto 0 public void iniciali4a"float aE float b% :,Ga* =Gb*?* pri+ate void move"float d,E float d=% * :,FGd,* =FGd=* ?* public float ,* pri+ate float =* 1* ENCAPS$'AMENTO E PACRAGES Neste t<pi#o e5p+i#aremos o re#urso de pa#Ba!es #om Hn(ase nas opIes de en#apsu+amento re+a#ionadas , em .erana e5p+i#aremos este re#urso #om Hn(ase no reuso de #<di!o das pa#Ba!es o(ere#idas #om a +in!ua!em" 'a#Ba!es so #on7untos de #+asses re+a#ionadas, estes #on7untos so determinados in#+uindo uma +in.a no topo de #ada arJui?o indi#ando a Jua+ pa#Ba!e perten#em as #+asses a+i de#+aradas" Se nen.uma +in.a inserida assume3se Jue todas as #+asses perten#em a uma pa#Ba!e s<" ENCAPS$'AMENTO %E ATRIB$TOS E MLTO%OS COM PACRAGES O en#apsu+amento de atri%utos e m todos atin!ido #om o uso de pa#Ba!es muito seme+.ante ao en#apsu+amento #om private e public, s< Jue a!ora o A+imite de ?isi%i+idadeC mais amp+o do Jue a #+asse" A Juesto aJui +e?antada se a #+asse ?is*?e+ (ora do Apa#Ba!eC ou no" S< para +em%rar, a Juesto Jue do item anterior& , era se os m todos e atri%utos eram ?is*?eis (ora da #+asse ou no" Wisi%i+idade das de#+araIes de uma #+asse, dentro de seu pa#Ba!e& '4B9IC 'RIWATE 'ROTECTE) A'AC^AQEC

Kuando e5p+i#armos protected (orne#eremos um dia!rama #omp+eto dos modos de en#apsu+amento de m todos e atri%utos, este dia!rama muito >ti+ para a memori=ao" A'a#Ba!esC um re#urso da +in!ua!em Jue permite (ormar !rupos de #+asses re+a#ionadas entre si de (orma Jue e+as o(eream (a#i+idades umas as outras" -a#i+idades estas Jue nem sempre so o(ere#idas ao usu6rio" Wamos montar uma pa#Ba!e de nome /eometria #ontendo #+asses Jue representam e+ementos !r6(i#os tais #omo retas, #*r#u+os e pontos" A estrutura de diret<rio a%ai5o des#re?e a disposio dos arJui?os deste e5emp+o& I2ici": A/Fs Ja+ac:

57

Note Jue a pa#Ba!e /eometria est6 toda so% um diret<rio ou (o+der de mesmo nome, isto o#orre porJue a estrutura de pa#Ba!es de?e ser mapeada em uma estrutura de diret<rios para Jue suas #+asses possam ser a#.adas" Assim a #+asse java.awt.#olor est6 dois n*?eis, portanto dois diret<rios a%ai5o na .ierarJuia de pa#Ba!es (orne#ida #om a +in!ua!em"

//#lasse ponto pacHa7e Geo%etria public class 'onto : float ,E=* //nenhu especificadorE defaultGpacKa!e public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public float retornaO"% : return ,* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>%>%* ?
UV

? //#lasse circulo pacHa7e Geo%etria public class #irculo : float raioE,E=* //nenhum especificadorE defaulGpacKa!e public #irculo"float a,Efloat a=Efloat ar% //!arante o estado do objeto : this.,Ga,* this.=Ga=* this.raioGar* ? public void altera)raio"float a% : this.raioGa* ? public float retorna)raio"% : return this.raio* ? public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? public float "i*tancia(Ponto ap) 0 float "cp !!"i*tancia "o centro "o circulo ao ponto "cp&(float)Mat4,*Irt(("ouble) ((#2ap,#)J(#2ap,#)-($2ap,$)J($2ap,$)) ) !!ace**o "ireto !!ao* atributo* "e ap6 i*to porIue a* cla**e* pertence% ao %e*%o pacHa7e if ("cpKraio) 0return raio2"cp 1 el*e 0return "cp2raio 1 1 public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>E>Fthis.raioF>%>%* ?

//Ar$uivo Ueta.java //#lasse Ueta pacHa7e Geo%etria public class Ueta : 'onto aEb* //idem E sao encapsulados como pacKa!e public Ueta"float a,Efloat a=Efloat b,Efloat b=% : aGnew 'onto"a,Ea=%* bGnew 'onto"b,Eb=%* ? public float "i*tancia(Ponto ap) 0 !!%eto"o nao i%ple%enta"o !!ace**e li+re%ente o* atributo* "o ar7u%ento Ponto !!"e %o"o a calcular *ua "i*tancia a e*ta reta6 e# copia&ap,# return 3,3f 1 public void mostra"% : a.mostra"%* b.mostra"%* ? ?

//#lasse principalE Ar$uivo 'rincipal.java i%port Geo%etria,J public class 'rincipal : public static void main"&trin! ar!s;<% : #irculo acirc* !!acirc,#&(float).3,3 erro! atributo encap*ula"o (%o"o pacHa7e) 'onto apto* acircGnew #irculo""float%1.1E"float%1.1E"float%+.1%*
2O

acirc.mostra"%* aptoGnew 'onto""float%0.1E"float%3.1%* apto.mostra"%* 9$*te%,out,println(:Di*t5: - acirc,"i*tancia(apto)) ? ? "1E1E+% "0E3% .ist:0

As de#+araIes em ne!rito dos arJui?os a#ima& pacHa7e Geo%etria,J e i%port Geo%etria,J de?em ser inseridas +o!o no in*#io do arJui?o, s< podendo ser pre#edidas por #oment6rios" E5iste uma Juantidade !rande de Apa#Ba!esC, 76 de(inidas na +in!ua!em, as Juais a%ordaremos na se!unda parte" 'or .ora %asta sa%er Jue 76 estamos usando de#+araIes da Apa#Ba!eC java.lan! , mesmo sem espe#i(i#ar import java.lan!.@[ no in*#io de nossos arJui?os" Isto o#orre porJue este pa#Ba!e importado imp+i#itamente em todos os pro!rama Java" O .@ usado em import /eometria.@[ tem o si!ni(i#ado de todas as #+asses da pa#Ba!e /eometria, o asteris#o usado #omo um #orin!a, um ?a+or Jue pode su%stituir todos os demais, assim #omo em a+!uns sistemas opera#ionais" Em%ora de (6#i+ uti+i=ao, este #on#eito #onstitui uma ino?ao #om re+ao a CSS" Em ,odu+a3 T pode3se o%ter um e(eito seme+.ante uti+i=ando de#+araIes de #+asses 8tipos o%7etos; no mesmo m<du+o e inter(a#es Jue no e5portam tudo o Jue e5iste no m<du+o, assim as #+asses de#+aradas no mesmo m<du+o o(ere#em (a#i+idades umas as outras" O modo de a#esso de atri%utos e m todos #.amado A(riend+yC ou pa#Ba!e propor#ionado pe+o uso de Apa#Ba!esC e permite pro!ramar de maneira e(i#iente 8sem muitas #.amadas de m todos; e se!ura 8#om en#apsu+amento;" Se os tri%utos da #+asse 'onto (orem espe#i(i#ados #omo A(riend+yC ou pa#Ba!e 8eJui?a+e a nen.um espe#i(i#ador;, e+es podero ser a#essados direta-e2te 8sem #.amadas do tipo ap.retorna),"%* ; pe+a #+asse Ueta Jue perten#e a mesma Apa#Ba!eC, mas #ontinuam en#apsu+ados para as #+asses e5ternas ao Apa#Ba!eC ou se7a para o usu6rio" En(ati=amos o termo AdiretamenteC porJue o%ter a#esso a um atri%uto ?ia m todo %em mais #ustoso do Jue a#ess63+o diretamente, mas se ?o#H pro!ramar usando pa#Ba!es, !an.ar6 o %ene(i#io da e(i#iHn#ia sem perder o do en#apsu+amento" ENCAPS$'AMENTO %E C'ASSES COM PACRAGES At a!ora, t*n.amos de#+arado todas as #+asses #omo public 8public class Bomeclasse :?;, em%ora sem e5p+i#ar e5atamente porJue" Este t<pi#o trata da possi%i+idade de o pro!ramador dese7ar #riar uma #+asse para seu uso pr<prio e no (orne#H3+a para o usu6rio" O Jue a +in!ua!em Java permite neste sentido &

L+

03 A #riao de #+asses Jue s< podem ser usadas dentro de pa#Ba!es, ou se7a, ?o#H no pode de#+arar um o%7eto desta #+asse e5ternamente ao pa#Ba!e" /3 A #riao de #+asses Jue podem ser usadas somente pe+as #+asses presentes no mesmo arJui?o, em%ora no ten.amos mostrado, um arJui?o pode #onter a de#+arao de mais de uma #+asse desde Jue somente uma de+as se7a public" O en#apsu+amento de #+asses se!ue uma sinta5e seme+.ante ao en#apsu+amento de m todos e atri%utos, ou se7a& atra? s de Jua+i(i#adores ou modi(i#adores& [ualificador.a#lasse class Bome.a#lasse : /@Atributos e metodos @/ ? Os Jua+i(i#adores so& public Estas #+asses so sempre a#ess*?eis em todos os pa#Ba!es do seu #<di!o" Somente uma #+asse pu%+i#a permitida por arJui?o, e o arJui?o de?e ter o mesmo nome da #+asse" private Estas #+asses so a#ess*?eis somente pe+as #+asses de#+aradas no mesmo arJui?o" 4m arJui?o pode possuir ?6rias #+asses private, mas uma >ni#a #+asse public" Nada espe#i(i#ado Apa#Ba!eC Estas #+asses podem ser a#essadas no pa#Ba!e Jue e+as perten#em, se nen.um pa#Ba!e espe#i(i#ado, e+as perten#em ao pro!rama"

8e5istem outros Jua+i(i#adores, 28" re+a#ionados #om en#apsu+amento Jue sero e5p+i#ados depois;

Seus pro!ramas no pre#isam ne#essariamente (a=er uso destes re#ursos de en#apsu+amento, mas todo #<di!o es#rito para ter#eiros de?e uti+i=63+os intensamente" Wo#H te?e ter notado Jue sempre de(inimos uma #+asse por arJui?o, isto (eito porJue a +in!ua!em s< permite uma #+asse public por arJui?o, as outras tem Jue ser private ou pacKa!e" 4m e5emp+o de uti+i=ao& ao #riar uma #+asse +ista +i!ada a+!u m pode a#.ar #on?eniente de(inir uma #+asse n< para ser usada somente pe+a #+asse listali!ada" 4ma opo de(inir a #+asse n< #om modo de en#apsu+amento& pa#Ba!e" O #+iente de sua #+asse +ista +i!ada no pre#isa sa%er Jue esta #+asse se %aseia em uma #+asse Bo" Wamos imp+ementar esta id ia no e5emp+o a se!uir, tomarei o #uidado de (a=H3+o %em simp+es pois estamos no #omeo do tutoria+& I2ici": A/Fs Ja+ac:

pacKa!e listas* //classe 3istaE classe Bo ar$uivo 3ista.java class Bo : //sem especificador de modo de acesso na classe
2/

private char info* //se eu ja tivesse ensinado protected usaria em lu!ar de private private Bo pro,* //>ponteiro> para o pro,imo no Bo"char iEBo p% //construtor : infoGi* pro,Gp* ? char retorna)info"% //retorna valor do campo : return info* ? void altera)info"char i% //altera valor do campo : infoGi* ? void altera)pro,"Bo p% //altera valor do pro,imo no : pro,Gp* ? Bo retorna)pro,"% //retorna referencia ao pro,imo no : return pro,* ? ? public class 3ista : private Bo cabeca* //inicio da lista private int elementos* //numero de nos na lista public 3ista"% //construtor :

L3

cabecaGnull* elementosG1* ? public void insere"char a% : //reali4ada em muitos mais pacos para facilitar apredi4ado elementosFF* Bo temp* if "cabecaGGnull% cabecaGnew Bo"aEnull%* else: tempGnew Bo"aEnull%* temp.altera)pro,"cabeca%* cabecaGtemp* ? //se cabeca GG null tambem funciona ? public char remove"% : Bo removido* if "cabecaGGnull% return X1X* //elementosGG1 else : elementosQQ* removidoGcabeca* cabecaGcabeca.retorna)pro,"%* return removido.retorna)info"%* ? ? public int retorna)elementos"% : return elementos* ? public void mostra"% //nao deveria estar a$uiE e so para debu!ar : Bo tempGcabeca* while "temp9Gnull% : &=stem.out.print" >;> F temp.retorna)info"% F ><Q> %* tempGtemp.retorna)pro,"%* ? &=stem.out.print">null>%* &=stem.out.println"%*

2F

? ? A!ora ?o#H pode es#o+.er entre duas ?ersIes do pro!rama prin#ipa+, a ?erso da esJuerda imp+ementa um +oop de entradas do te#+ado Jue permite testar iterati?amente a #+asse 3ista, no e5p+i#aremos ainda deta+.es deste +oop, apenas #omo us63+o" )H uma o+.ada no #<di!o desta ?erso de pro!rama prin#ipa+, se ?o#H a#.a3+o #omp+i#ado pode usar a se!unda ?erso presente a direita deste arJui?o e em uma se!unda +eitura retornar a ?erso da esJuerda" Na ?erso #om o +oop 803esJuerda; a +etra LiM indi#a o #omando insero, se ?o#H di!itar iAenterC inserir6 o #ara#tere AenterC na sua +ista, o Jue norma+mente no dese7ado, di!ite icAenterC para inserir o #ara#tere c" LrM indi#a remoo, e L%M indi#a Jue a +ista de?e ser -ostrada na te+a" 'e+o resu+tado do pro!rama ?o#H entender6 me+.or esses #omandos rudimentares de teste" Wo#H pode a#.ar rudimentar pro!ramar assim, mas um %om m todo, ?er6 #omo esta mesma +ista depois de testada assim pode (i#ar %onita se inserida em um applet e mostrada !ra(i#amente" Es#o+.a uma imp+ementao para entender e #ompi+ar&
//#lasse principalE Ar$uivo 'rincipal.java versao + import java.io..ata8nput&tream* import listas.@* class 'rincipal : public static void main"&trin! ar!s;<% : 3ista mlGnew 3ista"%* //mlGminhalista char oEe* //oGopcaoE eGtemporario .ata8nput&tream meu.ata8nput&tream Gnew .ata8nput&tream"&=stem.in%* //#lasse principalE Ar$uivo 'rincipal.java versao 5 import java.io..ata8nput&tream* import listas.@* class 'rincipal : public static void main"&trin! ar!s;<% : char e* 3ista mlGnew 3ista"%* //mlGminhalista ml.insere"XaX%* //mesma se$uencia da versao com menu //de pro!rama principal ml.mostra"%*

tr=: do ml.insere"XvX%* : ml.insere"XaX%* o G"char%meu.ata8nput&tream.read"%* ml.insere"XjX%* switch "o% : ml.mostra"%* case XiX: eG"char%meu.ata8nput&tream.read"%* eGml.remove"%* ml.insere"e%* &=stem.out.println"e%* breaK* ml.mostra"%* case XrX: eGml.remove"%* ml.remove"%* //embora o metodo &=stem.out.println"e%* //remove retorne um valor //&=stem.out.flush"%* ml.remove"%* //nestas chamadasE breaK* //este valor de retorno eX case XmX: ml.remove"%* //i!norado ml.mostra"%* ml.mostra"%* &=stem.out.println"%* //&=stem.out.flush"%* ? breaK* ? default: * ? L5

? while "o9GX$X%*? catch "-,ception erro% : /@ nao faco nada @/ ? ? ?

ia m >a?2null iviaij m >8?2>a?2>+?2>a?2null r j m >a?2>+?2>a?2null r a r + r a m null $ //COMEN;ARIO9

;a<Qnull ;j<Q;a<Q;v<Q;a<Qnull j ;a<Q;v<Q;a<Qnull null

Os pro!ramadores Jue no esto a#ostumados #om #o+eta autom6ti#a de +i5o podem a#.ar estran.o Jue retiramos o primeiro e+emento da +ista simp+esmente perdendo proposita+mente a re(erHn#ia para e+e ao emendar o n< #a%ea #om o restante&

No se preo#upem, a +in!ua!em #uida

da desa+o#ao"

22

TIPO ABSTRATO %E %A%OS Tipo a%strato de dados, TA), se preo#upa em propor#ionar uma a%strao so%re uma estrutura de dados em termos de uma inter(a#e %em de(inida" O en#apsu+amento mant m a inte!ridade do o%7eto e?itando a#essos inesperados" O (ato de o #<di!o estar arma=enado em um s< +u!ar #ria um pro!rama modi(i#6?e+, +e!*?e+, #oeso" A id ia #riar #+asses Jue o#u+tem a sua representao interna as Juais podem !era+mente ser mode+adas atra? s de As.oppin! +ist approa#.C" 'or As.oppin! +ist approa#.C entenda Jue ?o#H pode mode+ar sua #+asse atra? s das operaIes Jue e+a suporta, ou se7a, antes de #omear a imp+ementar re#omend6?e+ Jue se (aa uma +ista 8seme+.ante a uma +ista de #ompras; das operaIes dese7adas para a #+asse e depois se es#o+.a a representao interna adeJuada" Comp+etando este #on#eito amp+o podemos di=er Jue uma #+asse imp+ementa um tipo a%strato de dados" So e5emp+os de tipos a%stratos de dados& 4ma 6r?ore %in6ria #om as operaIes usuais de insero, remoo, %us#a """ 4ma representao para n>meros ra#ionais 8numerador, denominador; Jue possua as operaIes aritm ti#as %6si#as e outras de #on?erso de tipos" 4ma representao para Ln!u+os na (orma 8Qraus, ,inutos, Se!undos;" Tam% m #om as operaIes re+a#ionadas, %em #omo as operaIes para #on?erter para radianos, entre outras" Tipo a%strato de dados um #on#eito muito importante em pro!ramao orientada a o%7etos e por este moti?o +o!o apresentado neste tutoria+" Os e5emp+os se!uintes so simp+es por no podermos usar todos os re#ursos da +in!ua!em ainda" )ada esta importLn#ia, a medida em Jue (ormos introdu=indo no?os #on#eitos e5emp+i(i#aremos #om ap+i#aIes na imp+ementao tipos a%stratos de dados" E<erc9ci"s: => 4se a estrat !ia da +ista de #ompras 8As.oppin! +ist approa#.C; para mode+ar a inter(a#e do tipo a%strato de dados 'onto, tente pensar nas operaIes Jue !era+mente se ap+i#am a pontos em !eometria, tais #omo distLn#ia a outros e+ementos, rotao em torno de outro ponto" Reimp+emente este TA) adi#ionando as in>meras a+teraIes" TA% FRAO Neste e5emp+o imp+ementaremos o tipo a%strato de dados (rao" Baseado no #on#eito de n>mero ra#iona+ do #ampo da matem6ti#a" A+!umas operaIes no (oram imp+ementadas por serem seme+.antes es e5istentes" 4ma ap+i#ao deste TA)s #onsiste em a+!uns #6+#u+os onde pode o#orrer muita perda de pre#iso ao +on!o do pro!rama de?ido ao uso de aritm ti#a de ponto (+utuante" 'or e5emp+o& (aa e5atamente o se!uinte em sua #a+#u+adora& 5 / 3 @ 3 E Jua+ o resu+tadoX Ao terminar este pro!rama teste a se!uinte operao #om (raIes "5/3%@"3/+%, Jua+ ser6 o resu+tadoX RES$MO %AS OPERASES MATEM*TICAS EN&O'&I%AS:
L7

Simp+i(i#ao de (rao& "a/b%G" "a/mdc"aEb%% / "b/mdc"aEb%% % Onde mdc"aEb% retorna o m65imo di?isor #omum de a%" Soma de (rao& "a/b%F"c/d%G" "a.dFc.b% / b.d % simp+i(i#ada" ,u+tip+i#ao de (rao& "a/b% @ "c/d%G " "a@c% / "b@d% % simp+i(i#ada" I!ua+dade& "a/b%GG "c/d% se a@d GG b@c. No i!ua+dade& "a/b% 9G "c/d% se a@d 9G b@c ,aior ou i!ua+ Jue& "a/b%"c/d% se a@d b@c

SHOPPING 'IST APPROACH PARA O TA% FRAO: 8O #on7unto de operaIes imp+ementadas esta mar#ado #om " A (ina+i=ao dessa s.oppin! +ist %em #omo do pro!rama dei5ada #omo e5er#*#io, o Jua+ no de?e ser di(*#i+ pois ?endo a imp+ementao da soma, o +eitor o%t m Juase Jue de maneira direta a imp+ementao da su%trao, o mesmo o#orre para as demais operaIes;&

Construtor 8re#e%e dois ar!umentos num ri#os inteiros; Simp+i(i#ao da (rao 8di?iso do numerador e denominador por m65imo di?isor #omum; Soma de (rao 8m todo re#e%endo ar!umento do pr<prio tipo (rao; Su%trao de (rao ,u+tip+i#ao )i?iso Teste de i!ua+dade Teste de desi!ua+dade Teste de maior ou i!ua+ Jue Teste de menor ou i!ua+ Jue Teste de maior Jue Teste de menor Jue Impresso na te+a Rotina de #riao #om entrada de numerador e denominador pe+o te#+ado Con?erso para double Con?erso para lon! Operao de a+terao do numerador Operao de a+terao do denominador Retorno do ?a+or do numerador e denominador Outras operaIes Jue o +eitor 7u+!ar ne#ess6rias
TTPICOS ABOR%A%OS: Construtores em !era+, #riao de m todos de #on?erso de tipos, #.amadas de m todos do mesmo o%7eto, operador i Jue retorna o resto da di?iso de dois inteiros" CONSI%ERASES %E PRO:ETO:

2V

A representao es#o+.ida para o numerador e o denominador da (rao ser6 %aseada no tipo int" O (ormato es#o+.ido para os m todos Jue imp+ementam as operaIes & Hipo.oValor.eUetorno BomedaVperacao"Hipo.oVperando Valor.oVperando%* Nesse (ormato um dos operandos a pr<pria (rao Jue est6 re#e%endo a #.amada de m todo o outro passado #omo ar!umento" Outros (ormatos eJui?a+entes poderiam ter sido adotados" 4m dos poss*?eis (ormatos (a= #om Jue os dois operandos se7am passados #omo ar!umentos e a (rao Jue est6 re#e%endo a #.amada de m todo e5e#uta a operao para esses ar!umentos retornando o ?a+or" Wo+taremos a dis#utir essas a+ternati?as de imp+ementao" Se durante o pro#esso de #onstruo de seu pro!rama, o#orrer a repetio de um #erto tre#.o de #<di!o nos di?ersos m todos 8repetio da rotina de simp+i(i#ao nos m todos de soma, su%trao;, #onsidere a opo de de(inir este tre#.o de #<di!o #omo um m todo em separado" Se este m todo no (or um m todo Jue de?a #ompor, parti#ipar, da inter(a#e, mas Jue ainda assim tem seu padro muito repetido, #onsidere a possi%i+idade de de(ini3+o #omo private 8m todo md#;" No e5iste uma re!ra de ouro Jue di!a e5atamente #omo pro7etar as suas #+asses para Jue e+as preen#.am reJuisitos de porta%i+idade, ro%uste=, (+e5i%i+idade" Toda?ia uma re#omendaIes importantes podem ser (eitas para e?itar re(ormu+aIes durante o pro#esso de pro!ramao& ANo e#onomi=e tempo na (ase de pro7eto" 'ro#ure antes de pro!ramar, simu+ar o uso de uma #+asse, se7a menta+mente ou atra? s de um prot<tipo"C O #6+#u+o do m65imo di?isor #omum 8mdc; de dois inteiros no tem nada a ?er #om as operaIes a serem o(ere#idas por (raIes, teria a ?er #om as operaIes o(ere#idas por um o%7eto (a#i+idades de #6+#u+os 8mdc"aEb% E fatorial"b% E fibonaci",%E combinacoes"nEK% ;" No entanto a #+asse (rao pre#isa da operao mdc" O#orre Jue 76 estudamos uma maneira de imp+ementar um m todo em uma #+asse e no o(ere#H3+o atra? s da inter(a#e, o Jua+i(i#ador private" Em CSS pro?a?e+mente o pro!ramador imp+ementaria mdc #omo uma (uno iso+ada" IMP'EMENTAO:

//HA. fracao. //Pile Pracao.java class Pracao : private int numEden* pri+ate int mdc"int nEint d% : if "nA1% nGQn* if "dA1% dGQd* while "d9G1% : int rGn S d* nGd* dGr* ? return n* //numeradorE denominador //metodo private ma,imo divisor comum //metodo de -uclides FQ 311 anos A#.

//SG6V.GUesto da divisao inteira.

? public Pracao"int tEint m% : numGt* denGm* this.simplifica"%* ? public void simplifica"% : int commd* commdGmdc"numEden%* numGnum/commd* denGden/commd* if "denA1% : denGQden* numGQnum*?* ? //construtor comum

//chamada para o mesmo objeto.

//divide num e den pelo mdc"numEden% //divisor comum //move sinal para cima

//operacoes matematicas basicas public Pracao soma "Pracao j% : Pracao !* !Gnew Pracao""num@j.den%F"j.num@den%Eden@j.den%* return !* ? public Pracao multiplicacao"Pracao j% : Pracao !* !Gnew Pracao"num@j.numEden@j.den%* return !* ? //operacoes de comparacao public boolean i!ual"Pracao t% : return ""num@t.den%GG"den@t.num%%* ? public boolean diferente"Pracao t% : return ""num@t.den%9G"den@t.num%%* ?

]O

public boolean maioroui!ual"Pracao t% : return ""num@t.den%CG"t.num@den%%* ? //operacoes de input output public void mostra"% : &=stem.out.println">"> F num F >/> F den F >%>%* ? //operacoes de conversao de tipos public double convertedbl"% : double dbl* dblG""double%num/"double%den%* return dbl* ? public int converteint"% : int itn!* itn!Gnum/den* return itn!* ? public void altera)num"int nn% : numGnn* ? public void altera)den"int nd% : denGnd* ? public int retorna)num"% : return num* ? public int retorna)den"% : return den* ? ? //converte para double //e,ibe fracao no video

//converte para int

7+

class 'rincipal : public static void main"&trin! ar!s;<% : Pracao aEbEc* aGnew Pracao"5E3%* bGnew Pracao"5EL%* &=stem.out.print">-sta eX a fracao a: >%* a.mostra"%* &=stem.out.print">-sta eX a fracao b: >%* b.mostra"%* cGa.soma"b%* &=stem.out.print">c de aFb: >%* c.mostra"%* &=stem.out.print">a@b: >%* cGa.multiplicacao"b%* c.mostra"%* &=stem.out.print">aFb: >%* cGa.soma"b%* c.mostra"%* &=stem.out.print">aCGb: >%* &=stem.out.println"a.maioroui!ual"b%%* &=stem.out.print">aGGb: >%* &=stem.out.println"a.i!ual"b%%* &=stem.out.print">a9Gb: >%* &=stem.out.println"a.diferente"b%%* &=stem.out.print">"int%a >%* &=stem.out.println"a.converteint"%%* &=stem.out.print">"double%a >%* &=stem.out.println" a.convertedbl"%%* ? ?

//c"aFb%

]/

-sta eN a fracao a: "5/3% -sta eN a fracao b: "+/3% c de aFb: "5/+% a@b: "5/ % aFb: "5/+% aCGb: true aGGb: false a9Gb: true "int%a + "double%a +.LLLL7 !!COMEN;ARIO95 4ma imp+ementao #omp+eta do tipo de dados (rao tem Jue #.e#ar por Ao?er(+oNC do numerador e denominador o Jue o#orre (reJuentemente Juando se tra%a+.a #om n>meros primos entre si 8no podem ser simp+i(i#ados;, uma poss*?e+ so+uo para este pro%+ema (a=er uma apro5imao eEou a+terar a representao interna da (rao para um tipo #om maior numero de %its 8de int para lon!;" )e Jua+Juer (orma estas e5tensIes so e5er#*#ios a?anados pois a >+tima de+as en?o+?e uso de .erana" E<erc9ci"s: => Comp+ete o tipo (rao #om os m todos (a+tantes da As.oppin! +ist approa#.C lon! retorna)den"void% :return den*? lon! altera)den"int a% :denGa*? Considerando Jue os atri%utos de#+arados em private no so a#ess*?eis (ora da #+asse, des#re?a a uti+idade desses m todos" E+es so >teis se usados pe+os pr<prios m todos de (raoX
0

@> Imp+emente o tipo a%strato de dados n>mero #omp+e5o #om as operaIes matem6ti#as inerentes" -aa antes um pro7eto dos m todos Jue sero imp+ementados, des#re?a 8deta+.adamente; as operaIes matem6ti#as ne#ess6rias" Kue (orma de representao ?o#H es#o+.er6& #oordenadas po+ares ou retan!u+aresX

A>

'esJuise so%re matri=es em Java: " Crie um tipo a%strato de dados matri= Jue suporte atri%uiIes e +eituras de # +u+as #ontendo e+ementos do tipo float" Crie outros m todos para este tipo a%strato de dados #omo mu+tip+i#ao por uma #onstante" Imp+emente o tipo a%strato de dados re+<!io, pesJuise as operaIes norma+mente o(ere#idas por re+<!ios reais, o >ni#o o%7eti?o mar#ar as .oras" Se ?o#H pre#isar de inspirao para este e5er#*#io, #onsu+te o e5emp+o da #+asse #ontador e seus e5er#*#ios"

B>

Estes e5er#*#ios so #onsiderados di(*#eis" M re#omend6?e+ somente es%oar o pro7eto de+es e depois, a imp+ementao pode ser dei5ada #omo e5er#*#io das pr<5imas seIes"
0

73

9;RING9+ $M MO%E'O %E C'ASSE A!ora Jue 76 estamos pro!ramando a+!uns tipos a%stratos de dados, est6 na .ora de apresentar um e5emp+o Jue mostre #omo #omportamento importante para um TA)" S< Jue desta ?e= (i#aremos do +ado do #+iente, do usu6rio desse tipo a%strato de dados e no do +ado do pro!ramador" Estudaremos a #+asse &trin! o(ere#ida pe+a +in!ua!em" Nos tutoriais desta s rie, (eitos para outras +in!ua!ens 8CSS, ,odu+a3T;, re#omend6?amos #omo e5er#*#io a imp+ementao do tipo a%strato de dados strin!, Jue de?eria suportar operaIes de #on#atenao, su%strin!, a#esso a e+emento, et#" Este e5er#*#io no (a= sentido em Java porJue o tipo &trin!, (orne#ido #om a +in!ua!em #omo uma #+asse da pa#Ba!e java.lan! Jue importada imp+i#itamente em todos os pro!ramas a+ m disso a sua imp+ementao desta #+asse %astante #omp+eta" A de#+arao de &trin!s se d6 da mesma (orma Jue os outros o%7etos& &trin! minha&trin!* " O #ompi+ador o(ere#e uma (a#i+idade sint6ti#a para a ini#ia+i=ao #om ?a+ores +iterais& &trin! testeGIVla meu ami!oJ* //objeto instanciado com valor Vla meu ami!o 'ara #on#atenar &trin!s use o operador S" Os operandos podem no ser &trin!s, nesse #aso sero #on?ertidos para o%7etos desta #+asse, por e5emp+o se um dos ar!umentos (or um inteiro, o o%7eto &trin! #orrespondente #onter6 o ?a+or +itera+ deste inteiro" &=stem.out.println"teste F I Andre9J%* //Vla meu ami!o Andre9 testeFGI Andre9J* //atalho para concatenacao se!uida de atribuicao: testeGtesteFJ Andre9J &=stem.out.println"teste%* //totalmente e$uivalente a primeira 'ara o%ter o #omprimento em n>mero de #ara#teres de uma &trin!, #.ame o m todo len!th"% para a &trin! em Juesto" 'ara o%ter o #ara#tere presente na posio 2 da &trin!, #.ame o m todo charAt"%* " Note Jue o primeiro #ara#tere da &trin! est6 na posio =ero& char um#harGteste.charAt"L%* //um char recebe ZuN 'ara o%ter uma su%strin!, #.ame o m todo substrin!"int aEint b%* onde o primeiro ar!umento o *ndi#e do in*#io da su%strin! e o se!undo o *ndi#e do (im da su%strin!s, os #ara#teres em a e % tam% m so in#+u*dos& &trin! a&trGteste.substrin!"1E5%* //a&tr recebe ola 'ara trans(ormar todos os #ara#teres de uma &trin! em +etras mai>s#u+as %asta #.amar o m todo to Tpper#ase"%* testeGteste.toTpper#ase"%* //teste fica i!ual a V3A 6-T A68/V 4m m todo interessante para usar em #.e#a!em de padrIes em te5to inde,Vf"&trin! bus$ue%* " Este m todo retorna o *ndi#e posio ini#ia+ de o#orrHn#ia de %usJue na &trin! para a Jua+ (oi #.amado o m todo& teste.inde,Vf"I6-TJ%* //retorna 0 Ana+o!amente, last8nde,Vf"&trin! bus$ue%, retorna o *ndi#e de o#orrHn#ia da su%strin!, s< Jue a!ora do pro#urando do (im para o #omeo" teste.inde,Vf"I6J%* //resulta em "lo!o a se!uir do ultimo A $ue esta na posicao 2% 'ara #omparao de i!ua+dade use& test.e$uals"IV3A 6-T A68/VJ%* //retorna valor booleano A+ m disso, a #+asse &trin! de(ine m todos para #on?erso dos tipos %6si#os para seus ?a+ores na (orma de &trin!E ?o#H pode a#.ar esses m todos um pou#o estran.os, pois e+es tem todos os mesmos nomes e no pre#isam de um o%7eto para serem #.amados, e+es so #.amados para a #+asse& &trin!.valueVf"3%* //ar!umento e naturalmente um inteiroE retorna I3J
]F

&trin!.valueVf"3.+0+5%* //ar!umento e doubleE retorna I3.+0+5J Os m todos de nome valueVf so uma padroni=ao de m todos de #on?erso entre tipos en#ontrados em a+!umas das #+asses pr 3de(inidas na +in!ua!em, prin#ipa+mente nas #+asses ANrappersC Jue (oram e5emp+i(i#adas #om a #+asse 8nte!er"

class &trin!Hest : public static void main "&trin! ar!s;<% : &trin! testeG>Vla meu ami!o>* &=stem.out.println"teste F > Andre9>%* //Vla meu ami!o Andre9 testeFG> Andre9>* //atalho para concatenacao se!uida de atribuicao &=stem.out.println"teste%* //totalmente e$uivalente a primeira char um#harGteste.charAt"5%* //um char receber ZeN &=stem.out.println">Andre >Fum#harFteste.substrin!"3E+3%%* testeGteste.toTpper#ase"%* //teste fica i!ual a V3A 6-T A68/V AB.U-9 for "int iG1*iAteste.len!th"%*iFF% //imprimindo caracteres um a um : &=stem.out.print"teste.charAt"i%%* ? &=stem.out.println"%* //pula uma linha &=stem.out.println"teste.inde,Vf">A68/V>%%* //retorna 2 &=stem.out.println"teste.inde,Vf">biba>%%* //nao achaE retorna Q+ &=stem.out.println"teste.last8nde,Vf">A68/V>%%* //retorna 2 &=stem.out.println"&trin!.valueVf"3.+0+5f%%* //6etodo chamado para a classe ? ? Vla meu ami!o Andre9 Vla meu ami!o Andre9 Andre e meu ami!o V3A 6-T A68/V AB.U-9 2 Q+ 2
75

3.+0+5 !!COMEN;ARIO9 O #<di!o (onte dispon*?e+ #om o #ompi+ador #onstitui uma <tima (onte de aprendi=ado so%re #omo #onstruir #omponentes de so(tNare reuti+i=6?eis no esti+o de pro!ramao orientada a o%7etos, +eia3o sempre Jue esti?er dispon*?e+ e Juando no esti?er, preste ateno na sua inter(a#e" Wo#H de?e ter notado Jue e5#eto pe+o m todo toTpper#ase"% a #+asse &trin! no permite a+teraIes no seu estado depois de ter sido #riada" Isto de#orre da de#iso do AJava teamC de imp+ementar duas #+asses para !arantir a (un#iona+idade e se!urana no uso de strin!s, so e+as& &trin! e &trin!Duffer" &trin!Duffer permite ser modi(i#ada, a%ai5o apresentamos uma ta%e+a de seus prin#ipais m todos, para maiores in(ormaIes #onsu+te a do#umentao de java.lan!"b Ta3e0a de -;t"d"s da c0asse 9trin7Duffer &trin!Duffer enderecoGIhttp://www.java.comJ* //-rro9 -sta facilidade para instancia\]o n]o R permitida para a classe &trin!DufferE ao envRs disso use o construtor descrito abai,o. &trin!Duffer enderecoGnew &trin!Duffer"Ihttp://www.java.comJ%* //a!ora sim estaN correto endereco.append">/fim.html>%* //concatena e atribuiE forma: Ihttp://www.java.com/fim.htmlJ endereco.charAt"5%* //retorna o caractere Z/N &=stem.out.println"endereco F J/outro.htmlJ%* //o operadorF tambem funciona para &trin!Duffer endereco.insert"+5E>soft>%* //forma Ihttp://www.javasoft.com/fim.htmlJ endereco.set#harAt"55ENVN%* //forma Ihttp://www.javasoft.com/fVm.htmlJ &=stem.out.println"endereco.to&trin!"%%* //retorna objeto &trin! e$uivalente E<erc9ci"s& => ,e+.ore um dos e5er#*#ios anteriores introdu=indo um nome para o o%7eto" Este nome pode ir nas sa*das de te+a e5e#utadas pe+o o%7eto e o nome dado para o #onstrutor #omo uma &trin!" No se esJuea de pro?er m todos #omo &trin! !et)name"%" U@> Este um e5er#*#io a?anado" Bus#a de padrIes em te5to uma operao %astante #omum em editores" A %us#a de in(ormaIes na internet Juando (eita por pa+a?ras #.a?e, e5e#utada por ap+i#ati?os Jue podem ter #omo estrat !ia a #onta!em do n>mero de o#orrHn#ias de #ertas pa+a?ras nos te5tos #adastrados" Neste e5er#*#io ?o#H (ar6 parte desse tra%a+.o de %us#a de in(ormaIes, eu ?ou te orientar #omo& Crie um m todo Jue a#eita #omo ar!umento uma &trin! !rande Jue pode ter ?indo de ?6rias (ontes 8no importa Juais;" Este m todo pode perten#er a uma #+asse de nome -statisticas.eHe,to e de?e Jue%rar o ar!umento &trin! em pa+a?ras separadas por espaos 8?o#H 76 pode (a=er isso #om os m todos #on.e#idos, mas ta+?e= Jueira usar a #+asse &treamHoKeni4er;" 'ara #ada uma destas pa+a?ras este m todo (a= uma %us#a na estrutura de arma=enamento de pa+a?ras da #+asse, se a pa+a?ra no #onstar, de?e ser in#+u*da #om mu+tip+i#idade 0, #aso e+a #onste na estrutura, apenas sua mu+tip+i#idade de?e ser in#rementada"

]2

4m pro%+ema pode sur!ir" A estrutura de?e ser #apa= de #res#er de taman.o durante as ?6rias #.amadas de m todos #om Strin!s para serem pro#essadas" Se ?o#H usar ?etor uma opo rea+o#ar o ?etor #om o do%ro de espaos" Outra opo usar uma +ista +i!ada" A> Crie uma #+asse Jue a!re!a um stream de entrada de dados +i!ado ao te#+ado" Co+oJue esta #+asse #omo intermedi6ria na re#epo dos dados de modo Jue e+a testa para todo #ara#tere +ido se e+e i!ua+ ao #ara#tere ckn:" Se o #ara#tere +ido (or i!ua+ a ckn: e+e de?e ser retirado da &trin! +ida 8use os m todos su%strin! e #on#atenao ensinados;" -aa #om Jue a #.amada do m todo readline de sua #+asse dispare o a #.amada do m todo readline do stream a!re!ado ne+a" Resumindo & sua #+asse atuar6 #omo um (i+tro de dados do te#+ado" ,antendo a ana+o!ia do e5emp+o introdut<rio so%re &treams, estaremos +idando #om #one5Ies entre #anos, ou se7a para os dados #.e!arem do te#+ado ao seu pro!rama e+es de?em passar pe+a sua #+asse (i+tro" TA% E A'OCAO %INVMICAN Este e5emp+o #ria um tipo a%strato de dados matri= %idimensiona+ de inteiros "int%" O +eitor pode a#.ar estran.o Jue para representar esta matri= usamos um ?etor, mas Jue isto tra= a+!umas ?anta!ens& Re/rese2ta78" 0i2ear de 5-a -atriG: 'ode3se representar uma matri= de Jua+Juer dimenso em um ?etor" We7a o e5emp+o de uma matri= %idimensiona+ de inteiros mostrada no (ormato indice3inear:valorArma4enado. Os *ndi#es +ineares ?o de + at n5. ,atri=& 0&T /&T/ F&/T U&1O ]&/0 V&OV T&0 2&0/ 1&T/ U&1O 2&0/ ]&/0 V&OV 1&T/

Wetor eJui?a+ente& 0&T /&T/ T&0 F&/T

Wanta!em da representao +inear 8?etor;& para re(eren#iar uma posio !asta3se somente um inteiro #ontra dois da representao matri=" 'ode3se #onsiderar posiIes Jue apontam para outras posiIes, %asta interpretar o #onte>do do ?etor #omo um *ndi#e +inear" Este tipo de #onstruo pode ser >ti+ em Java, pois a +in!ua!em no possui ponteiros este um dos moti?os de estarmos ensinando esta t #ni#a" )es?anta!em da representao +inear 8?etor;& ne#ess6rio #riar (unIes de #on?erso de *ndi#e na (orma 8+in.a,#o+una; para 8*ndi#e +inear; e de 8*ndi#e +inear; para 8#o+una; ou 8+in.a;" So as (unIes lin e col e linear deste e5emp+o" Em uma primeira +eitura, no pre#iso entender os #6+#u+os #om *ndi#es, apenas o uso dos m todos Jue o(ere#em estes #6+#u+os" 'ara n<s, #+ientes da #+asse 6atri45.8ntE os e+ementos sero inde5ados de + at m 8ar%itr6rio; em termos de *ndi#e +inear" Em termos de +in.as e #o+unas, e+es sero inde5ados de 80,+ma5; e de 80,#ma5;"

77

O (ato da +in!ua!em adotar *ndi#es de 1 at mQ+ para matri=es e ?etores no importa, n<s #onstru*mos em ?o+ta dessa representao para Jue nosso o%7eto (ornea, tra%a+.e na #on?eno mais natura+ de inde5ao para .umanos& + atR m" Kuanto as operaIes de *ndi#es, apenas ?eri(iJue a ?era#idade para ?a+ores ar%itr6rios de uma matri= #omo a desen.ada anteriormente tentar entendH3+as +e?a tempo e eu sei Jue ?o#H #apa= de pro!rama3+as" )entre os o%7eti?os de um pro!ramador de uma +in!ua!em orientada a o%7etos podemos #itar& es#re?er pou#o #<di!o, es#re?er #<di!o #orreto, tornar o seu #<di!o reuti+i=6?e+" A #riao de #omponentes de so(tNare reuti+i=6?eis, enormemente (a#i+itada pe+a porta%i+idade da +in!ua!em Java" 'ro!ramas e5emp+o posteriores 8se!unda parte; mostraro #omo reuti+i=ar esta #+asse matri= para a #riao de um 7o!o de Jue%ra #a%ea de Juadradin.os des+i=antes" Os Juadradin.os de?em ser mo?idos na mo+dura de modo a (ormar uma ima!em onde um dos Juadrados ?a=io" SHOPPING 'IST APPROACH PARA O TA% MATRIP@%I2t:
8As operaIes imp+ementadas esto mar#adas #om " As operaIes mar#adas #om de?em ser imp+ementadas #omo e5er#*#io a?anado #u7o o%7eti?o #omp+etar um de seus primeiros #omponentes de so(tNare reuti+i=6?e+, estamos in#+uindo desta ?e= os atri%utos tam% m;"

private private private private

int linhas* //numero de linhas da matri4 int colunas* //numero de colunas da matri4 int tam* //Glinhas@colunas int lc;<* //Gnew int;linhas@colunas<Gvetor;1.."tamQ+%<G~matri4;l<;c<

Construtor 8re#e%e dois ar!umentos num ri#os inteiros, n>mero de +in.as e de #o+unas; Con?erso de +in.a e #o+una para *ndi#e +inear Con?erso de *ndi#e +inear para #o+una" Con?erso de *ndi#e +inear para +in.a" Operao de tro#a de e+ementos da matri= #om dois ar!umentos do tipo *ndi#e +inear" Operao de tro#a de e+ementos da matri= #om ar!umentos do tipo 8+in.a e #o+una;" Operao de atri%uio a e+emento da matri= indi#ado por *ndi#e +inear" Operao de atri%uio a e+emento da matri= indi#ado por +in.a e #o+una" Operao de retorno do #onte>do de posio da matri= indi#ada por um *ndi#e +inear" Operao de retorno do #onte>do de posio da matri= indi#ada por +in.a e #o+una" Representao do n>mero de #o+unas, permitindo a#esso de +eitura ao #+iente" Representao do n>mero de +in.as, permitindo a#esso de +eitura ao #+iente"
'ro!rama e5emp+o da #+asse ,atri=/)Int" class 6atri45.8nt : private int linhas* //numero de linhas da matri4 private int colunas* //numero de colunas da matri4 private int tam* //Glinhas@colunas private int lc;<* //Gnew int;linhas@colunas<Gvetor;1.."tamQ+%<G~matri4;l<;c< public 6atri45.8nt"int lEint c% //cria matri4 3,# :
]V

lcGnew int;l@c<* //lEc dimensoes * lc vetor;l@c< linhasGl* colunasGc* tamGlinhas@colunas* ? //$ual$uer uma das funcoes abai,o retorna int ne!ativo se nao obteve sucesso public int linear"int alinEint acol% //ind linear a partir de linha e coluna //nao modifica nenhum atributo : int result* //valor de retorno para todos os metodos ... if " "1Aalin% ^^ "alinAGlinhas% ^^ "1Aacol% ^^ "acolAGcolunas% % : resultG"alinQ+%@colunasFacol* ? else : resultGQ+* ? return result* ? public int col"int indlin% //coluna a partir do indice linear //nao modifica nenhum atributo da classe : int result* if " "1Aindlin% ^^ "indlinAGtam% % : resultG"indlin S colunas%* if "resultGG1% : resultGcolunas* ? ? else : resultGQ+* ? return result* ? public int lin"int indlin% //linha a partir do indice linear //nao modifica nenhum atributo da classe : int result* if " "1Aindlin% ^^ "indlinAGtam% % : resultG"int%" " "indlinQ+%/colunas %F+ else : resultGQ+* ? return result* ?

%* ?

public boolean trocaindlin"int iEint j% //ar!umentos: 5 indices lineares // retorna se conse!uiuEou nao conse!uiu"false% : int au,* //au,iliar na troca if " "1Ai% ^^ "iAGtam% ^^ "1Aj% ^^ "jAGtam% % : au,Glc;iQ+<* //efetua a troca lc;iQ+<Glc;jQ+<* //embora para usuario a matri4 vai de + ate l@c lc;jQ+<Gau,* //para mim vai de o ate l@cQ+ return true* //sucesso ? else : return false* ? //falhou ? public boolean atribuiindlin"int iEint v% //atribui v ao indice i //retorna true se conse!uiuE false nao conse!uiu : if " "1Ai% ^^ "iAGtam% % : lc;iQ+<Gv* //efetua a atribuicao return true* ? else : return false* ? //falhou ? public int retornaindlin"int indlin% //retorna conteudo do indice i //retorna Q+ se nao conse!uiu : int result* if " "1Aindlin% ^^ "indlinAGtam% % : resultGlc;indlinQ+<* ? else : resultGQ+* ? return result* ? public int !etl"% //retorna numero de linhas :

VO

return linhas* ? public int !etc"% //retorna numero de colunas : return colunas* ? public int !ett"% //retorna tamanho : return tam* ? ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : 6atri45.8nt teste* testeGnew 6atri45.8nt"5E+1%* //5 linhas +1 colunas for"int iG+*iAteste.!ett"%*iFF% :teste.atribuiindlin"iE1%* ? &=stem.out.println">linear"5E5%G>F teste.linear"5E5% %* &=stem.out.println">Atribuindo 5 a posicao "5E5%>%* teste.atribuiindlin"teste.linear"5E5%E5%* &=stem.out.println">Atribuindo 0 a posicao "0E5%>%* teste.atribuiindlin"teste.linear"0E5%E0%* &=stem.out.println">Hrocando estas posicoes>%* teste.trocaindlin"teste.linear"5E5%Eteste.linear"0E5%%* &=stem.out.println">#onteudo da posicao "5E5%:>Fteste.retornaindlin"teste.linear"5E5%%%* ? ? linear"5E5%G05 Atribuindo 5 a posicao "5E5% Atribuindo 0 a posicao "0E5% Hrocando estas posicoes #onteudo da posicao "5E5%:0 MatriGes de i2idas 2a 0i2g5age-:
2+

As matri=es de(inidas pe+a +in!ua!em se!uem uma sinta5e de de#+arao e uso seme+.ante a sinta5e de ?etores& int custos;<;<Gnew int ;51E31<* //vinte por trintaE nao importa $ual e linha $ual e coluna custos;1<;1<G+05* int aGcustos;1<;1<* C5ri"sidade: @ou?e um #aso de ?*rus na internet Jue se %asea?a no a#esso a *ndi#es (ora de um ?etor para !ra?ar por #ima de instruIes do sistema opera#iona+ o #<di!o Jue !arantisse a sua mu+tip+i#ao" No por a#aso, Java, impede o a#esso a posiIes (ora do ?etor" %ica de /r"gra-a78": Sai%a Jue uma pr6ti#a %astante >ti+ na (ase de testes de um pro!rama introdu=ir mensa!ens in(ormati?as em pontos #on?enientes" Kuando tra%a+.ando #om o%7etos ta+ pr6ti#a pode ser usada de ?6rios modos, por e5emp+o pode3se inserir uma mensa!em no #onstrutor de uma #+asse para ?eri(i#ar Juando os o%7etos so #riados e se so #riados #orretamente" E<erc9ci"s: 03 ,e+.ore a #+asse matri= para a#eitar nas suas (unIes ar!umentos do tipo 8+in.a,#o+una; e no s< *ndi#es +ineares" @> Note Jue no (oram impostas restriIes para *ndi#es in?6+idos da matri= de modo Jue nosso #omponente de so(tNare (a+.a se no usado #orretamente" Adote uma estrat !ia de dete#o de *ndi#es in?6+idos e use3a de modo a e?itar o tra?amento do pro!rama" Weremos #omo (a=er esta #.e#a!em de *ndi#es de (orma se!ura e uni(orme em A E5#eption .and+in!C" A> Imp+emente um m todo #.amado ordena para o tipo a%strato de dados matri= de(inido a#ima" 4se Jua+Juer a+!oritmo de ordenao para dei5ar a matri= ordenada #omo um ?etor Jue%rado em ?6rias +in.as" )e Jue (orma a (a#i+idade Jue a inter(a#e o(ere#e de en5er!ar a matri= #omo um ?etor (a#i+ita este pro#essoX Ser6 Jue este m todo ordena rea+mente impres#ind*?e+ para esta #+asseX Os m todos #riados at o momento 76 no (ormam um mode+o #omputa#iona+ su(i#iente para Jue o #+iente desta #+asse possa de(inir em seu #<di!o os m todos de ordenao de matri=es Jue dese7arX A d>?ida so%re a ne#essidade ou no de um m todo em uma #+asse %astante (reJuente" Quardadas as de?idas proporIes, pro!ramao orientada a o%7etos #omo %rin#ar #om %+o#os de en#ai5ar, ou +e!os" E5istem %+o#os Jue no se en#ai5am, e5istem %+o#os Jue podem ser #onstru*dos atra? s de outros menores, mas Jue ainda sim e5istem porJue so %astante usados, e a tare(a de #ompo3+os a partir de outros %+o#os torna3se in#on?eniente" E5istem %+o#os sem os Juais no se pode #onstruir prati#amente nada" B> Crie um m todo de nome preenche, Jue ini#ia+i=a todas as posiIes da matri= #om o ?a+or de um de seus ar!umentos" Este m todo pode ser #omposto pe+os m todos 76 imp+ementadosX
V/

UC> )e(ina um pro!rama #.amado !randes Jue imp+ementa o tipo a%strato de dados n>meros !randes e inteiros, este tipo de?e usar um ?etor do tipo num ri#o Jue ?o#H a#.ar #on?eniente para representar os a+!arismos" Ta+?e= estudar #ir#uitos +<!i#os 8somadores, mu+tip+i#adores; o a7ude a imp+ementar as Juatro operaIes matem6ti#as %6si#as para estes tipo em termos de A+ooB a.ead #arrierC e outras t #ni#as de per(orman#e de imp+ementao de operaIes" Se sua preo#upao #om e(i#iHn#ia e espao, ?o#H pode usar #ada posio do ?etor para representar mais de um d*!ito, mas .a?er6 muito tra%a+.o em termos de tratar o?er(+oN e under(+oNs" D> Note Jue na a+o#ao da matri=& public 6atri45.8nt"int lEint c% , no #.e#ado se os ?a+ores passados so maiores Jue O, (aa este teste" Kuando e5p+i#armos Ae5#eption .and+in!C ?o#H ter6 m todos me+.ores de +idar #om esses AerrosC"

23

HERANA E5iste uma ?iso um pou#o ta#an.a de orientao a o%7etos #omo uma simp+es maneira de or!ani=ar me+.or o seu #<di!o" Essa ?iso (a#i+mente desmentida pe+os #on#eitos de en#apsu+amento, inter(a#es, pa#Ba!es e outros 76 apresentados" Neste t<pi#o apresentaremos o #on#eito de .erana, (undamenta+ para pro!ramao orientada a o%7etos e um dos (atores de su#esso desta #omo muito mais Jue uma simp+es maneira de or!ani=ar me+.or seu #<di!o" 4m dos aspe#tos Jue distin!uem o%7etos de pro#edimentos e (unIes Jue o tempo de e5istHn#ia de um o%7eto pode ser maior do Jue o do o%7eto Jue o #riou" Isto permite Jue em sistemas distri%u*dos o%7etos #riados em um +o#a+, se7am passados atra? s da rede para outro +o#a+ e arma=enados +6 Juem sa%e na mem<ria ou mesmo em um %an#o de dados" C5ri"sidade: E5istem #+asses Jue podem ser o%tidas na Internet para (a=er inter(a#e #om %an#os de dados SK9, ser?indo prin#ipa+mente para (a#i+itar esta (a#eta da pro!ramao na internet Jue %astante +imitada pe+as restriIes de se!urana da +in!ua!em" HIERAR#$IAS %E TIPOS Neste t<pi#o mostraremos #omo #onstruir .ierarJuias de tipo por !enera+i=ao E espe#ia+i=ao" 'ara entender o Jue !enera+i=ao espe#ia+i=ao e as re!ras de atri%uio entre e+ementos dessas .ierarJuias, a#ompan.e a se!uinte #omparao& Se ?o#H ?ai a um restaurante e pede o prato de (rutos do mar, natura+ Jue ?o#H a#eite uma +a!osta #om #atupiry, ou ento (i+ de %ade7o" ,as se o !arom +.e ser?e uma sa+ada de tomates isto no se en#ai5a no pedido" 'or outro +ado, se o seu pedido (or pei5e, uma +a!osta #om #atupiry, em%ora muito sa%orosa no ser?e mais0, assim #omo a sa+ada" Note Jue pei5e e +a!osta so espe#ia+i=aIes de (rutos do mar" Qenera+i=ao e Espe#ia+i=ao so (erramentas para +idar #om #omp+e5idade, e+as so a%straIes" Os sistemas do mundo rea+ apresentam #omp+e5idade muito maior Jue ordenar um prato +istado em um #ard6pio" O uso de !enera+i=ao e espe#ia+i=ao permite #ontro+ar a Juantidade de deta+.es presente nos seus mode+os do mundo rea+, permite #apturar as #ara#ter*sti#as essen#iais dos o%7etos e tratar os deta+.es de (orma muito mais or!ani=ada e !radua+" E5iste muito mais para (a+ar so%re .erana, prin#ipa+mente no Jue di= respeito a po+imor(ismo de in#+uso e a#op+amento dinLmi#o de mensa!ens, t<pi#os estes Jue sero a%ordados em separado" $MA HIERAR#$IA SIMP'ESN Construiremos uma .ierarJuia de tipos simp+es para demonstrar .erana p>%+i#a em Java"

+a!osta #rust6#eo no pei5e"

VF

C"-e2t!ri"s: O dia!rama a#ima representa a .ierarJuia de #+asses imp+ementada neste e5emp+o e (oi o%tido a partir da 7ane+a de edio de uma (erramenta #ase para pro!ramao orientada a o%7etos" A #+asse ponto Jue est6 no topo da .ierarJuia #.amada de #+asse %ase, enJuanto Jue as #+asses ponto)reflete e ponto)move so #.amadas #+asses (i+.as ou .erdeiras" As #+asses da .ierarJuia so simp+es, ponto)move apresenta o m todo move, 76 a%ordado neste tutoria+ em , ponto)reflete apresenta o m todo 8reflete; Jue in?erte o sina+ das #oordenadas" )ada a simp+i#idade das #+asses o +eitor poderia se per!untar, porJue no 7untar as trHs em uma s<" A per!unta (a= sentido, mas e se Juis ssemos #riar uma #+asse 'onto Jue no se mo?esse, apenas re(+etisse e outra Jue s< se mo?esseX E se Juis ssemos pro7etar nosso pro!rama se!undo uma .ierarJuia de espe#ia+i=ao E !enera+i=ao da #+asse 'ontoX O e5emp+o mostra #omo (a=H3+o" Na .erana as #+asses (i+.as passam a atender pe+os mesmos m todos e atri%utos public da #+asse pai, as #+asses (i+.as podem a#res#entar m todos, atri%utos e at rede(inir m todos .erdados 8?eremos mais tarde;" 'or isso Jue se di= Jue as #+asses su%#+asses !arantem pe+o menos o #omportamento A%e.a?iourC das super#+asses, podendo a#res#entar mais #ara#ter*sti#as" Os atri%utos en#apsu+ados 8private; da #+asse pai no so a#ess*?eis diretamente na #+asse (i+.a a no ser Jue se7am Jua+i(i#ados #omo protected ou public, ?e7a " )ia!rama de a#esso, ?isi%i+idade, dos e+ementos da #+asse pai para uma #+asse (i+.a ou .erdeira" Os atri%utos e m todos da #+asse pai so #+assi(i#ados Juanto ao en#apsu+amento" A parte som%reada si!ni(i#a no ?is*?e+, en#apsu+ado" bAs duas so #onsideradas #omo sendo do mesmo pa#Ba!e" '4B9IC 'RIWATE 'ROTECTE) A'AC^AQECb

C"2str5t"res e Mera27a: No #onstrutor de uma #+asse (i+.a o pro!ramador pode in#+uir a #.amada do #onstrutor da #+asse pai e5istente ne+a" 'ara re(eren#iar a #+asse pai use a ABeyNord A super de modo ana+o!o a this "objeto corrente%" @ierarJuia de !enera+i=ao e espe#ia+i=ao" //#lasse 'onto class 'onto :

25

pri+ate float ,E=* public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void iniciali4a"float aEfloat b% : this.,Ga* this.=Gb* ? public float retorna),"% : return ,* ? public float retorna)="% : return =* ? public void altera),"float a% : this.,Ga* ? public void altera)="float b% : this.=Gb* ? public void mostra"% : &=stem.out.println" >"> F this., F >E> F this.= F >%> %* ? ? //#lasse 'to6ove class 'to6ove e,tends 'onto : //adicione al!um atributo private se $uiser

V2

public 'to6ove"float aEfloat b% : *uper(a6b) !!c4a%a"a "o con*trutor "a cla**e pai ? public void move"float d,Efloat d=% : t4i*,altera=#(retorna=#()-"#) t4i*,altera=$(retorna=$()-"$) ? ? //#lasse 'toUeflete class 'toUeflete e,tends 'onto : //adicione al!um atributo private se $uiser public 'toUeflete"float aE float b% //construtor : *uper(a6b) !!c4a%a"a "e con*trutor "a cla**e pai ou *upercla**e ? void reflete"% //troca o sinal das coordenadas : t4i*,altera=#(2retorna=#()) t4i*,altera=$(2retorna=$()) ? ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : 'toUeflete p+Gnew 'toUeflete"3.+0fE5.75f%* &=stem.out.println">#riando 'ontoUeflete em 3.+0E5.75>%* p+.reflete"%* &=stem.out.println">Uefletindo este ponto.>%* p+.mostra"%* 'to6ove p5Gnew 'to6ove"+.1fE+.1f%*
27

&=stem.out.println">#riando 'onto6ove em +.1E+.1>%* p5.move".5fE.5f%* &=stem.out.println">6ovendo este ponto de 1.5E1.5>%* p5.mostra"%* ? ? #riando 'ontoUeflete em 3.+0E5.75 Uefletindo este ponto. "Q3.+0EQ5.75% #riando 'onto6ove em +.1E+.1 6ovendo este ponto de 1.5E1.5 "+.5E+.5% !!COMEN;ARIO9 Os atri%utos , e = da #+asse 'onto esto de#+arados #omo private" 'e+o dia!rama anterior ao pro!rama, atri%utos private no so ?is*?eis aos des#endentes na .ierarJuia" E de (ato n<s a+teramos esses atri%utos 8re(+ete e mo?e; atra? s de #.amadas a m todos public da #+asse pai, #.amadas de m todos Jue imp+iJuem em a#esso indireto a atri%utos da mesma #+asse pare#em ser um pou#o ine(i#ientes" 9em%re3se Jue os m todos public sempre so ?is*?eis" N"ta a"s /r"gra-ad"res C..: Java no permite .erana private, a #+ausu+a e,tends eJui?a+e a .erana p>%+i#a de CSS e s<" 'ara o%ter o e(eito de .erana private use a!re!ao" E<erc9ci"s: => 'ro!rame e teste a .ierarJuia representada a%ai5o&

A #+asse (orma no tem um si!ni(i#ado pr6ti#o, uma a%strao, ?o#H no pode desen.ar 8mostrar; uma (orma, no entanto neste pro!rama ?o#H poder6 instan#i63+a" Esta #+asse est6 na
VV

.ierarJuia, somente para #apturar as #ara#ter*sti#as #omuns a 'onto e Uetan!ulo" Em aprenderemos #omo de(inir estas #+asses a%stratas de (orma mais #ondi=ente #om o paradi!ma de orientao a o%7etos" O m todo mostra de?e imprimir na te+a os atri%utos destas #+asses" PRO;EC;ED Kuando ?imos o t<pi#o en#apsu+amento, (oi men#ionado Jue private era o modo de en#apsu+amento mais restriti?o, se!uido de protected, pacKa!e e depois public 8o mais a%erto;" NaJue+e t<pi#o mostramos um e5emp+o para #ada tipo de en#apsu+amento, e5#eto protected Jue depende da e5istHn#ia de uma .ierarJuia para ser demonstrado" I!ua+ ao e5emp+o anterior, mas a!ora tornando os atri%utos da #+asse pai a#ess*?eis para as #+asses (i+.as atra? s do uso de protected. 'rotected dei5a os atri%utos da #+asse pai ?is*?eis, a#ess*?eis A.ierarJuia a%ai5oC" ,as para o restante do pro!rama tem o mesmo e(eito Jue private" Outra (rase so%re prote#ted& AA .erana permite Jue uma su%#+asse !an.e a#esso a de#+araIes protected de sua super#+asse, mas o usu6rio no per#e%e isso, para o usu6rio 8uma #+asse e5terna; o Jue #ontinua e5istindo o Jue publicC" )ia!ramas de a#esso, ?isi%i+idade, de atri%utos e m todos de uma #+asse pai para uma #+asse (i+.a ou .erdeira& 'ara uma #+asse (i+.a em outro pa#Ba!e 8?o#H .erdando de uma #+asse pronta em Ja?a; 'RIWATE 'ROTECTE) A'AC^AQEC '4B9IC O Jue o restante do pro!rama ?H das de#+araIes da #+asse pai na #+asse (i+.a" 8por restante do pro!rama entenda& outros pa#Ba!es e outras .ierarJuias; 'RIWATE 'ROTECTE) A'AC^AQEC '4B9IC

O mesmo e5emp+o s< Jue usando protectedN //#lasse 'onto class 'onto : protecte" float ,E=* public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? public void iniciali4a"float aEfloat b% :
2

this.,Ga* this.=Gb* ? public float retorna),"% : return ,* ? public float retorna)="% : return =* ? public void altera),"float a% : this.,Ga* ? public void altera)="float b% : this.=Gb* ? public void mostra"% : &=stem.out.println" >"> F this., F >E> F this.= F >%> %* ? ? //#lasse 'to6ove class 'to6ove e,tends 'onto : //adicione al!um atributo private se $uiser public 'to6ove"float aEfloat b% : *uper(a6b) ? public void move"float d,Efloat d=% : #&#-"# !!aIui continua% ace**i+ei*6 e% %ain nao $&$-"$ !!ace**o "ireto6 *e% pa**ar por %eto"o ?
1O

? //#lasse 'toUeflete class 'toUeflete e,tends 'onto : //adicione al!um atributo private se $uiser public 'toUeflete"float aE float b% : super"aEb%* //chamando o construtor da classe pai ? void reflete"% : ,GQ,* =GQ=* ? ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : 'toUeflete p+Gnew 'toUeflete"3.+0fE5.75f%* &=stem.out.println">#riando 'ontoUeflete em 3.+0E5.75>%* p+.reflete"%* &=stem.out.println">Uefletindo este ponto.>%* p+.mostra"%* 'to6ove p5Gnew 'to6ove"+.1fE+.1f%* &=stem.out.println">#riando 'onto6ove em +.1E+.1>%* p5.move".5fE.5f%* &=stem.out.println">6ovendo este ponto de 1.5E1.5>%* p5.mostra"%* ? ? #riando 'ontoUeflete em 3.+0E5.75 Uefletindo este ponto. "Q3.+0EQ5.75% #riando 'onto6ove em +.1E+.1
+

6ovendo este ponto de 1.5E1.5 "+.5E+.5% O Jua+i(i#ador protected termina #om os modos de en#apsu+amento de atri%utos e m todos, portanto (aremos uma re?iso (ina+, uti+i=e os n>meros dessa ta%e+a para #.e#ar ?isua+mente o tipo de en#apsu+amento no dia!rama a se!uir" Wo#H ?ai aprender a o+.ar para este dia!rama e en5er!ar tudo o Jue aprendemos nesse assunto, os atri%utos e m todos Jue estamos preo#upados em en#apsu+ar so os da #+asse mais es#ura& MO%O F;private 'IMITE %E &ISIBI'I%A%E a Este o n*?e+ de en#apsu+amento mais restriti?o" A ?isi%i+idade das de#+araIes +imita3se ao en?o+t<rio da #+asse" 3% protected Representao no dia!rama& A ?isi%i+idade das de#+araIes se +imita pr<pria a .ierarJuia a%ai5o da #+asse es#ura" #+asse e as #+asses .erdeiras de+a" /;Nada Representao no dia!rama& A ?isi%i+idade das de#+araIes se +imita a pr<pria espe#i(i#ado retLn!u+o en?o+?endo as #+asses #+asse e as #+asses do mesmo pa#Ba!e, mas no es Apa#Ba!eC pintadas" #+asses .erdeiras, " C+asses .erdeiras no pre#isam ser do mesmo pa#Ba!e" + %public Representao no dia!rama& Estas de#+araIes so sempre a#ess*?eis" todas as #+asses" REPRESENTAO Representao no dia!rama& pr<pria #+asse es#ura"

O dia!rama a#ima mostra as 6reas de ?isi%i+idade de #ada tipo de modi(i#ador ap+i#ado aos atri%utos da #+asse desta#ada" Os retLn!u+os !randes, representam os pa#Ba!es, optamos por #onstruir a .ierarJuia da esJuerda dentro do mesmo pa#Ba!e o Jue nem sempre (eito" Norma+mente Juando ?o#H estende uma #+asse das pa#Ba!es Jue ?em #om a +in!ua!em, sua #+asse .erdeira no perten#e a aJue+a pa#Ba!e, mas perten#e a .ierarJuia, saindo (ora dos retLn!u+os maiores #omo na .ierarJuia da direita" Supon.a Jue todas as #+asses so de#+aradas #omo public" E5istem a+!umas de#+araIes de Jua+i(i#adores de atri%utos Jue no (a=em sentido #om #+asses private e so erros de #ompi+ao.

1/

RE%EFINIO %E MLTO%OS HER%A%OS 4ma #+asse (i+.a pode (orne#er uma outra imp+ementao para um m todo .erdado, #ara#teri=ando uma rede(inio Ao?erridin!C de m todo" Importante& o m todo de?e ter a mesma assinatura 8nome, ar!umentos e ?a+or de retorno;, seno no se trata de uma rede(inio e sim so%re#ar!a Ao?er+oadin!C" A rede(inio !arante Jue o m todo ter6 o mesmo #omportamento Jue o anterior isto (a= #om Jue as su%#+asses possam ser atri%u*das a ?ari6?eis da super#+asse pois atendem a todas as operaIes desta" Este e5emp+o i!ua+ ao e5emp+o anterior, mas a!ora rede(inindo o m todo mostra para a #+asse (i+.a 'toUeflete" Na ?erdade este e5emp+o de?eria perten#er ao t<pi#o de po+imor(ismo, #ontudo, nos e5emp+os se!uintes usaremos tam% m rede(iniIes de m todos, portanto (a=3se ne#ess6rio introdu=i3+o a!ora" Teremos mais e5p+i#aIes so%re o assunto" No nosso e5emp+o a #+asse 'toUeflete rede(ine o m todo mostra da #+asse pai, enJuanto Jue a #+asse .erdeira 'to6ove a#eita a de(inio do m todo mostra dada pe+a #+asse 'onto Jue sua #+asse pai"

//8nsira a$ui o ar$uivo da classe 'onto do e,emplo anterior: 'UVH-#H-.

//8nsira a$ui o ar$uivo da classe 'to6ove do e,emplo anterior: 'UVH-#H-.

//#lasse 'toUeflete class 'toUeflete e,tends 'onto : //adicione al!um atributo private se $uiser public 'toUeflete"float aE float b% : super"aEb%* //chamando o construtor da classe pai ? public +oi" %o*tra() 0 9$*te%,out,println( :N5: - t4i*,# - : O5: - t4i*,$ ) 1 void reflete"% : ,GQ,* =GQ=* ?
3

? //8nsira a$ui o ar$uivo da classe 'rincipal do e,emplo anterior: 'UVH-#H-. !!COMEN;ARIO9 No #aso de rede(inio de m todos, a %us#a da imp+ementao do m todo a ser e5e#utado o#orre de %ai5o para #ima na .ierarJuia" E5emp+o& se ?o#H tem um o%7eto 'toUeflete e #.ama o m todo retorna),"% para e+eE primeiro o #ompi+ador pro#ura se 'toUeflete possui ou no uma imp+ementao para este m todo, no #aso no possui, ento a %us#a (eita nos m todos public da super#+asse, onde a imp+ementao de retorna),"% a#.ada"

E<erc9ci"s: => Teste rede(inio de m todos #o+o#ando ASystem"out:sC em m todos da .ierarJuia, tais #omo& &=stem.out.println"I6etodo redefinido na classe OE chamado.J% * INTERFACES+ $MA A'TERNATI&A PARA HERANA MW'TIP'A
@erana m>+tip+a&

@erana m>+tip+a a #apa#idade de uma #+asse .erdar de duas ou mais #+asses, por e5emp+o a #+asse radio3re+<!io .erdar da #+asse r6dio e da #+asse re+<!io" CSS apresenta .erana m>+tip+a, e tam% m maneiras de tratar os pro%+emas de#orrentes de seu uso" 4m dos pro%+emas Jue podem sur!ir o #on(+ito de nomes de atri%utos ou m todos .erdados desse tipo de .erana" 4ma das estrat !ias adotadas para reso+?er estes #on(+itos o Arenamin!C ou renomeamento desses nomes i!uais presentes nas super#+asses" Tendo o se!uinte si!ni(i#ado& A #+asse .erdeira tem #omportamento, A%e.a?iourC, seme+.ante ao das duas #+asses pais" 4m outro e5emp+o de inter(a#e seria a #+asse audio3?*deo Jue .erda da #+asse audio e da #+asse
1F

?*deo" Java por moti?os de simp+i#idade, a%andona a id ia de .erana m>+tip+a, #edendo +u!ar ao uso de inter(a#es" Inter(a#es so um #on7unto de m todos e #onstantes 8no #ont m atri%utos;" Os m todos de(inidos na inter(a#e so Ao#osC ou despro?idos de imp+ementao" C+asses podem di=er Jue imp+ementam uma inter(a#e, esta%e+e#endo um #ompromisso, uma esp #ie de #ontrato, #om seus #+ientes no Jue se re(ere a pro?er uma imp+ementao para #ada m todo da re(erida inter(a#e"" Ao #+iente, pode ser dada a de(inio da inter(a#e, e+e a#a%a no sa%endo o Jue a #+asse , mas sa%e o Jue (a=" Kuem pro!rama em O%7e#ti?e C, de?e ?er as inter(a#es #omo a+!o seme+.ante ao #on#eito de proto#o+os" Neste e5emp+o usaremos uma inter(a#e de nome imprim*?e+ para #apturar as #ara#ter*sti#as #omuns as #+asse Jue podem ser imprimidas em a+!um dispositi?o de sa*da de dados" Inter(a#es public interface I%pri%i+el : //alem das classesE so interfaces pode ocupar um ar$uivo final char nlinGXMnX* //nova linha public &trin! to&trin!"%* //forma preferida para impressao na tela public void to&=stemVut"%* ? public class 'roduto i%ple%ent* I%pri%i+el : //um produto comercial $ual$uer protected &trin! descricao* protected int $uantidade* public 'roduto"&trin! dEint $% : descricaoGd* $uantidadeG$* ? public &trin! to&trin!"% : return new &trin!"> >FdescricaoF> >F$uantidade%* ? //forma preferida para impressao na tela public void to&=stemVut"% : &=stem.out.print"descricao F $uantidade%* ? ?

//#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : 'roduto umpGnew 'roduto">macarrao>E +11%* ump.to&=stemVut"%* &=stem.out.println"%* &=stem.out.println"ump.to&trin!"%%* ? ? macarrao+11 macarrao +11

!!COMEN;ARIO9 O paradi!ma de orientao a o%7etos est6 re(+etido na #apa#idade de .erana e en#apsu+amento das inter(a#es" No #aso deste e5emp+o, a inter(a#e (oi de#+arada #omo public, mas se nada (osse espe#i(i#ado e+a perten#eria ao pa#Ba!e de+a, ou se7a os modos de en#apsu+amentos so seme+.antes aos de #+asses" 4ma i2ter ace poderia este2der a i2ter ace 8mprimivel& interface 8mprimivel5 e,tends 8mprimivel : ? Inter(a#es tem sido representadas por retLn!u+os de %ordas arredondadas +i!adas as #+asses Jue as imp+ementam por +in.as tra#e7adas" ,uitos #on(undem inter(a#es #om #+asses e o ato de imp+ementar uma inter(a#e #om o ato de estender ou .erdar uma #+asse" 'or isso a re+ao entre inter(a#es e .erana ser6 e5p+i#ada s< a!ora, depois Jue ?o#H 76 pensou no assunto" 4ma #+asse 'roduto5 .erda da #+asse 'roduto8nosso e5emp+o; Jue imp+ementa a inter(a#e 8mprimivel" A #+asse produto 76 (e= a parte di(*#i+ Jue imp+ementar a inter(a#e, a!ora a #+asse 'roduto5 pode optar por a#eitar ou rede(inir os m todos .erdados, ou se7a& AA inter(a#e um dos *tems Jue .erdado de uma #+asse, assim #omo os atri%utos e m todosC" E<erc9ci"s: => )e(ina uma inter(a#e para um #on7unto de #+asses Jue representam (i!uras !eom tri#as Jue podem ser desen.adas na te+a"

12

PO'IMORFISMO+ C'ASSES ABSTRATAS E5istem ?6rias #+assi(i#aIes e tipos de po+imor(ismo" CSS apresenta ?6rios tipos de po+imor(ismo " Java apresenta um #on7unto mais redu=ido e?itando prin#ipa+mente po+imor(ismos ad3.o#" 'o+imor(ismo, do !re!o& muitas (ormas" 'o+imor(ismo a #apa#idade de um operador e5e#utar a ao apropriada dependendo do tipo do operando" AJui operando e operador esto de(inidos num sentido mais !era+& operando pode si!ni(i#ar ar!umentos atuais de um pro#edimento e operador o pro#edimento, operando pode si!ni(i#ar um o%7eto e operador um m todo, operando pode si!ni(i#ar um tipo e operador um o%7eto deste tipo" RE%EFINIO %E MLTO%OS PARA $MA C'ASSE HER%EIRA Este e5emp+o 76 (oi apresentado em " Tam% m trata3se de um po+imor(ismo, pode ser #+assi(i#ado #omo po+imor(ismo de in#+uso" 4m m todo uma rede(inio de um m todo .erdado, Juando est6 de(inido em uma #+asse #onstru*da atra? s de .erana e possui o mesmo nome, ?a+or de retorno e ar!umentos de um m todo .erdado da #+asse pai" A assinatura do m todo tem Jue ser idHnti#a, ou se7a, teremos rede(inio Juando uma #+asse (i+.a (orne#e apenas uma no?a imp+ementao para o m todo .erdado e no um no?o m todo" Se a #+asse (i+.a (orne#er um m todo de #a%ea+.o ou assinatura pare#ida #om a do m todo .erdado 8di(ere ou no n>mero ou no tipo dos ar!umentos, ou ento no tipo do ?a+or de retorno; ento no se trata mais de rede(inio, trata3se de uma so%re#ar!a, pois #riou3se um no?o m todo" 4ma #.amada ao m todo .erdado no mais inter#eptada por esse no?o m todo de mesmo nome" O m todo tem o mesmo nome, mas +i!eiramente di(erente na sua assinatura 8o #orpo ou %+o#o de #<di!o _` no importa;, o Jue 76 imp+i#a Jue no propor#iona o mesmo #omportamento 8%e.a?iour; do m todo da super#+asse" SOBRECARGA I MLTO%OS E OPERA%ORESJ Este tipo de po+imor(ismo permite a e5istHn#ia de ?6rios m todos de mesmo nome, por m #om assinaturas +e?emente di(erentes ou se7a ?ariando no n>mero e tipo de ar!umentos e no ?a+or de retorno" -i#aria a #ar!o do #ompi+ador es#o+.er de a#ordo #om as +istas de ar!umentos os pro#edimentos ou m todos a serem e5e#utados" SOBRECARGA %E MLTO%OS+ COPY CONSTR$CTOR No e5emp+o a se!uir ?amos so%re#arre!ar o #onstrutor de uma #+asse, esta #+asse passar6 a ter duas ?ersIes de #onstrutores, ?a+e +em%rar Jue assim #omo o #onstrutor ser6 so%re#arre!ado, Jua+Juer outro m todo poderia ser" O #ompi+ador sa%er6 Jua+ m todo #.amar no mais pe+o nome, mas pe+os ar!umentos" O m todo 'onto"'onto ap%* um A#opy #onstru#torCE pois tem o mesmo nome Jue 'onto"float d,Efloat d=%*. Ta+ dup+i#ao de nomes pode pare#er estran.aE por m Java permite Jue e+es #oe5istam /ara 5-a -es-a c0asse porJue no tem a mesma assinatura 8nomeSar!umentos;" Isto se #.ama so%re#ar!a de m todo, o #ompi+ador sa%e distin!uir entre esses dois #onstrutores" Outros
7

m todos, no s< #onstrutores podero ser so%re#arre!ados para ?6rios ar!umentos di(erentes, esse re#urso um po+imor(ismo do tipo Aad3.o#C" O Jue interessante para n<s o (ato de o ar!umento do #onstrutor Ponto"Ponto ap%* ser da mesma #+asse para Jua+ o #onstrutor (oi imp+ementado, o Jue #ara#teri=a um A#opy #onstru#torC Jue ini#ia+i=a um o%7eto a partir de outro da mesma #+asse" Outros m todos seme+.antes seriam& #irculo"#irculo a%* 6ouse"6ouse d%* . Imp+ementar #opy #onstru#tor pode ser muito importante, +em%re3se dos pro%+emas #om #<pias de o%7etos apresentados em " 'or JuestIes de espao, %asearemos nosso e5emp+o no tipo a%strato de dados (rao, apresentado em " Wo#H de?e modi(i#ar a #+asse Pracao para Jue e+a ten.a dois #onstrutores, o Jue esta em ne!rito de?er6 ser a#res#entado ao #<di!o ori!ina+& public Pracao(int u%*o) !!*obrecar7a "o con*trutor ori7inal 0 nu%&u%*o "en&. !!*ubenten"i"o 1 public Pracao(Pracao copie%e) !!e**e eM u% cop$ con*tructor e u%a *obrecar7a 0 nu%&copie%e,retorna=nu%() "e%&copie%e,retorna="en() 1 public Pracao"int tEint m% //construtor ori!inal : numGt* denGm* this.simplifica"%* //chamada para o mesmo objeto. ?

//V pro!rama principalE sobre a modificacao em ne!rito class 'rincipal : public static void main"&trin! ar!s;<% : Pracao aEbEc* a&ne' Pracao(Q) !!eli%ine o *e7un"o ar7u%ento bGnew Pracao"5EL%* &=stem.out.print">-sta eX a fracao a: >%* a.mostra"%* &=stem.out.print">-sta eX a fracao b: >%* b.mostra"%* cGa.soma"b%*
1V

&=stem.out.print" >c de aFb: >%* //c"aFb% c.mostra"%* &=stem.out.print">a@b: >%* cGa.multiplicacao"b%* c.mostra"%* &=stem.out.print">aFb: >%* cGa.soma"b%* c.mostra"%* &=stem.out.print">aCGb: >%* &=stem.out.println"a.maioroui!ual"b%%* &=stem.out.print">aGGb: >%* &=stem.out.println"a.i!ual"b%%* &=stem.out.print">a9Gb: >%* &=stem.out.println"a.diferente"b%%* &=stem.out.print">"int%a >%* &=stem.out.println"a.converteint"%%* &=stem.out.print">"double%a >%* &=stem.out.println" a.convertedbl"%%* ? ? -sta eX a fracao a: "5/+% -sta eX a fracao b: "+/3% c de aFb: "+L/3% a@b: "5/3% aFb: "+L/3% aCGb: true aGGb: false a9Gb: true "int%a 5 "double%a 5 Teste o A#opy #onstru#torC para o tipo a%strato de dados (rao apresentado a#ima" Kuando um s< n>mero (or passado para o #onstrutor desta #+asse, su%entende3se Jue o #onstrutor #.amado o de um s< ar!umento inteiro e Jue portanto o denominador ser6 i!ua+ a 0" A!ora ?amos (a+ar do A#opy #onstru#torC, Jue em%ora imp+ementado, no (oi testado em main"% " Esse m todo, perten#e a outro o%7eto Jue no o ar!umento copieme, ento para distin!uir o atri%uto num deste o%7eto, do atri%uto num de copieme usamos copieme.num e simp+esmente num para o o%7eto +o#a+, o%7eto em Juesto, ou o%7eto dono do m todo #.amado"

E<erc9ci"s: => -aa um A#opy #onstru#torC para uma das #+asses 76 imp+ementadas neste te5to" @> So%re#arre!ue o m todo move da #+asse 'onto para a#eitar um 'onto #omo ar!umento, su%entende3se Jue de?emos mo?er a distLn#ia , e a distLn#ia = daJue+e ponto a ori!em" A> Crie um m todo de nome unitari4ado para a #+asse 'onto" Este m todo de?e interpretar o 'onto #omo um ?etor e retornar um no?o 'onto Jue #ont m as #oordenadas do ?etor unitari=ado" 4nitari=ar di?idir #ada #oordenada pe+o m<du+o do ?etor" O m<du+o a rai= Juadrada da soma dos Juadrados das #omponentes" SOBRECARGA %E OPERA%OR Java no (orne#e re#ursos para so%re#ar!a de operador, o Jue per(eitamente #ondi=ente #om a (i+oso(ia da +in!ua!em" Seus #riadores Jue a#redita?am Jue a +in!ua!em de?eria ser peJuena, simp+es, se!ura de se pro!ramar e de se usar 8simp+e, sma++, sa(e and se#ure;" A ausHn#ia de so%re#ar!a de operadores pode ser #ontornada de(inindo apropriadamente #+asses e m todos" C'ASSES ABSTRATAS E CONCRETAS Em um dos e5er#*#ios anteriores 8no t<pi#o so%re .erana; ped*amos Jue ?o#H de(inisse uma .ierarJuia #omposta de trHs #+asses" A #+asse pai tin.a o nome de Porma, e as #+asses .erdeiras desta eram 'onto e Uetan!ulo. Em%ora a #+asse (orma no possu*sse sentido pr6ti#o, e+a permitia #ertas operaIes #omo moveE altera),"int n,%, entre outras 8retorne a este e5er#*#io;" Na ?erdade o Jue dese76?amos era Jue esta #+asse Porma se #omportasse #omo um esJue+eto para as suas #+asses (i+.as, n<s no Juer*amos instan#i63+a" C+asses a%stratas permitem e5atamente isto pois no podem ser instan#iadas em%ora possam ser usadas de outras maneiras" C+asses a%stratas so poderosas, e+as permitem& #riao de +istas .etero!Hneas, o#orrHn#ia de Adynami# %indin!C e maior #+are=a no pro7eto de sistemas" Os pa#Ba!es Jue ?em #om a +in!ua!em esto rep+etos de e5emp+os de #+asses a%stratas" , todos a%stratos, o%ri!atoriamente perten#em a #+asses a%stratas, e so m todos despro?idos de imp+ementao, so apenas de(iniIes Jue sero apro?eitadas por outras #+asses da .ierarJuia" Wo+tando ao e5emp+o da .ierarJuia PormaE 'onto e Uetan!ulo " O m todo mostra poderia ter sido de(inido na #+asse %ase a%strata 8Porma; #omo um m todo a%strato"

0OO

C+asses a%stratas //#lasse Porma ab*tract class Porma : protected float ,E=* //visivel hierar$uia abai,o public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* ? ab*tract public void mostra"%* //metodo abstrato ? //#lasse ponto class 'onto e,tends Porma : public 'onto"float a,Efloat a=% //omita o valor de retorno9 //!arante o estado do objeto : this.,Ga,* this.=Ga=* ? //move nao precisa ser redefinido public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>%>%*
+1+

? ?

//#lasse Uetan!ulo class Uetan!ulo e,tends Porma : protected float d,Ed=* //delta , e delta = //protected acaba sendo menos infle,ivel e mais eficiente $ue private public Uetan!ulo"float a,Efloat a=Efloat d,Efloat d=% //!arante o estado do objeto : ,Ga,* =Ga=* this.d,Gd,* this.d=Gd=* //this usado para eliminar ambi!uidade ? //metodo move precisa ser redefinido public void move"float d,Efloat d=% : this.,FGd,* this.=FGd=* this.d,FGd,* this.d=FGd=* //this distin!ue o ar!umento do atributo de mesmo nome ? public void mostra"% : &=stem.out.println">">Fthis.,F>E>Fthis.=F>%">Fd,F>E>Fd=F>%>%* ? ? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : Uetan!ulo arGnew Uetan!ulo"1E1E+3E+0%* ar.mostra"%* ar.move"+E+%* ar.mostra"%* ? ?
0O/

"1E1%"+3E+0% "+E+%"+0E+5%

//COMEN;ARIO9: O%ser?e Jue a #+asse Porma Jue a%strata, no possui um #onstrutor, porJue no pode ser instan#iada" A!ora tam% m temos um no?o Jua+i(i#ador de #+asse e de m todos& abstract. C0asses a3stratas N I2ter aces: Wo#H de?e estar a#.ando Jue #+asses a%stratas e inter(a#es so #on#eitos pare#idos e Jue podem ser usados #om o%7eti?os seme+.antes" CuidadoR 4ma #+asse pode estender uma >ni#a #+asse 8Jue pode ser a%strata ou no;, mas pode imp+ementar ?6rias inter(a#es" A+ m disso, inter(a#es no permitem de#+arao de atri%utos, enJuanto Jue #+asses a%stratas permitem" Inter(a#es esto mais +i!adas a #omportamento, enJuanto Jue #+asses a%stratas esto mais +i!adas a imp+ementao" E<erc9ci"s& 03 )e(ina uma #+asse a%strata tipo num ri#o Jue de?e ser?ir #omo #+asse %ase para a monta!em de #+asses #omo a #+asse (rao ou a #+asse n>mero #omp+e5o" 4ma %oa medida da Jua+idade de sua imp+ementao a Juantidade de mudanas ne#ess6rias para por e5emp+o tro#ar a #+asse (rao usada em um a+!oritmo de #6+#u+o num ri#o pe+a #+asse n>mero #omp+e5o" M %em ?erdade Jue e5istem operaIes Jue se ap+i#am a uma dessas #+asses, mas no a outra, mas essas disparidades de?ero ser mantidas (ora da #+asse %ase a%strata" C'ASSE ABSTRATA ITERA%OR Neste e5emp+o iremos #riar uma #+asse %ase a%strata iterador, Jue ser?ir6 #omo topo de uma .ierarJuia para iteradores de estruturas de dados #omo +istas, ?etores e 6r?ores" O iterador de ?etor de(inido por .erana da #+asse %ase a%strata de iteradores" 'er#e%a Jue a+!uns m todos da #+asse %ase so despro?idos de imp+ementao, por m nada impede Jue ?o#H #o+oJue #omo #<di!o desses m todos uma mensa!em de erro do tipo AErro, m todo de?eria ter sido rede(inidoC, mas a!ora o #ompi+ador no pode mais te +em%rar de rede(ini3+os" SHOPPING 'IST APPROACH PARA A C'ASSE ABSTRATA ITERA%OR
8As operaIes imp+ementadas esto mar#adas #om , e5istem outras operaIes >teis, no men#ionadas por moti?os de espao" Esta #+asse %ase a%strata no tem a (un#iona+idade de uma #+asse Jue possa estar instan#iada, per#e%a a ausHn#ia de um m todo para a?anar na iterao;"

, todo de ini#ia+i=ao da iterao Retorno do #onte>do da atua+ posio na iterao Atri%uio de ?a+or a atua+ posio da iterao , todo Jue ?eri(i#a se a iterao no #.e!ou ao (im
+13

SHOPPING 'IST APPROACH PARA A C'ASSE ABSTRATA ITERA%OR &ETOR

84ma tare(a desa!rad6?e+ Juando iterando so%re ?etores manter os *ndi#es das iteraIes atua+i=ados durante a?anos e retro#essos" Note Jue retro#essos no (ariam sentido em uma +ista simp+esmente +i!ada, por isso essa operao somente de(inida neste n*?e+ da .ierarJuia";

Retorno do ?a+or num ri#o ou *ndi#e da atua+ posio da iterao Retro#esso na iterao A?ano na iterao A?ano e retro#esso #om sa+tos 8in#+usi?e mais !en ri#o Jue os dois anteriores;"

//#lasse 8terador8 ab*tract class 8terador8 : ab*tract public void comeca"%* ab*tract public int retorna"%* //metodos abstrato ab*tract public void atribui"int a%* ab*tract public boolean fim"%* ? //#lasse 8teradorVetor8 class 8teradorVetor8 e,tends 8terador8 : protected int;< vet* //itero sobre ele private int conta* //posicao atual da iteracao public 8teradorVetor8"int;< itereme% : vetGitereme* contaG1* ? public void comeca"% : contaG1* ? public void comeca"int p% : contaG"pSvet.len!th%*
0OF

? public void atribui"int novo% : vet;conta<Gnovo* ? public int retorna"% : return vet;conta<* ? public boolean fim"% : return contaGGvet.len!thQ+* ? public int retorna)conta"% : return conta* ? public void avanca"% : if "contaA"vet.len!thQ+%% contaFF* ? public void retrocede"% : if "contaC1% contaQQ* ? ? import java.io..ata8nput&tream* //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : int;< vetGnew int;L<* vet;1<G1* vet;+<G+* vet;5<G5* vet;3<G3* vet;0<G0* vet;5<G5* 8teradorVetor8 mitGnew 8teradorVetor8"vet%*
+15

char o* //oGopcaoE int e* //temporario &trin! line* //linha a ser lida do teclado .ata8nput&tream meu.ata8nput&treamGnew .ata8nput&tream"&=stem.in%* tr=: do : do : oGmeu.ata8nput&tream.read3ine"%.charAt"1%* ? while "oGGXMnX%* switch "o% : case XaX: //atribui lineGmeu.ata8nput&tream.read3ine"%* tr= : eG8nte!er.valueVf"line%.intValue"%* mit.atribui"e%* ? catch "-,ception erro% : &=stem.out.println">-ntrada invalida9>%* ? breaK* case XrX: //retorna eGmit.retorna"%* &=stem.out.println"e%* breaK* case XfX: //frente mit.avanca"%* breaK* case XtX: //tras mit.retrocede"%* breaK* case XcX: //comeca iteracaoY mit.comeca"%* breaK* case XeX: //fim da iteracaoY &=stem.out.println"mit.fim"%%* breaK* case XvX: //valor atual &=stem.out.println">V:>Fmit.retorna)conta"%%* breaK* case XmX: //mostra vetor for"int jG1*jAvet.len!th*jFF%

0O2

: &=stem.out.print">;>Fvet;j<F><>%* ? &=stem.out.println"%* breaK* default: * ? //switch ? while "o9GX$X%* ? //tr= blocK catch "-,ception erro% : /@ nao faco nada @/ ? ? //main method ? //class 'rincipal m ;1<;+<;5<;3<;0<;5< a m ; <;+<;5<;3<;0<;5< f f f a 33 t a 55 m ; <;+<;55<;33<;0<;5< c v V:1 $ E<erc9ci"s& 03 )e(ina uma #+asse de nome Arra=&ervices Jue (orne#e ser?ios para ?etores" Imp+emente os Aser?iosC de& ordenao de su%?etor 8?etor interno menor ou i!ua+ ao ?etor em Juesto; , %us#a, tro#a de posiIes, et#" Esta #+asse opera so%re os ?etores passados #omo ar!umentos de seus m todos 8passa!em imp+*#ita do ponteiro para o ?etor;" Os ?etores de?em ser de tipos num ri#os de(inidos na +in!ua!em 8#onte #om a e5istHn#ia de operadores F Q A GG, et#;"

+17

Wo#H ter6 Jue de(inir uma ?erso desta #+asse para #ada tipo da +in!ua!em 8 b=teE float, et#;" Na ?erdade isto no tra%a+.oso, %asta ?o#H de(inir para um tipo, depois a+terar s< as partes ne#ess6rias e re#ompi+ar para os demais" 'ense #omo (a=er a #+asse Arra=&ervices tra%a+.ar em #on7unto #om a #+asse Iterador ?etor" No #on(unda estas duas #+asses, e+as e5e#utam tare(as distintas"

ACOP'AMENTO %INVMICO %E MENSAGENS 'or a#op+amento entenda a es#o+.a #erta de um m todo a ser e5e#utado para uma ?ari6?e+ de#+arada #omo de uma #+asse, mas podendo #onter um o%7eto de uma su%#+asse desta" 'or dinLmi#o entenda em tempo de e5e#uo" J6 dissemos Jue um o%7eto de uma #+asse (i+.a !arante no m*nimo o #omportamento A%e.a?iourC de seu pai" 'or este moti?o podemos atri%uir um o%7eto da #+asse (i+.a a uma ?ari6?e+ da #+asse pai, mas no o #ontr6rio" A#op+amento dinLmi#o mostrar6 Jue poss*?e+ (a=er #om Jue o #ompi+ador e5e#ute a imp+ementao dese7ada de um m todo rede(inido para #+asses .erdeiras, mesmo no #aso de #.amada de m todo o#orrer para uma ?ari6?e+ de super#+asse 8#+asse pai; #ontendo um o%7eto de uma su%#+asse 8#+asse (i+.a;" Isto nos permitir6 #onstruir +istas .etero!Hneas " -a=endo uma #omparao #om +in!ua!ens pro#edurais& O tra%a+.o do dynami# %indin! norma+mente (eito desta (orma em +in!ua!ens pro#edurais& EE#omputa#ontaDancaria if t=pe"a%GG#onta#orrente then #omputa#onta#orrente"a%* else if t=pe"a%GG'oupanca then #omputa'oupanca"a%* //chamadas de procedimentos J6 em +in!ua!ens orientadas a o%7etos #omo Java temos o se!uinte& #onta #ontVetGnew conta;3<* //Vetor de objetos da classe conta #ontVet;1<Gnew 'oupanca"+111E.+1%* //toda 'oupanca R uma #onta #ontVet;+<Gnew #onta#orrente"+111E.+1E1%* //toda #onta#orrente R uma #onta #ontVet;5<Gnew 'oupanca"+131E.+5%* #ontVet;,<.computa"%* //nao importa para $ue classe da hierar$uia de contasE computa //computa definida e o compilador acopla dinamicamenteE em tempo de e,ecucao a //mensa!em %iagra-a das c0asses:

0OV

A #+asse (i+.a !arante no m*nimo o mesmo #omportamento, A%e.a?iourC da #+asse pai, podendo a#res#entar ou rede(inir parte do Jue (oi .erdado" 'or este moti?o, uma ?ari6?e+ da #+asse pai pode re#e%er um o%7eto da #+asse (i+.a, o #omportamento da #+asse pai (i#a !arantido e o restante 8o Jue a #+asse (i+.a a#res#entou; perdido" J6 uma ?ari6?e+ da #+asse (i+.a no pode re#e%er um o%7eto da #+asse pai, porJue os m todos de(inidos para ?ari6?eis desta #+asse passam a no (a=er sentido para o o%7eto #ontido nesta ?ari6?e+" O dia!rama re(+ete o aspe#to das #ara#ter*sti#as a#res#entadas pe+a #+asse (i+.a a #+asse pai, mas no o (ato de uma ?ari6?e+ da #+asse pai poder re#e%er um e+emento da #+asse (i+.a, isto porJue #omo no desen.o o pai desen.ado menor Jue o (i+.o, o +eitor tem a tendHn#ia de in(erir Jue o pai #a%e no (i+.o o Jue 7ustamente o #ontr6rio do Jue a#onte#e em termos de ?ari6?eis" $M E(EMP'O ESC'ARECE%OR O e5emp+o a se!uir #ria dois o%7etos 8pai e (i+.o; e (a= atri%uiIes e #.amadas de m todos entre e+es" //#lasse &uper#lasse class &uper#lasse : public void nome"% : &=stem.out.println">6etodo da superclasse>%* ? ? //#lasse &ub#lasse class &ub#lasse e,tends &uper#lasse : public int novoatributo* public void nome"% //redefinicao : &=stem.out.println">6etodo da subclasse>%* ? public void novometodo"% : &=stem.out.println">Bovo metodo:>Fnovoatributo%* ?

+1

? //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : &ub#lasse esub+Gnew &ub#lasse"%* &uper#lasse esuper+Gnew &uper#lasse"%* //poderia ter alocado uma &ub#lasse a$ui esub+.nome"%* esub+.novoatributoG+1* esuper+.nome"%* esuper+Gesub+* esuper+.nome"%* ? //main method ? //class 'rincipal 6etodo da subclasse 6etodo da superclasse 6etodo da subclasse

!!COMEN;ARIO95 Note Jue o m todo es#o+.ida de a#ordo #om o #onte>do da ?ari6?e+ e no de a#ordo #om a #+asse desta" O #$E ACONTECE COM O #$E FOI ACRESCENTA%O )epois do pro!rama anterior, ?o#H de?e estar se per!untando o Jue a#onte#e #om o Jue (oi a#res#entado pe+a #+asse (i+.a Juando um o%7eto desta #+asse atri%u*do a #+asse pai"

//8nsira a$ui o ar$uivo da &uper#lasse do e,emplo anterior

//8nsira a$ui o ar$uivo da &ub#lasse do e,emplo anterior

//#lasse principalE Ar$uivo 'rincipal.java


00O

class 'rincipal : public static void main"&trin! ar!s;<% : &ub#lasse esub+Gnew &ub#lasse"%* &uper#lasse esuper+Gnew &uper#lasse"%* //poderia ter alocado uma &ub#lasse a$ui esub+.nome"%* esub+.novoatributoG+1* esuper+.nome"%* esuper+Gesub+* esuper+.nome"%* esub+G"&ub#lasse%esuper+* //cast esub+.nome"%* esub+.novometodo"%* ? //main method ? //class 'rincipal 6etodo da subclasse 6etodo da superclasse 6etodo da subclasse 6etodo da subclasse Bovo metodo:+1 XXCOMEN;ARIO9 Em%ora ?o#H se7a #apa= de re#uperar os m todos e atri%utos a#res#entados atra? s do type #astin!, enJuanto isto no (or (eito, estes m todos e atri%utos esto ina#ess*?eis" E<erc9ci"s: 03 Imp+emente em suas #+asses m todos Jue imprimem uma (rase identi(i#ando o tipo da #+asse, por e5emp+o& AEu sou a #+asse #onta #orrente, espe#ia+i=ao de #onta %an#aria"C
/3

,ode+e e imp+emente uma .ierarJuia de CONTAS BANCRIAS, use os re#ursos Jue a#.ar #on?eniente& #+asses a%stratas, inter(a#es, ?ari6?eis stati#" Wo#H de?e de(inir #+asses seme+.antes as #ontas %an#6rias #omo poupana, #onta #orrente, et#" Os m todos de?em ter nomes #omo deposita, sa#a, #omputa, et#" 'ISTA HETEROGONEA %E FORMAS Ige"-;tricasJ

+++

Este e5emp+o +ida #om um ?etor de o%7etos da #+asse (orma de(inida em C9ASSES ABSTRATAS E CONCRETAS , estes o%7etos so retLn!u+os, pontos, et#" O o%7eti?o mostrar& su%#+asses #ontidas em ?ari6?eis 8posiIes de ?etor; da super#+asse e a#op+amento dinLmi#o de mensa!ens" O nosso ?etor de (ormas #onter6 o%7etos !r6(i#os de #+asses .etero!Hneas" Trataremos todos de maneira uni(orme, #.amando os m todos mostra e move" Wo#H 76 ?iu nos e5emp+os anteriores #omo re#uperar o o%7eto em uma ?ari6?e+ de sua pr<pria #+asse e no super#+asse" Re#ompi+e #om esse no?o m todo main& //8nsira a$ui a definicao da classe Porma dada em #3A&&-& AD&HUAHA& - #VB#U-HA&

//8nsira a$ui a definicao da classe 'onto dada em #3A&&-& AD&HUAHA& - #VB#U-HA&

//8nsira a$ui a definicao da classe Uetan!ulo dada em #3A&&-& AD&HUAHA& #VB#U-HA& //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : Porma vetor!rafico;<Gnew Porma;0<* vetor!rafico;1<Gnew Uetan!ulo"1E1E51E+1%* vetor!rafico;+<Gnew 'onto"1E+%* vetor!rafico;5<Gnew Uetan!ulo"+11E+11E51E51%* //lados i!uais vetor!rafico;3<Gnew 'onto"5E+%* for"int iG1*iA0*iFF% : vetor!rafico;i<.mostra"%* ? for"int jG1*jA0*jFF% : vetor!rafico;j<.move"+5.1fE+5.1f%* vetor!rafico;j<.mostra"%* ? ? ?

00/

"1E1%"51E+1% "1E+% "+11E+11%"51E51% "5E+% "+5E+5%"51E+1% "+5E+3% "++5E++5%"51E51% "+0E+3% EECOMEN;ARIO9& O%ser?e Jue a imp+ementao #orreta do m todo mostra es#o+.ida em tempo de e5e#uo de a#ordo #om a #+asse do o%7eto Jue est6 naJue+a posio do ?etor" E<erc9ci"s: 0 Considere as se!uintes de#+araIes em Java& public class H : public void f"void% : &=stem.out.println" I-stou em HJ%*? ?* public class & e,tends H : public void f"void% : &=stem.out.println"I-stou em &J%*? ?* H ,G new H"%* & =Gnew &"%* H pGnew H"%* e as se!uintes in?o#aIes de operaIes& p.f"%* //primeira pG=* p.f"%* //se!unda ,.f"%* //terceira =.f"%* //$uarta ,G=* ,.f"% //$uinta Responda Jua+ o resu+tado na te+a de #ada uma destas #.amadas"

++3

CONCEITOS A&ANA%OS Neste t<pi#o apresentaremos #on#eitos a?anados da +in!ua!em, estes #on#eitos so importantes se ?o#H dese7a #riar so(tNares re+ati?amente !randes em Java" ATRIB$TOS 9;A;IC At o momento s< .a?*amos aprendido #omo de(inir atri%utos de instLn#ia" Cada o%7eto tin.a seus pr<prios atri%utos e uma modi(i#ao nos atri%utos de um o%7eto no a(eta?a os atri%utos de outros o%7etos" Neste t<pi#o iremos apreender #omo de(inir atri%utos de #+asse" Esses atri%utos so os mesmos para todos os o%7etos, e+es so #omparti+.ados" 4ma mudana em um destes atri%utos ?is*?e+ por todos os o%7etos instan#iados" Atri%utos de #+asse tam% m so #.amados de atri%utos static" Neste e5emp+o de(iniremos uma #+asse robo Jue usa atri%utos static para sa%er Juantos robos (oram #riados 8instan#iados;" 4m outro uso de atri%utos static seria usar uma estrutura de dados Jue permitisse Jue um robo sa%er a posio8#oordenadas; dos demais o%7etos de sua #+asse"

//#lasse Uobo class Uobo : public int ,* public int =* public *tatic int Iuanto* !!Iuanto* fora% in*tancia"o* public Uobo"int a,Eint a=% : ,Ga,* =Ga=* Iuanto*-? ?

00F

//#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : Robo,Iuanto*&3 !!iniciali<an"o a +aria+el *tatic Uobo cncEcnc5* &=stem.out.println"Uobo.$uantos%* cncGnew Uobo"+1E+5%* &=stem.out.println"Uobo.$uantos%* cnc5Gnew Uobo"++E+5%* &=stem.out.println"Uobo.$uantos%* ? //main method ? //class 'rincipal 1 + 5

EECOMEN;ARIO9& Kuando de(inimos atri%uto static, est6?amos nos re(erindo ao sentido !era+ de atri%uto" Apesar de termos e5emp+i(i#ado #om um inteiro, ?o#H poderia ter usado uma #+asse no +u!ar desse atri%uto, tomando o #uidado de #.amar new antes de us63+o" MLTO%OS STATIC , todos static tam% m so #.amados de m todos de #+asses" Estes m todos s< podem operar so%re atri%utos de #+asses" Nos 76 ?*n.amos usando estes m todos" E5istem e5emp+os de #.amadas de m todos static em nossos pro!ramas anteriores porJue as pa#Ba!es da +in!ua!em so rep+etas de e5emp+os de m todos static" 'or este moti?o eu es#o+.i uma das de(iniIes de m todos static da Java A'I 8Sun ,i#rosystems; para trans#re?er& abs5double6. 2tatic met3od in class java.lang.!at3 -eturns t3e absolute double value o, a. Neste t<pi#o no mostraremos um e5emp+o propriamente dito, apenas mostraremos #omo de(inir um m todo static, portanto importante Jue ?o#H (aa os e5er#*#ios" , todos static so de(inidos assim #omo atri%utos static& public static int 6.#"int aEint b% : //ma,imo divisor comum de a e b ?

++5

No e5emp+o da #+asse Pracao 8TA) -RAO;, ti?emos Jue +idar #om o m todo mdc" Este m todo no (a=ia muito sentido para o usu6rio desta #+asse, em%ora (osse ne#ess6rio para (a=er #ertas operaIes Jue en?o+?iam simp+i(i#ao de (rao" NaJue+e momento nossa opo (oi por imp+ementar o m todo #omo private na pr<pria #+asse Pracao" A+!u m ri!oroso poderia ter dito& AWo#H est6 errado, mdc no tem nada a ?er #om Pracao e eu ?ou imp+ement63+o em uma #+asse separada #.amada &ervicos6atematicosC" A min.a resposta a esta a(irmao seria& AA#.o sua id ia %oa, mas sem o uso de m todos static na #+asse &ervicos6atematicos, ?o#H ?ai ter Jue de#+arar um o%7eto da #+asse &ervicos6atematicos dentro de #ada Pracao para poder usar o m todo mdc"C E<erc9ci"s& =3 )e(ina uma #+asse #om m todos static Jue permite -ATORIA9, CO,BINAlES8n,B;, 'ER,4TAlES, et#" U@3 E5iste uma +in!ua!em de pro!ramao #.amada 9o!o Jue muito usada no Brasi+ em es#o+as de primeiro e se!undo !rau" Nesta +in!ua!em ?o#H pode pro!ramar os mo?imentos na te+a de uma tartaru!uin.a ou #ursor" Este #ursor des#re?e mo?imentos ris#ando ou no a te+a, dentre os mo?imentos des#ritos esto #*r#u+os, Juadrados e seJuHn#ias repetiti?as 8+oops;" ,odi(iJue seu o%7eto ro%o para apresentar a+!uns desses re#ursos" Crie ento um pro!rama Jue +H de um arJui?o te5to instruIes para este o%7eto ro%o e5e#utar mo?imentos na te+a" 9o!o (oi #riada por um #ientista de #omputao do ,IT" T3 Wo#H pode dese7ar arma=enar as in(ormaIes da #+asse Uobot em outra #+asse, Jue #omputa outros #6+#u+os, neste #aso temos pe+o menos duas a+ternati?as a se!uir& a;Crie uma #+asse au5i+iar e5terna de arma=ena!em e para todos o%7etos robo instan#iados passe o ponteiro desta #+asse au5i+iar #omo ar!umento do #onstrutor " Assim esses o%7etos podero mandar mensa!ens para esta #+asse de arma=ena!em" Essas mensa!ens, #.amadas de m todos, podem ter ?6rios si!ni(i#ados, num sentido (i!urado podemos ter a+!o pare#ido #om& AC+asse au5i+iar, arma=ene essa in(ormao para mimC" AC+asse au5i+iar, me mande uma mensa!em daJui a #in#o se!undos, estou passando o ponteiro para mim mesmo 8this;C , et#" As mensa!ens ?istas desse modo (i#am mais interessantes, ?o#H pode at a#.ar en!raado, mas muito pr6ti#o pensar assim" F3 Em a+!uma #+asse Jue ?o#H #riou anteriormente de(ina ?ari6?eis static #om o se!uinte o%7eti?o& Contar, (a=er estat*sti#as das #.amadas de m todos da #+asse" 4se o Jue (oi aprendido so%re Astatic ?aria%+esC no pro!rama #ontas, o o%7eti?o arma=enar in(ormaIes so%re os mo?imentos de todas as #ontas num o%7eto static" 'ara Jue a modi(i#ao (iJue a #ontento ?o#H pode pre#isar tornar o e5emp+o mais pr<5imo da rea+idade, adi#ionando no #onstrutor de #ontas um ar!umento& n>mero de #onta" Comente se ?o#H usaria a+o#ao dinLmi#a para essa #+asse de arma=ena!em a!re!ada em #onta, ou no" Ten.a em mente a Juesto do taman.o em %ytes do o%7eto" #6+#u+os matem6ti#os #omo ,)C,

U3

002

TRATAMENTO %E E(CESES Se os #on#eitos de orientao a o%7etos dados at a!ora (ossem su(i#ientes para mode+ar Jua+Juer ati?idade ou o%7eto do mundo rea+, todos os pro%+emas de pro!ramao estariam reso+?idos" O#orre Jue o mundo rea+ %em mais #omp+e5o Jue seu pro!rama pode ser" Nem todos os o%7etos e iteraIes entre e+es podem ser mode+ados ou pre?istos" Os me#anismos de tratamento de e5#eIes se en#ai5am 7ustamente nessa +a#una" O mode+o de tratamento de e5#eIes adotado por Java muito seme+.ante ao de CSS" Se ?o#H 76 te?e a+!uma e5periHn#ia #om tratamento de e5#eIes, este t<pi#o ser6 %astante (6#i+" TRATAN%O AS E(CESES GERA%AS POR TERCEIROS Tratamento de e5#eIes permite +idar #om as #ondiIes anormais de (un#ionamento de seu pro!rama" -a=er uso deste re#urso tornar6 seu so(tNare mais ro%usto, se!uro e %em estruturado" So e5emp+os de #ondiIes anormais& a#esso a um *ndi#e in?6+ido de um ?etor, tentati?a de uso de um o%7eto no ini#ia+i=ado, (a+.a na trans(erHn#ia de uma in(ormao, uma (a+.a no pre?ista, et#" Sem as (a#i+idades o(ere#idas pe+a +in!ua!em seria muito di(*#i+ +idar #om essas #ondiIes anormais, isto pode ser o%ser?ado nos de(i#ientes meios de tratamento de erros usados em +in!ua!ens Jue no (orne#em Ae5#eption .and+in!C" Java uma +in!ua!em Jue (a= (orte uso do #on#eito de tratamento de e5#eIes" Em a+!umas +in!ua!ens Jue imp+ementam tratamento per(eitamente poss*?e+ pro!ramar sem usar esse re#urso, mas em Java no" Isto pode ser #ompro?ado pe+a ne#essidade de a+!uns %+o#os de #<di!o tr= :? catch :? em pro!ramas anteriores" 4m dos moti?os de o pro!ramador Java ter Jue sa%er tratamento de e5#eIes Jue os m todos de #+asses de(inidas na +in!ua!em podem !erar e5#eIes e na maioria das ?e=es o #ompi+ador nos o%ri!a a es#re?er tratadores 8%+o#os tr=:? catch:?; para #.amadas destes m todos" Kuando ?o#H (or estruturar seu #<di!o dessa (orma, .a?ero duas aIes %6si#as Jue de?em ser tomadas& +e?antar 87o!ar; uma e5#eo e tratar uma e5#eo" 4ma e5#eo ser6 +e?antada Juando (or ?eri(i#ada uma #ondio anorma+ de (un#ionamento do pro!rama, ento o m todo Jue esta sendo e5e#utado imediatamente terminado e o #ontro+e passa para o m todo Jue o #.amou, onde pode o#orrer um tratador da e5#eo ou no" Se o#orrer um tratador, na maioria dos #asos a e5#eo para de se propa!ar a+i mesmo" Se no o#orrer um tratador outras #.amadas de m todos so Ades(eitasC, en#erradas, podendo #u+minar no t rmino do pro!rama se toda a #adeia de #.amada de m todos (or des(eita at #.e!ar em main sem Jue se a#.e um tratador para esta e5#eo" E5istem ?6rios mode+os de tratamento de e5#eIes, o mode+o adotado por Java re#e%e o nome de& Atermination mode+C, 7ustamente por essas terminaIes de m todos" ,as o Jue uma 7o!ar uma e5#eoX M suspender a e5e#uo do m todo atua+ e passar um o%7eto para o %+o#o catch mais pr<5imo na #adeia de #.amadas de m todos atua+" Isto (eito atra? s da de#+arao& throw nomedoobjeto* //ou throw new nomedaclassedoobjeto"ar!umentos do construtor% throw #omo um breaK para m todos" Como e5#eIes so o%7etos, ?o#H pode de(inir .ierarJuias de #+asses de e5#eIes, Jue mapeiem em termos de in(ormaIes as #ondiIes anormais de seu pro!rama #ontendo as mensa!ens de erro e as poss*?eis so+uIes As e5#eIes !eradas pe+a +in!ua!em perten#em a uma .ierarJuia #u7o topo a #+asse Hhrowable, imediatamente estendida por -rror e -,ception" Neste e5emp+o ?o#H ?er6 Jue os tratadores de
++7

e5#eo so es#o+.idos #omparando a #+asse da e5#eo 7o!ada e a #+asse de e5#eIes Jue o tratador di= tratar" Assim sendo o tratador& tr=: /@al!o $ue possa !erar uma e,cecao@/? catch "E#ception erro% : /@ acoes de tratamento do erro com possivelmente nova tentativa de e,ecucao dos metodos chamados@/ ? Seria #apa= de tratar todas as e5#eIes Jue este7am a%ai5o de -,ception 8na .ierarJuia; !eradas em tr= : `" )ispondo mais de um tratador 8%+o#o #at#.; em seJfHn#ia onde os primeiros s< tratam as #+asses e5#eIes mais %ai5as da .ierarJuia, poss*?e+ es#o+.er Jue #<di!o de tratamento usar #om #ada tipo de e5#eo !erada" 'or sorte, das e5#eIes +e?antadas pe+a +in!ua!em, ?o#H #omo pro!ramador s< pre#isar6 tratar as da .ierarJuia de -,ception. Neste e5emp+o iremos (orar o a#onte#imento da e5#eo Arra=8nde,VutVfDounds-,ceptionE atra? s de uma tentati?a de a#esso a um *ndi#e in?6+ido de um ?etor& A#esso a *ndi#e in?6+ido do ?etor sem #orromper o sistema, pro!ramadores C pasmemR //#lasse principalE Ar$uivo 'rincipal.java class 'rincipal : public static void main"&trin! ar!s;<% : int a;<Gnew int;0<* tr= : a;0<G+1* //linha acima !era e,cecaoE os indices validos sao $uatro:1E+E5E3 //$ual$uer codi!o escrito a$ui "depois de a;0<G+1*% //nunca sera e,ecutado ? catch"-,ception ae% : //refa4 a per!unta do indice a alterar ao usuario //e descrobre $ue ele $ueria alterar o valor no indice 3E escrevendo +5 a;3<G+5* ? &=stem.out.println"a;3<%* ? ? +5

//COMEN;ARIO9:
00V

O (ato do #<di!o imediatamente ap<s o ponto onde (oi !erada a e5#eo no ser e5e#utado te preo#upaX Wo#H !ostaria por e5emp+o de ter uma #.an#e de +i%erar re#ursos do sistema 8e5""&(e#.ar um arJui?o; antes do m todo ser terminadoX M para isso Jue e5iste em Java o %+o#o tr=: ? catch:? finall=:? Jue no e5iste em CSS, mas e5iste por e5emp+o em ,odu+a3T" A #+6usu+a finall=: ? op#iona+, seu #<di!o ?ai ser e5e#utado o#orra ou no o#orra uma e5#eo no %+o#o tr=:? " E5emp+o #+6ssi#o de uso do %+o#o tr=:? catch:? finall= :?: tr$ 0 //abre um ar$uivo //!era uma e,cecao com ar$uivos 1 catc4 (E#cecaoArIui+o e)0 //tenta recuperar a$uivo e informacoes perdidas 1 finall$ 0 ar$uivo.close"%* 1 finall= tem sido usado para (e#.ar arJui?os, parar threads e des#artar 7ane+as" E<erc9ci"s: +Q Em ?6rios dos pro!ramas anteriores men#ionamos Jue .a?eria uma maneira me+.or de tratar situaIes anormais" 4m desses pro!ramas era o do tipo a%strato de dados matri4" 9eia este pro!rama e adi#ione tratamento de e5#eIes para as #ondiIes anormais Jue podem sur!ir, tais #omo a#esso a *ndi#es in?6+idos" Comp+emente este e5er#*#io ap<s ter +ido os t<pi#os se!uintes" GERAN%O S$AS PRTPRIAS E(CESES O e5emp+o a se!uir ensina #omo tra%a+.ar #om throw, a pa+a?ra #.a?e usada para +e?antar e5#eIes" Este e5emp+o se %aseia na #+asse Pracao de TA) -RAO" Nossa e5#eo ser6 !erada Juando nas operaIes de (raIes o#orrer uma di?iso por =ero" Em Java, e5#eIes so instLn#ias de #+asses Jue perten#em a .ierarJuia Jue ini#iada, en#a%eada, pe+a #+asse Hhrowable" Neste e5emp+o #onstruiremos nossa e5#eo .erdando de -,ception Jue por sua ?e= .erda de Hhrowable"

public class .ivisao'or_ero e#ten"* E#ception : public &trin! info* public .ivisao'or_ero"&trin! i% : infoGi* ? ?
++

Wo#H de?e modi(i#ar a #+asse Pracao apresentada anteriormente na p6!ina 2], para a#eitar o se!uinte m todo& public Pracao divisao"Pracao j% t4ro'* Di+i*aoPorRero : Pracao !* if "j.denGG1% t4ro' ne' Di+i*aoPorRero(:Na cla**e Pracao:) //se for 4ero a e,ecucao nao che!a a$ui !Gnew Pracao"num@j.denEden@j.num%* return !* ? class 'rincipal : public static void main"&trin! ar!s;<% : Pracao aEbEc* aGnew Pracao"5E3%* bGnew Pracao"5E1%* &=stem.out.print">-sta eX a fracao a: >%* a.mostra"%* &=stem.out.print">-sta eX a fracao b: >%* b.mostra"%* tr$ 0 cGa.divisao"b%* c.mostra"%* 1 catc4(Di+i*aoPorRero %in4ae#cecao) 0 &=stem.out.println">Bao posso dividir por 4ero>%* 1 ? ? -sta eX a fracao a: "5/3% -sta eX a fracao b: "+/1% Bao posso dividir por 4ero

//COMEN;ARIO9 N<s no apresentamos um e5emp+o de uma e5#eo propa!ando em uma #adeia +on!a de #.amadas de m todos" ,as #om os #on.e#imentos dados, ?o#H pode (a=er isso"

0/O

Outro (ato importante Jue um %+o#o catch tam% m pode !erar e5#eIes, assim se ?o#H pe!ou uma e5#eo e reso+?eu Jue no #onse!ue trat63+a ?o#H pode (a=er um throw de+a mesma ou mudar a #+asse da e5#eo e #ontinuar propa!ando 8throw de outra e5#eo;, ou (a=er o Jue ?o#H pode para reparar o erro e 7o!ar uma e5#eo para Jue o Jue ?o#H (e= se7a #omp+etado por outros m todos" 9em%re3se Jue se ?o#H pe!ou uma e5#eo, e+a para de propa!ar" E<erc9ci"s: 03 Imp+emente, tratamento de e5#eIes #omp+eto para o e5emp+o de TA) -RAO" Antes (aa um +e?antamento das e5#eIes Jue podem ser !eradas, +em%re das restriIes matem6ti#as para o denominador em uma di?iso" 9e?e em #onta tam% m o o?er(+oN de ?ari6?eis int Jue so uma representao #om n>mero de %its (inito da seJuHn#ia dos n>meros inteiros 8#on7unto m da matem6ti#a;" Compare este tratamento #om o de outros pro!ramas por e5emp+o na di?iso por =ero, Juais as ?anta!ens Jue ?o#H pode apontar e as des?anta!ensX ;HREAD9 t.reads so (+u5os de e5e#uo Jue rodam dentro de um pro#esso 8ap+i#ao;" Norma+mente os t.reads #omparti+.am re!iIes de mem<ria, mas no ne#essariamente" 9em%re3se de en#apsu+amento" 'ro#essos, os a?<s dos t.reads permitem Jue o seu sistema opera#iona+ e5e#ute mais de uma ap+i#ao ao mesmo tempo enJuanto Jue t.reads permitem Jue sua ap+i#ao e5e#ute mais de um m todo ao mesmo tempo" Todos os pro!ramas Jue (i=emos at a!ora s< tin.am um >ni#o #amin.o, (io, (+u5o, de e5e#uo" Nen.um de+es e5e#uta?a duas #oisas 8dois pedaos de #<di!o; simu+taneamente" Qrande parte do so(tNare de Jua+idade es#rito .o7e (a= uso de mais de uma +in.a de e5e#uo, mais de um t.read" So os #.amados pro!ramas mu+tit.readed" O seu %roNser de .iperte5to #onse!ue (a=er o doNn+oad de ?6rios arJui?os ao mesmo tempo, !eren#iando as di(erentes ?e+o#idades de #ada ser?idor e ainda assim permite Jue ?o#H #ontinue intera!indo, mudando de p6!ina no .iperte5to enJuanto o arJui?o nem (oi #arre!ado tota+menteX Isto no seria poss*?e+ sem o uso de t.reads" O seu editor de te5tos permite Jue ?o#H ?6 editando o #omeo do arJui?o, enJuanto e+e est6 sendo #arre!ado do dis#oX Editar e #arre!ar do dis#o so ati?idades Jue no podem ser inter#a+adas de maneira simp+es em um pedao de #<di!o" Seu editor est6 usando t.reads, essas ati?idades esto sendo (eitas em para+e+o" Se sua m6Juina s< possui um pro#essador, esse para+e+ismo um (a+so para+e+ismo" O pro#essador tem seu tempo di?idido em peJuenos inter?a+os, em #ada inter?a+o e+e e5e#uta uma das ati?idades e ?o#H tem a sensao de Jue tudo est6 (un#ionando ao mesmo tempo, simu+taneamente" Se ?o#H um (e+i=ardo e sua m6Juina tHm mais de um pro#essador, ento seu am%iente ser6 #apa= de mapear seus t.reads em .ardNare e ?o#H ter6 rea+mente pro#essamento para+e+o" Se ?o#H o+.ar a traduo de t.reads no di#ion6rio at #apa= Jue ?o#H en#ontre um desen.o de um #arrete+ de +in.a ou da ros#a de um para(uso, este nome %astante (e+i=" Ima!ine Jue seu pro!rama #omposto por ?6rias +in.as de e5e#uo Jue (un#ionam em para+e+o 8a+!umas ?e=es estas +in.as podem se 7untar, outras se di?idir;" Cada +in.a de e5e#uo #uida de uma tare(a& trans(erir um arJui?o, tratar a entrada do usu6rio, mostrar sua 7ane+a na te+a, et#"

+5+

threads uma in?eno re#ente se #omparada #om o restante da +in!ua!em" A+!umas outras +in!ua!ens 8%em pou#as; (orne#em (a#i+idades para +idar #om t.reads, e5emp+o& ,odu+a3T"Tam% m #on.e#idos #omo +i!.tNei!.t pro#esses, t.reads so um re#urso e5tremamente di(*#i+ de se imp+ementar, de modo Jue poss*?e+ di=er Jue ou seu am%iente de pro!ramao o(ere#e (a#i+idades para +idar #om e+es, ou ?o#H no ?ai Juerer imp+ement63+osEus63+os" CRIAN%O THREA%S $SAN%O INTERFACES O$ HERANA E5istem duas maneiras %6si#as de #riar t.reads em Java, usando inter(a#es e usando .erana" 4sando .erana, sua #+asse 76 um t.read 8is a re+ations.ip;, Jue Juando ti?er seu m todo start8; #.amado ?ai e5e#utar tudo o Jue esti?er no m todo run8; em para+e+o" 4sando inter(a#es, ?o#H de(ine uma #+asse #u7o m todo run8; ?ai ser e5e#utado por um t.read" HERANA $SA%A PARA CRIAR THREA%S Se ?o#H Juer ter uma id ia do Jue ?ai a#onte#er no pro!ramin.a a%ai5o, ?e7a o desen.o ao +ado" N<s (aremos uma #orrida de T.reads& A e B" E+es sero ini#iados depois Jue o pro!rama prin#ipa+ 8main; #omear" A sai #om a+!uma ?anta!em pois ini#iado primeiro, depois sai B" A #ada +oop estes T.reads so o%ri!ados a (a=er uma pausa por um inter?a+o a+eat<rio at #omp+etarem F +oops& O,0,/,T,F" No (ina+, pedimos ao pro!rama prin#ipa+ Jue espere os T.reads terminarem seus #i#+os para se 7untar a e+es 8m todo join8; da #+asse t.read;"O m todo join no retorna enJuanto o seu t.reads no terminar" E5istem uma s rie de outras primiti?as para +idar #om T.reads& pausa" parada, retorno a e5e#uo, et#" No e5p+i#aremos todas aJui" Wo#H de?e (a=er +eituras #omp+ementares, isso Jue temos a#onse+.ado" A!ora estas +eituras podem ser mais t #ni#as, tipo !uias de re(erHn#ia, uma ?e= Jue n<s 76 (i=emos a introduo do assunto" A+!uns assuntos, a e5emp+o de T.reads e5i!em um #on.e#imento te<ri#o (orte, de modo Jue tam% m a#onse+.amos Jue ?o#H adJuira um +i?ro so%re pro!ramao #on#orrente"

public class 6euHhread e#ten"* ;4rea" : public 6euHhread"&trin! nome% :

0//

super"nome%* ? public void run"% // o metodo $ue vai ser e,ecutado no thread tem sempre nome run : for "int iG1* iA5* iFF% : &=stem.out.println"!etBame"%F > na etapa:>Fi%* tr= : sleep""int%"6ath.random"% @ 5111%%* //milise!undos ? catch "8nterrupted-,ception e% :? ? &=stem.out.println">#orrida de threads terminada:> F !etBame"%%* ? ? class #orridaHhreads : public static void main "&trin! ar!s;<% : Meu;4rea" a6b a&ne' Meu;4rea"(:Leonar"o Na+ier Ro**i:) a,*tart() b&ne' Meu;4rea"(:An"re Au7u*to Ce*ta:) b,*tart() tr= :a,8oin() ? catch "8nterrupted-,ception i!norada% :? tr= :b,8oin() ? catch "8nterrupted-,ception i!norada% :? ? ? Leonar"o Na+ier Ro**i na etapa53 Andre Au!usto #esta na etapa:1 Andre Au!usto #esta na etapa:+ Leonar"o Na+ier Ro**i na etapa5. Andre Au!usto #esta na etapa:5 Leonar"o Na+ier Ro**i na etapa5A Leonar"o Na+ier Ro**i na etapa5@ Andre Au!usto #esta na etapa:3 Andre Au!usto #esta na etapa:0 #orrida de threads terminada:Andre Au!usto #esta Leonar"o Na+ier Ro**i na etapa5S Corri"a "e t4rea"* ter%ina"a5Leonar"o Na+ier Ro**i

t4rea" A thread D

INTERFACES $SA%AS PARA CRIAR THREA%S

+53

Co+o#ar sua #+asse a%ai5o da #+asse T.reads em uma .ierarJuia, as ?e=es um preo muito !rande para ter um m todo de+a rodando em um T.read" M por isso Jue T.reads pode ser #riados usando inter(a#es" Wo#H s< tem Jue di=er Jue imp+ementa a inter(a#e Uunnable, Jue #omposta do m todo run"%. Kuando um Hhread #onstru*do usando #omo ar!umento uma #+asse Jue imp+ementa a inter(a#e Uunnable, #.amar o m todo start para este thread (a= #om Jue o m todo run8; de nossa #+asse #ome#e a ser e5e#utado neste t.read para+e+o"

public class Uodeme-mTmHhread i%ple%ent* Runnable : public &trin! str* //nome do objeto $ue vai ter o metodo run rodado em um //thread public Uodeme-mTmHhread"&trin! nome% : strGnome* ? public void run"% : for "int iG1* iA5* iFF% : &=stem.out.println"strF > na etapa:>Fi%* ? //As mensa!ens de corrida terminada poderiam se postas a$ui. ? ?

class HhreadsUodadores : public static void main "&trin! ar!s;<% : ;4rea" a6b Ro"e%eE%U%;4rea" leo6an"re leo&ne' Ro"e%eE%U%;4rea"(:Leonar"o Na+ier Ro**i:) an"re&ne' Ro"e%eE%U%;4rea"(:An"re Au7u*to Ce*ta:) a&ne' ;4rea"(leo) a,*tart() b&ne' ;4rea"(an"re) b,*tart() tr= : a,8oin() ? catch "8nterrupted-,ception i!norada% : ? //espera thread terminar seu metodo run tr= : b,8oin() ? catch "8nterrupted-,ception i!norada% : ? ? ?
0/F

thread A t4rea" D

3eonardo Oavier Uossi na etapa:1 An"re Au7u*to Ce*ta na etapa53 An"re Au7u*to Ce*ta na etapa5. 3eonardo Oavier Uossi na etapa:+ An"re Au7u*to Ce*ta na etapa5A 3eonardo Oavier Uossi na etapa:5 3eonardo Oavier Uossi na etapa:3 An"re Au7u*to Ce*ta na etapa5@ 3eonardo Oavier Uossi na etapa:0 An"re Au7u*to Ce*ta na etapa5S

E<erc9ci"s: => As tare(as de transpor uma matri= ou (a=er o Aespe+.oC de uma ima!em 8Jue pode ser representada por uma matri=; so e5emp+os (6#eis de tare(as Jue podem ser di?ididas em dois ou mais T.reads" M +<!i#o Jue aJui estaremos %us#ando tirar ?anta!em da poss*?e+ e5istHn#ia de mais de um pro#essador e tam% m %us#ando +i%erar o T.read prin#ipa+ dessa #omputao, para Jue e+e possa (a=er outras ati?idades antes do join"%. Es#o+.a uma dessas tare(as e imp+emente3as usando T.reads" )i#a& os T.reads de?em ser #onstru*dos de modo a #onter a re(erHn#ia para a matri= Jue ?ai arma=enar o resu+tado, a re(erHn#ia para a matri= ori!ina+ e os ?a+ores Jue indi#am em Jue 6rea da matri= este T.read de?e tra%a+.ar" 'or e5emp+o& no #aso da in?erso da ima!em um T.read tra%a+.aria em uma metade e o outro na outra metade" Seria interessante imprimir na te+a os instantLneos da matri= resu+tado para ?o#H ?er o tra%a+.o sendo (eito em para+e+o" PENSAN%O M$'TITHREA%E% Este t<pi#o dis#ute a+!uns dos pro%+emas Jue podem sur!ir Juando +idando #om t.reads e apresenta a+!umas das so+uIes da +in!ua!em" No nos apro(undaremos muito em t.reads" E5iste um e5emp+o #+6ssi#o dos pro%+emas Jue podem a#onte#er Juando ?o#H est6 usando #on#orrHn#ia" Ima!ine Jue ?o#H tem um pro!rama Jue +H dados em %ytes de a+!um +u!ar 8te#+adoEdis#o; e os transmite ?ia rede" Wo#H de#idiu usar t.reads porJue no Juer (i#ar #om um pro!rama de um >ni#o (+u5o de e5e#uo %+oJueado porJue est6 esperando o te#+ado ou o dis#o enJuanto poderia estar tentando transmitir parte de seu %u((er pe+a rede" 'ara ta+ ?o#H di?idiu o seu pro!rama em dois t.reads Jue (i#am repetindo o mesmo #on7unto de aIes& T.read A, En(i+eirando ?a+ores do te#+ado 89eitura;& 039H ?a+or do (onte" /3Consu+ta o n>mero de e+ementos da (i+a" T3Soma um a esse n>mero" F3En(i+era o ?a+or +ido"

+55

T.read B, )esen(i+eirando os ?a+ores 8E es#re?endo3os na sa*da;& 03Consu+ta o taman.o da (i+a se (or maior Jue =ero e5e#uta pr<5imo passo /3Retira e+emento da (i+a" T3)e#rementa #ontador de e+ementos" Os seus t.reads podem no rodar em inter?a+os de(inidos, re!u+ares de tempo" A+!uns pro%+emas podem sur!ir pois a mesma re!io de mem<ria a#essada por dois (+u5os de e5e#uo distintos Jue podem ter e5e#utados apenas a+!uns de seus ApasssosC& public class HhreadA : //3eitura while "9fim3eitura% : -nfileraTm"%* ? ? public class HhreadD : //-scrita while "9fim-scrita% : -screve".esenfileraTm"%%* ? ?

Atri%uto No e+ementos T o =3Consu+ta N e+ementos33333 T @3In#rementa No e+ementos33 F " F " F " T " T T.read A

-i+a& T.read B n3Y)Z3YRZ3YOZ3n " n3Y)Z3YRZ3YOZ3n " n3Y)Z3YRZ3YOZ3n n3Y)Z3YRZ3YOZ3n 33333Consu+ta taman.o da (i+a3A n3Y)Z3YRZ3n 33333333333Retira um e+emento3B n3Y)Z3YRZ3n 333)e#rementa No e+ementos3C n3Y)Z3YRZ3n "

A seJuHn#ia de operaIes =+@+A+B+C #orrompe o estado de sua estrutura de dados" Se um s< t.read esti?esse e5e#utando so%re a mesma estrutura, ainda assim poderiam tam% m .a?er momentos em Jue o atri%uto n>mero de e+ementos no re(+ete e5atamente Juantos esto na (i+a, mas isso +o!o seria #onsertado" S< Jue #om dois t.reads, um outro t.read pode usar essa in(ormao in#onsistente sem Jue .a7a tempo para e+a ser reparada" Seu pro!rama pode (a+.ar Juando ?o#H tentar retirar um e+emento de uma (i+a ?a=ia"

0/2

A+!uns dos passos dos pro!ramas a#ima podem ser di?ididos em passos menores, mas o Jue importa nesse e5emp+o Jue sem o uso dos re#ursos espe#*(i#os da +in!ua!em imposs*?e+ tornar este pro!rama se!uro" O idea+ para este nosso e5emp+o seria Jue um Hhread ti?esse Jue esperar um #i#+o do outro Hhread terminar para ini#iar o seu pr<5imo #i#+o e ?i#e ?ersa, ou se7a os #i#+os teriam Jue ser sin#roni=ados, o#orrer um ap<s o outro, podendo inter#a+ar #i#+os do Hhread A #om #i#+os do Hhread B, mas no pedaos desses #i#+os" Em #asos assim , #ostuma di=er Jue #ada #i#+o #ompIe um #on7unto de aIes indi?is*?e+" A!ora Jue ?o#H 76 sa%e a so+uo, %asta sa%er #omo imp+ement63+a" Os m todos -nfileraTm8;[ e .esenfileraTm8;[ de?em ser espe#i(i#ados #omo sin#roni=ados" E?ite espe#i(i#ar m todos muito !randes #omo sin#roni=ados, pois outros Hhreads tero Jue esperar muito tempo para #omear a e5e#utar" public s=nchroni4ed void -nfileraTm"b=te a% : //esta parte voce ja sabe ? public s=nchroni4ed D=te .esenfileraTm"% : //D=te e uma classe wrapperE ela e i!ual a null se nao ha elementos //o restante voce ja sabe ? A!ora sua #+asse se!ura" Wo#H s< de?e se preo#upar #om a sin#roni=ao dos m todos do seu pro!rama" Os m todos e as #+asses da +in!ua!em 76 so es#ritos para serem AT.read sa(eC, o Jue !erou muito tra%a+.o para os pro!ramadores do AJa?a teamC" !!COMEN;ARIO9 A#a%amos a!ora o t<pi#o so%re t.reads e tam% m o tutoria+" Antes de ?o#H #omear a estudar outros te5tos, um #oment6rio (ina+& Se ?o#H Juiser rodar um m todo de uma #+asse 76 pronta em um t.read, +em%re3se de #o+o#63+o 8a sua #.amada; dentro de um m todo #om o nome run8;" O #$E &OCO PO%E EST$%AR A PARTIR %E AGORA $SAN%O :A&A As opIes so muitas& pro!ramao #on#orrente, inter(a#es !r6(i#as, sistemas distri%u*dos, et#" O importante Jue para todos estes assuntos, ?o#H ?ai ter Jue sa%er as t #ni#as ensinadas neste te5to"

+57

0/V

,2dice re-issi1":

+5

0TO

C"2teYd":

+3+

0T/

Bi30i"gra ia: A+!uns dos tutoriais aJui men#ionados se tornaro +i?ros, de modo Jue (aa uma %us#a pe+os nomes dos autores tam% m" importante Jue ?o#H

Y0Z Rum%au!., B+a.a ,", 'remer+ani G", Eddy -" P 9orensen G" , IVbjectQVriented 6odelin! and .esi!nJ. 'renti#e @a++, 0110" Y/Z ^erni!.am Brian G" , Rit#.ie )ennis ," , AT.e C 'ro!rammin! 9an!ua!eC , En!+eNood C+i((s, N"J"&'renti#e3@a++ In#, 01]V YTZ Ru%ira, C","-" AStru#turin! -au+t3To+erant O%7e#t Oriented Systems 4sin! In.eritan#e and )e+e!ationC, '.")" T.esis, )epartment o( Computin! S#ien#e, 4ni?ersity o( NeN#ast+e upon Tyne, O#to%er 011F, see C.apter /" YFZ 9emay 9aura, 'erBins C.ar+es 9", ATea#. jourse+( JAWA in /0 daysC, samsnet, 0112 YUZ ?an @o(( A", S.aio S", Star%u#B O", Sun ,i#rosystems In#, A@ooBed on Ja?aC, Addison3Ges+ey, 0112 Y2Z @aro+d E++iotte Rusty, ABreNin! Ja?a& A Tutoria+C, .ttp&EEsunsite"un#"eduE7a?a(aJE7a?atutoria+".tm+ Y]Z Campione ,ary, Ga+rat. ^at.y, AT.e Ja?a Tutoria+R, O%7e#t3Oriented 'ro!rammin! (or t.e InternetC, .ttp&EENNN"aN"#om"E#pE7a?aseries".tm+

+33

Você também pode gostar