Deitel - Cap06 - Metodos

Embed Size (px)

Citation preview

Mtodos:um exame mais profundo OBJnO Nestecaptulovocaprender: Comomtodos e camposstat1coassoCiadosauma classe rn teiraem vezdeinstnciasespecficasdaclasse. Comoutthzdrmtodos MathcomunsdisponveisnaAPIdo Java Osmecarllsmus pd\n" , 78di el, die2,sum} ;79 f1gurc6. 9AclasseCrdpsSi mul a o JOgo dedado CICi(Parte 2 de3 )1 80Capi tul o6Metodos.umexamematsprofundo oreturnsum; //retornaasomadosdados 81}//fimdomtodorol l Di ce 82)//fimdacl asseCraps ftgura 6.9A classe Craps Si mul a o jogo de dados craps.(Parte 3 de 3. )O jogo razoavelmente complexo. O jogador pode ganhar ou perder na primeira rolagem ou pode ganhar ou perder em qualquer rolagem subseqente. O mtodo p l ay (linhas 21-65) utiliza a varvel locmyPoi nt(linha 23) para armazenar a 'pontuao' se o jogador no ganhar nemperdernoprimeirolanamento,avarivellocalgameStatus(linha 24)paramonitorar ostatusgeraldo jogoea varivellocal sumOfDi c e (linha 26) para manter a soma dos dados para o lanamento mais recente. Observe que myPoi nt inicializada como O a fm de assegurar que o aplicativo compilar. Se voc no inicializar myPoi nt, o compilador emite um erro, pois no atribudo a myPoi ntum valor em cada desvio da instruoswi tche, conseqentemente o programa poderia tentar utilizar myPoi nt antes de ela receber um valor. Por comparao,gameStatusno exigeumainicializao porque recebeumvaloracadadesviodainstruoswi tch -portanto, garantido que ser inicializada antes de ser utilizada. 1//Fi g. 6 . 10 : CrapsTest. j ava 2// Apl i cativoparatestaracl asseCraps.3 4publ i c cl assCrapsTest 5 ( 6publ i cstaticvoi d mai n ( Stringargs [] 7{ 8Crapsgame =newCraps ( ) ; 9game. pl ay( ) ;// jogaumapartidadecraps 10//fimdemai n11}//fimdacl asseCrapsTest Pl ayerrol l ed5+6=1 1Pl ayerwi ns Pl ayerrol l ed1+23 Pl ayerl oses Pl ayerrol l ed5+4=9 Pointi s 9 Pl ayerrol l ed2+2=4 Pl ayerrol l ed2+6 8 Pl ayerrol l ed4+2=6 Pl ayerrol l ed3+6=9 Pl ayerwi ns Pl ayerrol l ed2+6 8 Pointi s 8 Pl ayerrol l ed5+1 6 Pl ayerrol l ed2+1=3 Pl ayerrol l ed1+6=7 Pl ayerl oses figura6. 1 OAplicatiVOparatestaraclasseCraps. Observe que a varivel local gameStatus declarada como um novo lipo chamado Status, que declaramos na linha1 1 .O upo Status declarado como um membro pri v ateda classe Craps, porque Status ser utilizado somente nessa classe. Status um tipo declarado pelo programador chamado de enumerao, que, na sua forma mais simples, declara um conjunto de constantes representado pelos identifcadores. Uma enumerao um tipo especial de classe que introduzida pela palavra-chave e num (nova no J2SE 5.0) e um nome do tipo (nesse caso, Status).Como com qualquer classe, as chaves ( { e }) delimitam o corpo de uma declarao e num. Dentro das chaves h uma lista separada por vrgulas de constantes de enumerao, cada uma representando um valor nico. Os identificadores em uma e num devem ser nicos. (Voc aprender mais sobre enumeraes no Captulo 8. )6. 1IEscopodas declaraoes1 8 1 Boaprticadeprogramao6.3 Utilize somente letrasmaisculasnos nomes das constantes.Isso faz com que as constantes sejamdestacadasem um programae lembremo programador de que constantes de enumerao no so varivs. VanavisdotipoStatuspodemrceber somenteuma dastrsconstantsdeclaradasnaenumeraoouocorreraumerro de compilao. Quando se ganha o jogo, o programa confgura a varivel local gameStatus como Status.WON (linhas 33 e 54). Quando se perdeo jogo,programa confguraavarivellocalgameS tatuscomoStatus.LOST(linhas38e57).Casocontrrio,oprograma confgura a varivel local gameStatus como Status . CONTINUE (linha 41 )para indicar que os dados devem ser lanados novamente. Boaprticadeprogramao6.4 Utilizar WIIStames de enumerao(como Status. WON,Status. LOST e Status.CONTINUE)em vez devalores literais inteiros(como O, Ie 2) podetorar os programas mais fceis delere manter. A linha 26 no mtodo p 1 ay chama ro 1 1Di c e, que seleciona dois valores aleatrios entre Ie 6, xibe o valor do primeiro dado, o valor do segundo dado e a soma dos dados, e relora a soma dos dados. Em seguida, o mtodo p 1 ayinsere a instruo swi te h nas linhas 29-45, que utilizam o valor sumOfDi c e na linha 26 para determinar se ojogo foi ganho ou perdido, ou se deve continuar com outro lanamento. A soma: dos dados que resultariam em uma vitria ou perdano primeiro lanamento so declaradas como constantes pub 1 i cfina 1s tat i ci nt nas linhas 14-18.Estas so utilizadas nos cases da instruo swi te h.Os nomes dos identificadores utilizam a terminologia de cassino para essas somas.Observeque essasconstantes,comoocorrecomconstantesenum,sodeclaradas,porconveno,comtodasasletrasmaisculas, fazendo-as se destacar no programa. As linhas 3 1-34 determinam se o jogador ganhou no primeiro lanamento com SEVEN (7) ou YOLEVEN ( 1 1).As linhas 35-39 determinam se o jogador perdeu no primeiro lanamento com SNAKE_EYES (2), TREY (3) ou BOX_CARS (12).Depois do primeiro lanamento, se o jogo no terminou, a opo defau1 t(linhas 40-44) salva sumOfDi c e em myPoi nt(linha 42) e exibe a pontuao (linha 43). Se ainda estivermos tentando 'fazer nossa pontuao' (isto , o jogo continua a partir de um lanamento anterior), o loop nas linhas 4858executa.Alinha50lanaos dadosnovamente.Na linha53, sesumOfDi c ecorresponderamyPoi nt,alinha54 configura yameSta tus como Status . WON e ento o loop termina porque o jogo est completo. Na linha 56, se sumOfDi c e for igual a SEVEN (7), a linha57 configura gameS tatus como Status . LOST e o loop termina porque o jogo est completo.Quando o jogo completa, as linhas 61 -64 exibem uma mensagem que indica se o jogador ganhou ou perdeu, e o programa termina. Observe a utilizao dos vrios mecanismos de controle de programa que j discutimos. A classe Craps utiliza trs mtodos -ma in, p 1 ay(chamadode ma i n)ero 1 1 Di c e(chamadoduas vezesdep 1 ay)-e as instrues de controle swi te h,whi 1 e,i f . . . e1 seei faninhadas. Tambm observe o uso de mltiplos rtulos case na instruo swi t e h para executar as mesmas instrues para as somas de SEVEN e YO_ LEVEN (linhas 3 1-32) e para as somas de SNAKE_EYES, TREY e BOX _ CARS(linhas 35-37). Talvez voc se pergunte por que declaramos as somas dos dados como constantes pub 1 i c fi na 1stat i c i nt em vez de constantes e num.A resposta reside no fato deque o programa deve comparar i ntsumOfDi c e(linha 26) com essas constantes para determinar o resultadodecadalanamento.SuponhaquefssemosdeclararconstantescontendoenumSum(porexemplo,Sum. SNAKE_EYES) representando as cinco somas utilizadas no jogo para ento utilizar essas constantes no lugar das variveis fi na 1nos cases da instruo swi tch(linhas 29-45). Isso impediria a utilizao desumOfDi c e como a exprt!so de controle da instruoswi te ho Java no permite que umi nt seja comparado com uma constante de enumerao. Para conseguir a mesma funcionalidade do programa atual, teramos de utilizar uma varivel currentSum do tipo Sum como a expresso de controle do swi tch. lnfelizmente, o Java no fornece uma maneirafcil de converter um valori ntemuma constante e numparticular. Traduzir umi ntem uma constante enum exigiria uma instruo swi tch separada. lsso seria claramente incmodo e no melhoraria a legibilidade do programa (derrotando assim o propsito do uso de uma enum), portanto estamos em melhor situao utilizando as constantes pub1 i c fi na 1stat i c i nt para representar as somas dos dados. Escopo dasdeclaraes Vocv1 udeclaraes de vrias entidades Java como classt!,mtodo.variveis e parmtrus.As declaraes introdutemnomes que podem ser utilizados para referenciar essas entidades Java.O escopode uma declarao a parte do programa que pode referenciar a entidade declarada pelo seu nome.Diz-se que essa entidade est 'no escopo' para essa parte do programa. Esta seointroduzvrias questes importantes de escopo. ( Para mais informaes sobre escopo,consulte a Java Languuge Specification, Section 6.3: Scope of a Dec/aration, em j ava . sun . com/docsjbooks/j 1 s/second_e diti on/htm1 /names . doe . htm1 #103228). As regras bsicas de escopo so estas: l . O escopo de uma declarao de parmetro u corpo do mtodo em lU a declarao aparece. 2.O escopo de uma declarao de varivel local vai do ponto em que a declarao aparece at o final desse bloco. 3.O escopo de uma declarao de varivel local que aparece na seo de i nicializao do cabealho de uma instruo for e ucorpo da instruo for com as outras expresses no cabealho. - O t!copo de um mtodo ou campo de uma classe o corpo mte1ro da dase. lso permite que mtodos no-s tat 1 c de uma dat utilizem os campos e outrosmtodos da classe. 1 82Capitulo6Metodos.umexdmeraaprofundo Qualquer bloco pode conter dedaraes de varivel. Se uma varvd local ou um parmetro em um mtodo tiver o mesmo nome de um campo, o campo permanece 'oculto' at que o bloco termine a execuo-isso chamadosombreamcnto. No Captulo 8, discutimos como acessar campos 'sombreados'. Errocomumdeprogramao6.1 O Umerro de compilao ocorre quando um varivel /oca/ declarada mais de uma vez emum mtodo. Dicadeprevenodeerros6.3 Utilize nomes dierenre pr campos e variveis loai sp a a eiar erros delgica sutis que oorequndo um mto chama e umvarivel lol d mto sombrei a um campo com o mesma nome n clsse. O aplicativo nasfiguras 6. 1 1e 6. 1 2 demonstra as questes de escopo para campos e variveis locais. Quando o aplicativo inicia a execuo, o mtodo ma i n da classe ScopeTes t(Figura 6. 1 2, linhas 7-1 1 )cria um objeto da classe Scope (linha 9) e chama o mtodo beg i n do objeto (linha I O) para produzir a sada do programa (mostrada na Figura 6. 1 2). 1// Fi g . 6 . 1 1 : Scope. j ava 2// AclasseScopedemonstraosescoposdecampoedevarivell ocal . 3 4pub l i c cl assScope 5{ 6// campoacessvelparatodososmtodosdessacl asse 7privatei ntx=1 ; 8 9// mtodobegincri aei ni ci a l i zaavari vell ocalx 10// echamaosmtodosuselocal VariableeuseField 11pub l i c voi dbegi n( )12 { 13i ntx 5;// varivell ocalxdomtodosombrei aocampox 14 15System.out. printf(" l ocalxi n methodbeg i n i sd\n" ,x) ; 16 17useLocal Vari abl e( ) ;//uselocal Vari abl etemumavarivell ocalx 18useFiel d( ) ;//useFi el duti l i zaocampoxdacl asseScope 19uselocalVari abl e( ) ;//useLocal Vari abl erei n i ci al i zaavarivellocalx 20useFi el d( ) ;// campoxdacl asseScoperetmseuvalor 21 22System. ou t . pr{ntf(" \nl ocalxi nmethodbegi ni s %d\n" ,x.) ;23// fi mdomtodobegi n 24 25//cri aei ni c i al i zaavari vell ocalxdurantecadachamada 26publ i c voi d useLocalVari abl e( )27 { 28i ntx=25;//i ni ci al i zadatodavezqueuseLoca l Variabl echamado 29 30System. ou t . pri ntf( 31"\nl ocalxonenteringmethoduselocal Vari abl e1 sJ\n" ,x) ;32++x;// modi fi caavari vell ocalxdessemtodo 33System. out. pri ntf( 34" l ocalxbeforeexi t i ngmethoduselocal Vari abl ei s %d\n" ,x) ;35// fi mdomtodouselocal Variable 36 37// mod i fi caocampoxdaclasseScopedurantecadachamada 38 publ i c voi duseFi el d ( )39 { 40System. ou t . pri ntf( fagura6. lIA classe Scope demonstrando os escopos deumcampo e de vanve1s loca1s.(ParteIde 2.) 11 t 1 c u' ""cr t lo:l l loyoeUJUuuC l c l tl1 ll 11 ,X ) ; 42x*=10;// mod i fi caocampoxdacl asseScope 43System. out. pri ntf{ 44" fieldxbeforeexl t i ngmethoduseFi el di s d\n" ,x} ;45//fi mdomtodouseFi el d ,6//fimdacl asseScope 611bcopodasdecldfaoe1 83 2Ul8 611A classeScopedemonstrando os escopos deumcampo e de vanveisloca1s.(Parte 2 de 2. ) Na classe Scope, a linha 7 declara inicializa o campo x como 1. Esse campo permanece sombreado (oculto) em qualquer bloco (ou mtodo) que declara uma varivel local chamada x.O mtodo beg i n(linhas 1 1-23) declara uma varivel local x (linha13) e a inicializa para 5. O valor dessa varivel local gerado para mostrar que o campo x (cujo valor 1) permanece sombreado no mtodo begi n.O programa declara dois outros mtodos -useloca 1 V a ri ab 1 e(linhas 26-35)euse Fi e 1 d(linhas38-45) -, osquais no aceitam nenhumargumentoenoretornamresultados.Omtodobegi nchamacadamtododuasvezes(linhas1 7-20).Omtodo use loca 1 V a ri ab 1 e declara a varivel local x (linha 28). Quando use loca1 V a ri ab 1 e chamado pela primeira vez (linha1 7), ele cria a varivel local x e a inicializa como 25 (linha 28), gera a sada do valor de x (linhas 30-3 1 ), incrementa x (linha 32) e gera a sada do valor de x novamente (linhas33-34). Quando use1 Loca1 V a ri ab 1 e chamado uma segunda vez (linha19), ele recria a varivel local x e a reinicializa como 25, assim a sada de cada chamada a useloca1 V a ri ab 1 e idntica. 1//Fi g. 6 . 12 : ScopeTest. java 2// Apl i cati voparatestaracl asseScope. 3 4publ i c cl assScopeTest 5 { 6// pontodepartidadoapl i cativo 7publ i c stati cvoi dmai n { Stringargs[] 8 ( 9ScopetestScope newScope{ ) ; 10testScope.begi n { ) ; 11//fi mdemai n12}// fimdacl asseScopeTest l ocalxi n methodbeg i n i s 5 l ocalxonenteringmethoduselocal Vari abl ei s 25 l ocalxbeforeexi ti ngmethoduselocal Variablei s 26 fi el dxonenteringethoduseFi el di sfi el dxbeforeexi t i ngmethoduseFi el di s 10 l ocalxonenteringmethoduselocal Vari abl ei s 25 l ocalxbeforeexi ti ngmethoduseLocal Vari abl ei s 26 fi el dxonenteringmethoduseFi el di s 10 fi el dxbeforeexi t i ngmethoduseFi el di s 100 l ocalxi n methodbeg i n i s 5 f1gurao1 1 Apl1cauvo para testara classe Scope. O mtodo use Fi e 1 d no declara nenhuma varivel local. Portanto, quando se referencia x,o campo x (linha 7) da classe ulilzado. Ao ser chamado pela primeira vez (linha 1 8),o mtodo useFi e 1 d gera sada do valor ( 1)do campo x (linhas 40-41 ), multiplica o campo x por 10(linha 42) e gera a sada do valor (10) do campo x novamente (linhas 43-44) antes de retornar. A prxima vez que o mtodo useFi el d chamado (linha20), o campo contm seu valor modificado, 10, assim o mtodo gera sada de10 e ento100. Por fim, no mtodo begi n, o programa gera sada do valor da varivel localx novamente (linha 22) para mostrar que nenhum mtodo chama a varivel local x do s ta rt modificado, pois todos os mtodos se referiram s variveis identificadas como x nos outros escopos. 1 84Capitulo6Metodos.umexamern