Você está na página 1de 39

Mtodos: um exame

mais profundo
OBJnO
Neste captulo voc aprender:
Como mtodos e campos stat1c o assoCiados a uma classe rn
teira em vez de instncias especficas da classe.
Como utthzdr mtodos Math comuns disponveis na API do Java
Os mecarllsmus p<HC pasar rnforrrrae entre mtodo:
Coro o rrrecanrsmo de retorno/chamada de retodo e uporta<o
pela ptlha de chamadas de mtodos e registres de ativao.
Como pacotes agrupam classes relacionadas.
Coro uttltzar a geraau de nurero aleatorru para rrrtplerrremar
aplicattvos de Jogos de azar
Como a vrstbthdade das declaraes lirnttada a regre epecfica
dos programas.
O que a sobrecarga de mtodo e como criar mtodos sobrecarre
gados.
o
"i
f
E
=
"
6 I
6.2
63
6.4
6.5
6.6
6.7
6.8
6.9
Introduo
Mdulos de programa em Java
Mtodos stati c. campos stati c e classe Math
Declarando mtodos com mltiplos parmetros
Notas sobre a declarao e utilizao de mtodos
Pilha de chamadas de mtodo e registras de ativao
Promoo e coero de argumentos
Pacotes da API do Java
Estudo de caso: Gerao de nmeros aleatrios
6 9 I Escalonamento e deslocamento generalizados de nmeros aleatrios
6. 0 '; Repetio de nmeros aleatrios para teste e depurao
6.1 o Estudo de caso: Um jogo de azar (introduo a enumeraes)
6.1 Escopo das declaraes
6. 1 7 Sobrecarga de mtodo
6. 1 lntroduao 165
6.1 \ (Opcional) Estudo de caso de GUis e imagens grficas: Cores e formas preenchidas
6.1 i (Opcional) Estudo de caso de engenharia de software: Identificando operaes de classe
b r 5 Concluso
Resumo I Terminologia I Exerccios de reviso I Respostas dos exerccios de reviso I Exerccios
Introduo
A maioria dos programas de computador que resolvem problemas do mundo real bem maior que os programas apresentados nos
captulos iniciais deste livro. A experincia mostrou que a melhor maneira de desenvolver e manter um programa grande constru-lo a
partir de pequenas e simples partes, ou mdulos. Essa tcnica chama-se dhidir para conquistar. Apresentamos mtodos no Captulo 3.
No Captulo 6, estudaremos os mtodos mais detalhadamente. Enfatizamos como declarar e utilizar mtodos para facilitar o projeto,
implementao, operao e manuteno de grandes programas.
Voc ver que possvel que certos mtodos, denominados mtodos stati c, sejam chamados sem a necessidade de um objeto da
classe existir. Aprender a declarar um mtodo com mais de um parmetro. Voc tambm aprender como o Java capaz de monitorar
qual mtodo est atualmente em execuo, como variveis locais dos mtodos so mantidas na memria e como um mtodo sabe para
onde retornar depois de completar a execuo.
Faremos uma breve digresso para examinarmos as tcnicas de simulao com a gerao de nmeros aleatrios e desenvolveremos
uma verso do jogo de dados de cassino denominado caps, que utilizar a maioria das tcnicas de programao apresentadas at agora
neste livro. Alm disso, voc aprender duas tcnicas para declarar valores que no podem mudar (isto , constantes) nos seus programas.
Boa parte das classes que voc utilizar ou criar ao desenvolver aplicativos ter mais de um mtodo com o mesmo nome. Essa
tcnica, conhecida como sobrecarregamento, utilizada pelos programadores para implementar os mtodos que realizam tarefas
semelhantes para argumentos de tipos diferentes ou possivelmente para diferentes nmeros de argumentos.
2 Mdulos de programa em Java
H trs tipos de mdulos em Java-mtodos, classes e pacotes. Programas Java so escritos combinando novos mwdos e classes que o
programador escreve com mtodos e classes predefnidos disponveis na Java Application Programming Interface (tambm conhecida
como API do Jaa ou biblioteca de classes Java) e em vrias outras bibliotecas de classes. Em geral, classes relacionadas so agrupadas
em pacotes de modo que possam ser importadas nos programas e reutilizadas. Voc aprender a agrupar suas prprias classes em pacotes
no Captulo 8. A API do Java fornece uma rica coleo de classes predefinidas que contm mtodos para realizar clculos matemticos
comuns, manipulaes de string, manipulaes de caractere, operaes de entrada/sada, operaes de banco de dados, operaes de
rede, processamento de arquivo, verifcao de erros e muitas outras operaes teis. As classes da API do Java fazem parte do J2SE
Oevelopment Kit (JDK) 5.0.
Boa prtica de programao 6.1

Familiarize-se com a rica coleo de classes e mtodos fornecidos pela API do Java (jovo. sun. com/ j2se/5. O/does /o pi I index. html). Na
Seo 6.8, apresemamos uma viso geral dos vrios pacotes comuns. No Apndice G, explicamos como navegar pela documemao da A PI do Java.
166 Capitulo Metodo:. um exame mal: profundo
Observao de engenharia de software 6. I
No tente reinvemar a roda. Quando possvel, reutilize as classes e mtodos na API do Java. Isso reduz o tempo de desenvolvimento de
programas e evita a introduo de erros.
Os mtodos (denominados funs ou procedimentos nas outras linguagens de programao) permitem que o programador
modularize um programa separando suas tarefas em unidades autocontidas. Voc declarou mtodos em cada programa que escreveu.
Esses mtodos so s vezes chamados de mtodos declarados pelo programador. As instrues reais no corpo dos mtodos so escritas
uma nica vez, reutilizadas talvez de vrios locais em um programa e permanecem ocultas para outros mtodos.
H vrios motivos para modularizar um programa por meio de mtodos. Um deles a abordagem de dividir e conquistar, que tora
o desenvolvimento de programas mais gerencivel, possibilitando que eles sejam construdos a partir de fragmentos simples. Outro a
capacidade de reutilizao de sofare -utilizar mtodos existentes como blocos de construo para criar novos programas.
Freqentemente, voc pode criar programas principalmente a partir de mtodos padronizados em vez de construir um cdigo
personalizado. Por exemplo, nos programas anteriores, no foi necessrio defnir como ler os valores dos dados a partir do teclado -o
Java fornece essas capacidades na classe Scanner. Um terceiro motivo evitar a repetio de cdigo. Dividir um programa em mtodos
signifcativos torna o programa mais fcil de depurar e manter.
Observao de engenharia de software 6.2
Para promover a capacidade de reutilizao de software, todos os mtodos devem escar limitados realizao de uma nica tarefa bem definida eu
nome do mtodo deve expressar essa tarefa efetivamente. Esses mtodos tornam mais fcil escrever, depurar, manter e modificar programas.
Dica de preveno de erros 6.1
Um pequeno mtodo que realiza uma tarefa mais fcil de testar e depurar do que um mtodo maior que realiza muitas tarefas.
Observao de engenharia de software 6.3
Se voc no puder escolher um nome conciso que expresse a tarefa de um mtodo, seu mrodo ralvez reme reulizur um nmero excessi1o de wref as
Em geral, melhor dividir esse mtodo em vrias declaraes de mtodo menores.
Como voc sabe, um mtodo invocado por uma chamada de mtodo e, quando o mtodo chamado completa sua tarefa, ele retorna um
resultado ou simplesmente o controle ao chamador. Uma analogia a essa estrutura de programa a forma hierrquica de gerenciamento
(Figura 6.1). Um chefe (o chamador) solicita que um trabalhador (o mtodo chamado) realize uma tarefa e informe (isto , retorne) os
resultados depois de completar a tarefa. O mtodo chefe no tem conhecimento de como o mtodo trabalhador realiza suas tarefas designadas. O
trabalhador tambm pode chamar outros mtodos trabalhadores sem que o chefe saiba. Esse 'ocultamento' dos detalhes de implementao
promove a boa engenharia de software. A Figura 6.1 mostra o mtodo chefe se comunicando com vrios mtodos trabalhadores de uma
maneira hierrquica. O mtodo chefe divide as responsabilidades entre os vrios mtodos trabal hadores. Observe que t r aba l hadorl
a tua como um mtodo 'chefe' para traba l hador4 e traba l hadorS.
chefe
/ t
traba 1 hadorl traba 1 hador2 traba 1 hador3
I \
t r aba 1 hador4 traba 1 hador5
Figra 6.1 Relacionamento hierrquico de mtodo trabalhador/mtodo chefe.
Mtodos static, campos static e classe Math
[contador <= 10]
Como voc sabe, cada classe fornece mtodos que realizam tarefas comuns sobre os objetos da classe. Por exemplo, para aceitar a entrada
de dados, voc chamou os mtodos em um objeto da classe Scanner que foi inicializado no seu construtor para obter a entrada a partir do
fuxo de entrada padro (System. i n). Como veremos no Captulo 14, Arquivos e f
i
uxos, voc pode inicializar uma Scanner para obter a
entrada a partir de outras origens, como um arquivo no disco. Um programa poderia ter um objeto Scanner que insere informaes a
partir do fuxo de entrada padro e um segundo Scanner que insere as informaes a partir de um arquivo. Cada mtodo de entrada
chamado no fluxo de entrada padro do Scanner obteria a entrada do tedado, e rada mtodo de entrada chamado no arquivo do
Scanner obteria a entrada a partir do arquivo especifcado em disco.
6.3 Metodos td t H., cdmpos tdt 1 L t clas:e Md tt1 16 7
Embora a mawria dos mtodos seja exewtada em resposta a :hamadas de mwdo em objetos espedtiws, esse nem sempre u caso.

s vezes um mtodo realiza uma tarefa que no depende do contedo de nenhum objeto. Esse mtodo se aplica classe em que declarado
como um todo e conhecido como mtodo stati c ou mtodo de dsle. comum uma classe conter um grupo de mtodos stat i c
convenientes para realizar tarefas comuns. Por exemplo, lembre-se de que utilizamos pow no mtodo stat i c da classe Math para
encontrar a raiz quadrada de um nmero na Figura 5. 6. Para declarar um mtodo como s tat i c, coloque a palavra-chave stat i c antes
do tipo de retorno na declarao do mtodo. Voc pode chamar qualquer mtodo stat i c especificando o nome da classe em que o
mtodo declarado, seguido por um ponto (. ) e pelo nome do mtodo, como em
:VomeDaCiasse.nomeDoMrodo ( argume/1/os)
Aqui. utilizamos vrios mtodos da classe Ma th para apresentar u wm:eito sobre os mtodos stat 1 c. A classe Math lore:e uma
wleo de mtodos que permite realizar clculos matemticos comuns. Por exemplo, voc pode calcular a raiz quadrada de 900, O com a
chamada do mtodos tat i c
Math . sqrt ( 900 . 0 )
A expresso anterior avaliada corno 30, O. O mtodo sqrt aceita um argumento do tipo doub 1 e e retorna um resultado do tipo doub 1 e.
Para gerar a sada do valor da chamada do mtodo anterior na janela de comando, voc poderia escrever a instruo
System.out . pri ntl n ( Math . sqrt ( 900. 0 ) ) ;
Nessa mstruo, o valor que sqrt retorna tora-se o argumento para o me todo pn n tI n. Observe que no necessrio :riar un1 objew
Math antes de chamar o mtodo sq rt. Tambm observe que todos os mtodos da classe Math sos ta t i c -portanto, cada um chamado
precedendo o nome do mtodo com o nome da classe Math e um ponto (.) separador.
Obserao de engenharia de sofare 6.4
A dasse Math faz parte do paco1e java. lang, que impliciwmente importado pelo compilador, assim no necessrio impor/ar a classe Math
para 111ilizar seus mtodos.
Os argumentos de mtodo podem ser constantes, variveis ou expresses. Se c= 13. O, d 3. O e f 4. O, nto a instruo
System . ou t . print 1 n( Mat h . sqrt ( c + d * f) );
:ai cu la e imprime a raiz quadrada de 13. o+ 3. o* 4. o= 25. o-a saber, 5. o. A Figura 6.2 resume os vrios mLOdos da classe Math. Na
fgura, x e y so do tipo doub 1 e.
abs( x )
ceil( x)
cos( x )
exp( x )
floor( x )
log( x )
max( x, y)
min( x, y )
pow( x, y )
sin( x )
sqrt( x )
tan( x )
valor absoluto dex
arredonda x para o menor inteiro no menor que x
co-seno trigonomtrico de x ( x em radianos)
mtodo exponencial t
arredonda x para o maior inteiro no maior que x
logaritmo natural dex (base e)
maior valor de x e y
menor valor de x e y
x elevado potncia de y (isto , x!)
seno trigonomtrico de x (x em radianos)
raiz quadrada de x
tangente trigonomtrica de x (x e radianos)
Figra 6.2 Mtodos da classe Math.
Constantes PI e E da c:lasse Math
abs(23.7) 23,7
abs( 0.0) O,O
abs( -23.7) 23,7
ceil (9.2) 10,0
cei 1 ( -9.8 ) -9, O
cos(O.O)1 ,0
exp( 1.0) 2,71828
exp(2.0) ? ,38906
floor(9.2) 9,0
floor( -9.8) -10,0
log(Math.E) 1,0
log(Hath.E Hath.E) 2,0
max(2.3, 12.7) 12,7
max ( -2.3, -12.7 ) -2,3
min( 2.3, 12.7 ) 2,3
min( -2.3, -12.7 ) -12,7
pow( 2.0, 7 .O ) 128,0
pow( 9.0, 0.5) 3,0
sin( 0.0 ) O,O
sqrt( 900.0 ) 30,0
tan( 0.0 ) O,O
A classe Math tambm declara dois campos qu representam as coustauts mattmucas comumente utilizadas: Mth.PI e Math. E. A
constante Math . PI (3, I 41 59265358979323846) a relao entre a circunferncia de um crculo e seu dimetro. A constante Mat h . E
{2,71828 I 8284590452354) o valor da base para logaritmos naturais (calculados com o mtodo stati c Math 1 og). Esses campos so
declarados na classe Math com os modifcadores pub 1 i c, fi na 1 e stat i c. Torn-los pub 1 i c permite que outros programadores utilizem
esses campos nas suas prprias classes. Qualquer campo declarado com a palavra-chave fintl constante seu valor no pode sr
168 Capitulo 6 Metodos: um exame ma1s profundo
alterado depois que o campo tnicializado. fanto PI como E so declarado f1 na l por4ue seus valores nunca mudam. Torar es
campos stat i c permite que eles sejam acessados via nome da classe Math e um ponto (.) sparador, como ocorre com os mtodos da classe
Math. Lembre-se de que na Seo 3.5, quando cada objeto de uma classe mantm sua prpria cpia de um atributo, o campo que
representa o atributo tambm conhecido como uma varivel de instncia -cada objeto (instncia) da classe tem uma instncia
separada da varivel na memria. H campos em que cada objeto de uma classe no tem uma instncia separada do campo. Esse o caso dos
campos s tat i c, tambm conhecidos como variveis de classe. Quando objetos de uma classe que contm campos s tat i c so criados, todos os
objetos desa classe compartilham uma cpia dos cmpos s tat i c. Juntas, as variveis de classe e as variveis de instncia representam os campos
de uma clase. Examinaremos outros detalhes sobre o campos s tat i c na Seo 8.11.
Por que o mtodo main declurudu static?
Por que o ma i n deve ser declarado stati c? Ao executar a Java Virtual Machme (J V M) com o comando Java, a JVM tenta mvocar o
mtodo ma i n da classe que voc especifca-quando nenhum objeto da classe tiver sido criado. Declarar ma i n como stat i c permite que
a JYM invoque ma i n sem criar uma instnl:ia da classe. O mtodo ma i n normalmente declarado com o cabealho:
public statJc vo1d ma1n( Str1ny arysO )
Ao executar seu aplicativo, voc especifica o nome da classe como um argumento para o comando Java, como em
java NomeDaCiaH urgwnelllal argumwwl
A JVM carrega a classe espect!icada pelo NumeDuCiuse e utiliza esse nome de classe para mvocar u mtodo ma 1 n. u comando antwor,
NumeDaCiasse um argumeuw de linha de comando para a JVM que informa qual classe exewtar. Depois do NumeDaClasse, voc
tambm pode especificar uma lista de St n ngs (separadas por espaos) como argumentos de linha de comando lJUe a JVM passar para
seu aplicativo. Esses argumentos poderiam ser utilizados para especificar opves (por exemplo, um nome de arquivo) a fm de executar o
aplicativo. Como veremos no Captulo 7, Arrays, seu aplicativo pode acessar esses argumentos de linha de comando e utiliz-los para
personalizar o aplicativo.
Cumencrius adicionais subre u mwdu man
Nos captulos anteriores, cada aplicativo tinha uma classt qut continha somente ma1 n e possivelmente uma egunda clasc uulizada por
ma i n para criar e manipular os objetos. Na verdade, qualquer classe pode conter um mtodo ma i n. De fato, cada um dos nossos exemplo
de duas classes poderia ter sido implementado como uma classe. Por exemplo, no aplicativo nas figuras 5.9 e 5.1 O, o mtodo ma i n (linhas
6-16 da Figura 5.1 O) poderia ser colocado como est na classe GradeBook (Figura 5.9). Voc ento executaria o aplicativo dignando o
comando java GradeBook na janela de comando os resultados do aplicativo seriam idnticos queles da verso de duas classes. Voc
pode colocar um mtodo ma1 nem cada classe que voc declara. O JVM invota o mtodo mc 1 n somente na classe utilizada para executar o
aplicativo. Alguns programadores tiram proveito disso para incorporar um pequeno programa de teste a cada classe que eles declaram.
Declarando mtodos com mltiplos parmetros
Os captulos 3 5 apresentaram as classes que contm mtodos simples 4ue tinham no maximo um parmttro. Os metodos costumam
exigir mais de uma informao para realizar suas tarefas. Agora, vamos considerar como os programadores escrevem seus prprios
mtodos com mltiplos parmetros.
O aplicativo nas fguras 6. 3 e 6.4 utiliza um mtodo declarado pelo programador chamado max i mum para determinar e retornar o
maior entre os trs valores doub l e digitados pelo usurio. Quando o aplicativo inicia a execuo, o mtodo ma i n da classe
MaximumFinderTest (linhas 7-11 da Figura 6.4) cria um objeto da classe Max1mumF1nder (linha 9) e chama o mtodo
detenni neMaxi mum do objeto (linha I O) para produzir a sada do programa. Na da.se Max i mumF1 nder (Figura 6.3), as linhas 14-18 do
mtodo detenni neMax i mum solicitam que o usurio insira trs valores doub l e e lem a entrada fornecida pelo usurio. A linha 21 chama
o mtodo max i mum (declarado nas linhas 28 41) para determinar o maior dos trs valores doub 1 e passados como argumentos para o
mtodo. Quando o mtodo max i mum retorna o resultado para a linha 21, o programa atribui o valor de retoro de ma ! 1 mum varivel
local resu 1 t. Em seguida, a linha 24 gera a sada do valor mximo. No tina I desta seo, discutirtmos o uso do operador+ na linha 24.
Considere a declarau do mtodo maJ imum (linhas 28 41 ). A linha 28 indica 4ue o mtodo retorna um valor doub 1 e, que o nome do
mtodo max i mum e 4ue o mtodo requer trs parmetros doub 1 e (x, y e z) para realizar sua tarefa. Se um mtodo tiver mais de um
parmetro, os parmetros sero especifcados como uma li ta separada pu r vrgulas. Quando maJl mum chamado na linha 21 , o parmetro
x inicializado com o valor do argumento number 1, o parmetro y inicializado com o valor do argumento number2 e o parmetro z e
inicializado com o valor do argumento number3. Deve haver um argumento na chamada de mtodo para cada parmetro (ou parmetrv
formal) na declarao de mtodo. Alm disso, cada argumento deve ser consistente com o tipo do parmetro correspondente. Por exemplo,
uru parmetro do tipo doub 1 e pode receber valores como 7,35, 22 ou 0,03456, mas no Strings como "h e 11 o". A Seo 6.7 discute o
tipos de argumentos que pudem ser forecidos em uma chamada de mtodo para cada parmetro de um tipo primitivo.
11
F1g. 6.3: MaJlmumFlnder.JdVd
2 //Mtodo maximum declarado pelo programador.
3 import java.util .Scanner;
Figura 6.3
O metodo dt:cldrddu pt:u progrdmadur ma)HrJUr wrrr tre pdrmt:tru oouble (Pdrte 1 de 2)
5 publ i c cl ass Maxi mumFi nder
6
{
6 4 Declarando metodos com mult1plos parametros 169
7 // obtm trs valores de ponto fl utuante e l ocal i za o val or mximo
8 publi c void determineMaximum()
9
{
10 // cri a Scanner para entrada a partir da janela de comando
11 Scanner input= new Scanner( System. i n ) ;
12
13 // obtm a entrada do usuri o
14 System. out . print(
15 "Enter three float i ng-poi nt val ues separated by spaces: ") ;
16 double numberl i nput.nextDoubl e( ) ; // l o primei ro double
17 double number2 i nput.nextDoubl e( ) ; // l o segundo double
18 double number3 i nput . nextDouble( ) ; // l o terceiro double
19
20 // deteri na o valor mximo
21 double resul t = maximum( numberl, number2, number3 ) ;
22
23 // exibe o valor mximo
24 System. out. pri ntl n ("Maxi mum i s: " + resul t) ;
25 } // fi m do mtodo determineMaximum
26
27 // retorna o mximo dos seus trs parmetros de double
28 publ i c double maximum( double x, double y, doubl e z )
29
{
30 double maxi mumValue = x; // supe que x o maior valor i nici al
32 // determina se y maior que maximumVal ue
33
if ( y > maxi mumVal ue )
34 maximumVal ue = y;
35
36 // deterina se z maior que maximumValue
37 i f ( z > maximumValue
38 maximumValue z;
39
40
return maximumValue;
41 } // fi m do mtodo maximum
} // fim da classe Maxi mumFi nder
t2Ul8 6.3 O mtodo declarado pelo programador maxi mum com trs parmetros doub 1 e. (Parte 2 de 2. )
Para determinar o valor mximo, comeamos com a suposio de que o parmetro x contm o maior valor, assim a linha 30 declara a
variavel local max i mumV al ue e a inicializa com o valor do parmetro x. Naturalmente, possvel que o parmetro y ou z contenha o maior
valor real, portanto devemos comparar cada um desses valores com max i mumV a 1 ue. A instruo i f nas linhas 33-34 determina se y maior que
maxi mumVa l ue. Se for, a linha 34 atribui y a maximumVa l ue. A instruo i f nas linhas 37-38 determina se z maior que max i mumVa 1 ue. Se
for, a linha 38 atribui z a max i mumVa l ue. Nesse ponto, o maior dos trs valores reside em max i mumV al ue, dessa forma a linha 40 retorna esse
valor para a linha 21 . Quando o controle do programa retorna ao ponto do programa em que max i mum foi chamado, os parmetros x, y e z
do max i mum no mais existem na memria. Observe que os mtodos podem retornar no mximo um valor, mas o valor retornado poderia
ser uma referncia a um objeto que contm muitos valores.
2
l
4
5
6
.
// Fi g. 6.4: MaximumFi nderTest.java
// Apl i cativo para testar a cl asse MaximumFi nder.
pub l i c cl ass Maxi mumFi nderTest
{
// ponto de partida do apl i cati vo
publ i c stat i c voi d mai n ( String args[]
2u: b.4 Aplicativo pdra ttStar a classe MaximumF1 nder (Parte 1 de 2)
170 Cdpltulo Metodos. um exame mars profundo
I
9 MaximumFinder maximumFi nder new MaximumFi nder() ;
10 maximumFi nder. deteri neMaximum( ) ;
11 } // fim de main
12 /I fim da cl asse MaximumFi nderTest
Enter three floating-point val ues separated by spaces: 9,35 2 , 74 5, 1
Maximum i s: 9, 35
Enter three floating-point val ues separated by spaces : 5, 8 12, 45 8, 32
Maximum is : 12, 45
Enter three floati ng-point values separated by spaces : 6 , 46 4, 12 10, 54
Maximum i s : 10, 54
f1gura 6.4 Aplicativo para testar a classe Maxi mumFi nder. (Parte 2 de 2.)
Observe que resul t uma varivel local em determi neMaximum porque declarada no blow que representa o corpo do mtodo.
Variveis devem ser declaradas como campos de uma classe somente se forem utilizadas em mais de um mtodo da classe ou se o programa
deve salvar seus valores entre chamadas aos mtodos da classe.
Erro comum de programao 6.1
Declarar parmetros de mtodo do mesmo tipo como float x, y em vez de float x, float y um erro de sintaxe-um tipo requerido paru
cada parmetro 11a lista de parmetros.
Observao de engenharia de softare 6.5
Um mtodo com muitos parmetros pode estar realizando tarefas demais. Considere dividir o mtodo em mtodos menores que realizam tarefas
separadas. Como uma diretriz, se possvel, tente ajustar o cabealho do mtodo em uma linha.
implementao do mtodo maximum reutilizando o mtodo Math.max
Lembre-se de que na Figura 6.2 a classe Math tem um mtodo max que pode determinar o maior de dois valores. O corpo inteiro do nosso
mtodo maximum tambm poderia ser implementado com duas chamadas a Math .max, como a seguir:
return Math . max( x, Math. max( y, z) } ;
A primeira chamada a Mat h . max especifica os argumentos x e Math.max( y, z ) . Antes de qualquer chamada de mtodo, todos os seus
argumentos devem ser avaliados.para determinar seus valore. Se um argumento for uma chamada de mtodo, eta deve ser realizada para
determinar seu valor de retorno. Portanto, na instruo anterior, Ma th. max ( y, z ) primeiro avaliada para determinar o valor mximo de y e
z. O resultado ento passado como o segundo argumento para a outra chamada a Math . max, que retorna o maior dos seus dois argumentos.
Utilizar Ma th. max dessa maneira um bom exemplo da reutilizao de software -encontramos o maior dos trs valores reutilizando
Math . max, que encontra o maior dos dois valores. Observe a conciso dese cdigo comparado com as linhas 30-40 da Figura 6.3.
Montando strings com concatenao de strings
O Java permite que objetos Stri ng sejam criados montando strings menores em strings maiores com operador + (ou o operador de
atribuio composto + =). Isso conhecido como concatenao de strings& Se os dois operandos do operador + forem objetos String, o
operador+ criar um novo objeto String em que os caracteres do operando direito so colocados no fm daqueles no operando
esquerdo. Por exemplo, a expresso " h e 1 1 o " + " there" cria a Stri ng "h e 1 1 o there".
Na linha 24 da Figura 6.3, a expresso "Max i mum i s: " + utiliza o operador resu 1 t + com os operandos dos tipos Stri ng e doub 1 e.
Todos os objetos e valores primitivos em Java tm uma representao de Stri ng. Se um dos operandos do operador + for uma Stri ng, o
outro convertido em uma String e ento os dois so concatenados. Na linha 24, o valor de doub 1 e convertido na sua representao
Stri ng e colocado no fnal da Stri ng "Maximum i s : " . Se houver zeros fnais em um valor de doub l e, estes sero descartados quando o
nmero convertido em uma Stri ng. Portanto, o nmero 9,3500 seria representado como 9, 35 na Stri ng resultante.
Para valores primitivos utilizados na concatenao de strings, os valores primitivos so convertidos em Stri ngs. Se um boo 1 ean
lo r concatenado com uma String, o boo 1 ean ser convertido na Stri ng "t rue" ou "fa 1 se". Todos os objetos tm um mtodo chamado
toStri ng que retorna uma representao de Stri ng do objeto. Quando um objeto concatenado com uma Stri ng, o mtodo toStri ng
do objeto chamado implicitamente para obter a representao de Stri ng do objeto. Voc aprender mais sobre o mtodo toStri ng no
Captulo 7.
S Notd! sobre a declaraao e uullzaao de metodos I 7 I
(uaudo um grande literal de St ri ny digitado no digo-tonte de um programa, s veLeS os programadores prdemu dividir essa
s t r 1 ng em vrias Stri ngs menores e coloc-las em mltiplas linhas do cdigo para legibilidade. Nesse caso, as Strings podem ser montad<b
utilizando a concatenao. Discutiremos os detalhes de Stri ngs no Captulo 29, Strings, caracteres e expresses regulares.
Erro comum de programao 6.2
E um erro de simaxe quebrar uma literal String em mltiplas linhas demro de um programa. Se uma String no couber em uma linha, divida a
String em vrias Strings menores e utilize a concatenao para formar a String desejada.
Erro comum de programao 6.3
Confundir o operador+ utilizado para concatenao de string com o operador+ utilizado para adio pode levar a resultados estranhos. O Java
avalia os operandos de um operador da esquerda para a direita. Por exemplo, suponha que a varivel inteiray tem o valor 5 , a expresso "y + 2 "
+ y+2 resulta na string "y+2 =52" , no em "y +2 = 7" ,porque oprimeiro valordey (5) concatenado coma string "y +2 =",em seguida o valor
2 concatenado com a nova e maior string "y + 2 = 5" . A expresso "y + 2 = " + (y + 2) produz o resultado desejado "y + 2 = 7".
Notas sobre a declarao e utilizao de mtodos
H trs maneiras de chamar um mtodo:
1. Utilizando o prprio nome do mtodo para chamar um outro mtodo da mesma classe-como max i mum ( number 1 , number2,
number3 ) na linha 21 da Figura 6. 3.
2. Utilizando uma varivel que contm uma referncia a um objeto, seguido por um ponto (.)e pelo nome do mtodo para chamar um
mtodo do objeto referenciado-como a chamada de mtodo na linha 1 0 da Figura 6.4, maximumFi nder. determi neMaxi mum ( ) .
que chama um mtodo da classe MaximumFi nder no mtodo ma i n de Maxi mumFi nderTest.
Utilizando o nome de classe e um ponto (.) para chamar um mtodo s ta ti c de uma classe como Ma t h . sq rt ( 900, O) na
Seo 6. 3.
Observe que um mtodos ta t 1 c s pode chamar outros mtodos s tat i c da mesma classe diretamente (isto , utilizando o prprio
nome do mtodo) e s pode manipular campos s ta ti c na mesma classe diretamente. Para a cessar os membros no-s ta ti c da classe, um
mtodo s tat i c deve utilizar uma referncia a um objeto da classe. Lembre-se de que mtodos s ta ti c se relacionam a uma classe como
um todo, enquanto mtodos no-stati c so associados a uma instncia especfica (objeto) da classe e podem manipular as variveis de
instncia desse objeto. Muitos objetos de uma classe, cada um com suas prprias cpias das variveis de instncia, podem existir ao
mesmo tempo. Suponha que um mtodo s ta ti c fosse invocar um mtodo no-s ta ti c diretamente. Como o mtodo saberia quais
variveis de instncia do objeto devem ser manipuladas? O que aconteceria se nenhum objeto da classe existisse no momento em que o
mtodo no-s ta ti c fosse invocado? Obviamente, essa situao seria problemtica. Portanto, o Java no permite que um mtodo stat i c
acesse diretamente membros no-s tat i c da mesma classe.
H trs maneiras de retornar o controle instruo que chama um mtodo. Se o mtodo no retornar um resultado, o controle
retornar quando o fuxo do programa alcanar a chave direita de fechamento do mtodo ou quando a instruo
return ;
for executada. Se o mtodo retornar um resultado, a instruo
r e tu rn expresso;
avalia a expresso e ento retora o resultado ao chamador.
Erro comum de programao 6.4
Declarar um mtodo fora do corpo deuma declarao de classe ou dentro do corpo de um outro mtodo um erro de sintaxe.
Erro comum de programao 6.5
Omitir o tipo-do-valor-de-retoro em uma declarao de mtodo um erro de sintaxe.
Erro comum de programao 6.6
Colocar um ponto-e-vrgula aps o parntese direito que envolve a lista deparmetros de uma declarao de mtod um e de si/llaxe.
Erro comum de programao 6. 7
Redeclarar um parmetro de mtod como uma varilel local no corpo do mtodo um erro de compilao.
Erro comum de programao 6.8
Esquecer de retomar um valor em um mtodo que deve retomar um valor um erro de compilao. Se um tipo do valor de retomo alm de v o id for
especificado, o mtodo dever comer uma instmo return que retome 11111 valor consistente com o tipo-do-valor-de-retorno do mtodo.
Retornar um valor de um mtodo wjo tipo de retomo j(Ji declarudo wnw vo!d w11 erro de compilao.
172 Capitulo Metodos. um exame ma1s profundo
Pilha de chamadas de mtodo e registras de ativao
Para entender como o Java realiza chamadas de mtodo, primeiro precisamos considerar uma estrutura de dados (isto , a coleo de
itens de dados relacionados) conhecida como pilha. Os estudantes podem pensar em uma pilha como anloga a uma pilha de pratos.
Quando um prato colocado na pilha, normalment de colocado na parte superior (conhecido como inserir o prato na pilha). De
maneira semelhante, quando um prato removido da pilha, ele sempre removido da parte superior (conhecido como retirar o prato da
pilha). As pilhas so conhecidas como estruturas de dados do tipo ltimo a entrar, primeiro a sair (LTFO - last-in, firsl-out ) -o
ltimo item inserido na pilha o primeiro que removido da pilha.
Quando um programa chama um mtodo, este deve saber como retornar ao seu chamador, assim o endereo de retoro do mtodo
chamador colocado na pilha de execuo de programas (s vezes chamada de pilha de chamadas de mtodo). Se uma srie de chamadas
de mtodo ocorre, os sucessivos endereos de retorno so empilhados na ordem ltimo a entrar, primeiro a sair, de modo que cada
mtodo possa retornar para seu chamador.
A pilha de execuo de programas tambm contm a memria para as variveis locais utilizadas em cada invocao de um mtodo
durante uma execuo do programa. Esses dados, armazenados como uma parte da pilha de execuo de programas, so conhecido
como regbtros de ati\ao ou quadros de pilha das chamadas de mtodo. Quando uma chamada de mtodo feita. o registro de
ativao dessa chamada de mtodo inserido na pilha de execuo de programas. Quando o mtodo retorna ao seu chamador, o registro
de ativao dessa chamada de mtodo retirado da pilha e essas variveis locais no so mais conhecidas para o programa. Se uma
varivel local que armazena uma referncia a um objeto for a nica varivel no programa com uma referncia a esse objeto, quando o
registro de ativao que contm essa varivel local for retirado da pilha, o objeto no poder mais ser acessado pelo programa e
conseqentemente ser excludo da memria pela JVM durante a 'coleta de lixo'. Discutiremos a cole ta de lixo na Seo 8. 1 O.
Naturalmente, a quantidade de memria em um computador fnita, portanto somente certa quantidade pode ser utilizada para
armazenar os registras de ativao na pilha de execuo de programas. Se mais chamadas de mtodo ocorrerem alm do limite de seu
registras de ativao armazenados na pilha de execuo de programas, ocorrer um erro conhecido como estouro de pilha.
Promoo e coero de argumentos
Outro recurso importante das chamadas de mtodo a promoo de argumento: converter um valor do argumento no tipo qut u
mtodo espera receber no seu parmetro correspondente. Por exemplo, um programa pode chamar o mtodo Math sqrt com um
argumento inteiro mesmo que o mtodo espere receber um argumento doub 1 e (mas, como veremos mais adiante, no vice-versa). A
instruo
System. out. pri ntl n ( Math. sqrt( 4 ) ) ;
avalia corretamente Math . sqrt ( 4 ) e imprime o valor 2 . o. A lista de parmetros da declarao de mtodo faz com que o Java converta o
valor i nt 4 no valor doub l e 4. O antes de passar o valor para sqrt. Tentar essas converses podem levar a erros de compilao se as
regras de J)romoo do Java no forem satisfeitas. As regras de promoo especifcam quais converses so autorizadas, isto , quais
converses podem ser realizadas sem perda de dados. No exemplo sqrt anterior, um i nt convertido em um doub l e sem alterar seu
valor. Entretanto, converter um doub 1 e em um i nt trunca a parte fracionria do valor doub 1 e -portanto, parte do valor perdida.
Converter tipos inteiros grandes em tipos inteiros pequenos (por exemplo, 1 ong em i nt} tambm pode resultar em valores alterados.
As regras de promoo se aplicam a expresses que contm valores de dois ou mais tipos primitivos e a valores de tipo primitivo
passados como argumentos para os mtodos. Cada valor promovido para o tipo 'mais alto' na expresso. (Na verdade, a expresso
utiliza uma cpia temporria de cada valor -os tipos dos valores originais permanecem inal terados.) A Figura 6. 5 lista os tipo
primitivos e os tipos para os quais cada um pode ser promovido. Observe que as promoes vlidas para um dado tipo sempre so para um
tipo mais alto na tabela. Por exemplo, um i nt pode ser promovido para os tipos mais altos l ong, fl oat e doub l e.
Converter valores em tipos mais baixos na tabela da Figura 6. 5 resultar em diferentes valores se o tipo mais baixo no puder
representar o valor do tipo mais alto (por exemplo, o valor i nt 2000000 no pode ser representado como um short e qualquer nmero
de ponto flutuante com dgitos depois do seu ponto de frao decimal no pode ser representado em um tipo inteiro como 1 ong, i nt ou
short). Portanto, nos casos em que as informaes podem ser perdidas devido converso, o compilador Java requer que o
programador utilize um operador de coero (introduzido na Seo 4.9) para forar explicitamente a converso a ocorrer -do
contrrio, ocorre um erro de compilao. Isso permite ao programador 'ter controle' sobre o compilador. O programador
essencialmente diz "sei que essa converso poderia causar perda das informaes, mas aqui, para meus propsitos, isso no um
problema'. Suponha que o mtodo square calcule o quadrado de um inteiro e assim requeira um argumento i nt. Para chamar square
com um argumento doub l e nomeado doub l eVa l ue, precisaramos escrever a chamada de mtodo como squa re ( (i nt) doub l eVa l ue ) .
Essa chamada de mtodo faz uma coero explcita (converso) do valor de doubl eVa l ue em um inteiro para uso no mtodo square.
Portanto, se o valor de doub l eVa l ue for 4 , 5, o mtodo receber o valor 4 e retornar 16, no 20, 25.
Erro comum de programao 6. 9

Converter um valor de tipo primitivo em um outro tipoprimitivo pode alterar o valor se o novo tipo no for umu promoo vlida. Por exemplo, converter
um 1a/or de ponto jlutuallle emw11 valor integral pod i11troduzir erros de truncamento (perda daparte fracionria) no resultado.
doub1e
f1oat
1 ong
i nt
eh ar
short
byte
boo1ean
Figura 6.5
Nenhuma
doub1 e
f1 oat ou doub 1 e
1 ong, f1 oat ou doub 1 e
i nt, 1 ong, float ou doub1 e
i nt, 1 ong, f1 oat ou doub 1 e (mas no char)
6. 8 Pacotes da API do Java I 73
short, i nt, 1 ong, f1 oat ou doub1 e (mas no char)
Nenhuma (os valores boo 1 ean no so considerados como nmeros em Java)
Promoe permitidas para tipos pnmitvo
6 8 Pacotes da API do Java
Como vimos, o Java wntm muitas classes predelinidas que so agrupadas em alegorias de dasses relacionadas denominadas pacotes.
Juntos, esses pacotes so referidos como Java APl (Java Applicalion Programming Interface) ou biblioteca de classes Java.
Por todo o texto, as declaraes import especificam as classes exigidas para compilar um programa Java. Por exemplo, um
programa inclui a declarao
1 01purt java. uti 1 . Scanner;
para especifcar que o programa utiliza a classe Scanner no pacote j ava. ut i 1 . Isso permite que os programadores utilizem o nome
simples da classe Scanner em vez do nome completamente qualifcado dessa classe, j ava . uti 1 . Scanner, no cdigo. Um excelente ponto
forte do Java o grande nmero de classes nos pacotes da API do Java. Alguns pacotes chave da API do Java so descritos na Figura 6. 6,
que representa somente uma pequena parte dos componentes reutilizveis na API do Java. Ao aprender Java, dedique uma parte do seu
tempo pesquisando os pacotes e classes na documentao da API do Java (java . sun . com/ j 2se/5 . 0/docsjapi /i ndex . htm1 ).
O conjunto de pacotes disponvel no J2SE Development Ki t (JDK) imenso. Alm dos pacotes resumidos na Figura 6. 6, o JDK
inclui pacotes para imagens grfcas complexas, interfaces grfcas com o usurio avanadas, impresso, rede avanada, segurana,
processamento de banco de dados, multimdia, acessibilidade (para pessoas com defcincias) e muitas outras capacidades. Para uma
viso geral dos pacotes no JDK 5. 0, visite
j ava . sun. com/j 2se/5. 0/docsjapijovervi ew-summary . htm1
Mu}( J outro pawtcs tambm esto disponivs para download em j ava. sun . com.
java.app1et
java.awt
java. awt.event
java. i o
java . 1 ang
java.net
java. text
java . uti 1
javax.swing
O Ja1a Applet Package contm uma classe e vrias interface exigidas para criar applets Java-programas que executam nos navegado
re da Web. (O applets sero discutidos no Captulo 20, Introduo a applets Java; e as interface no Captulo I O, Programao orienta
da a objetos: Polimorfismo.)
OJaa \bstract Windo11 Toolkit Package contm as clases e interfaces exigidas para criar e manipular GUi no Java 1.0 e 1 . 1. Nas ver
. ses atuais do Java, os componentes GUI Swing dos pacote j avax. swi ng so feqentemente utili zados em seu lugar. (Alguns elemen
tos do pacote java. awt sero discutidos no Captulo I I , Componentes GU: Parte I , Captulo 12, Imagens graficas e Java2D e Captulo
22, Componentes GUI: Parte 2.)
O Ja"a Abstract Window Toolkit Event Package contm classes e interface que permitem o tratamento de eventos para componente
GUI tanto nos pacotes j ava. awt como javax. swi ng. (Voc aprender mais sobre esse pacote no Captulo I I , Componente GUI: Parte
I e no Captulo 22, Componente GUl: Parte 2.)
O Ja1 a lnput!Output Package contm classes e i nterfaces que permitem aos programas gerar entrada e sada de dados. (Voc aprender
mais sobre esse pacote no Captulo 14, Arquivos e fluxos.)
O Jaia Language Package contm classes e interfaces (discutidas por todo esse texto) que so exigidas por muitos programas Java. Esse
pacote importado pelo compilador para todos os programas, assim o programador no preci sa fazer isso.
O Ja1a Networking Package contm classes e interfaces que permitem aos programas comunicr-se va rede de computadore, como a
Internet. (Voc ver mais detalhes sobre isso no Captulo 24, Ree.)
O Jaa Text Package contm classes e interfaces que permitem aos programas manipular nmeros, datas, caracteres e strings. O pacote
fornece recursos de internacionalizao que permitem a um programa ser personalizado para um local especfico (por exemplo, um pro
grama pode exibir strings em diferentes idiomas com base no pais do usurio).
O Java Utililies Package contm classes utilitrias e interfaces que permitem aes como manipulaes de data e hora, processamento de
nlmeros aleatrios (classe Random), armazenamento e processamento de grandes volumes de dados e a diviso de strings em parte meno
res chamadas tokens (classe Stri ngTokeni zer). (Voc aprender mais sobre os recurso desse pacote no Captulo 19, Colees.)
O Jam Swing GUI Components Package contm classes e interfaces para componentes GUI Swing do Java que fornecem suporte para
GUi portveis. (Voc aprender mais sobre esse pacote no Captulo I I : Componentes GU: Parte I e no Captulo 22: Componentes
GUI: Parte 2.)
figura 6. 6 Pacotes da API do Java (um subconjunto). (Parte I de 2. )
1 74 Cap1tulo 6 Metodo. um examt mal! profundo
javax.swing.event
O Ja1a S\ in E1ent Package contm classes e interfces que pennitem o tratamento de eventos (por exemplo, responder a cliques de bo
to) para componentes GUIno pacote javax. swi ng. (Voc aprender mais sobre esse pacote no Captulo I I : Componentes GUI: Parte
I e no Captulo 22: Componentes GUI: Parte 2.)
figura 6.6 Pacotes da API do Java (um subconJunto). (Parte 2 de 2.)
Voc pude localizar informae adicionais sobre os mtodos de uma dasJava pn:dctinda na documentao da API do Java em
j ava . sun . com/ j2se/5 . 0/docs/api /i ndex. htm1 . Ao visitar esse si te, clique no link Index para ver uma listagem alfabtica de todas a
classes e mtodos na API do Java. Localize o nome da classe e dique nu seu link para ver a descrio on-line dessa classe. Clique no link
METHOD para ver uma tabela dos mtodos da classe. Cada mtodo stat i c ser listado com a palavra 'stat i c' precedendo o tipo de retorno
do mtodo. Para uma viso geral mais detalhada da navegao pela documentao da API do Java, consulte o Apndice G.
Boa prtica de programao 6.2
A documentao on-/ine da API do Java fcil de pesquisar e fomece vrios detalhes sobre cada classe. A medida que voc aprende uma classe
neste lilro, deve criar o hbito de examinar a classe na documentao on-line para informaes adicionais.
6 Estudo de caso: Gerao de nmeros aleatorios
Agora faremos uma breve e, esperamos, divertida digresso para discutir um tipo popular de aplicativo de programao - a simulao de
jogos. Nesta seo, e na seo a seguir, desenvolveremos um programa bem estruturado de jogos com mltiplos mtodos. Esse programa utiliza
a maioria das instrues de controle apresentadas at aqui neste livro e introduz vrios novos conceitos de programao.
H algo no ar de um cassino que anima as pessoas -dos altos apostadores nas mesas de feltro e mogno dos jogos de dado ao
pequenos apostadores nos caa-nqueis. Trata-se do elemento sorte, a possibilidade de que a sorte converter um punhado de dinheiro
em uma montanha de riqueza. O elemento sorte pode ser introduzido em um programa via um objeto da classe Random (pacote
j ava. ut i 1 ) ou via o mtodo s ta ti c random da classe Math. Os objetos da classe Random podem produzir valores aleatrios boo l ean,
byte, fl oat, doub 1 e, i nt, 1 ong e gaussianos, enquanto o mtodo Math random pode produzir somente os valores doub l e no intervalo
O, O x < 1 , O, onde x o valor retornado pelo mtodo random. Nos prximos vrios exemplos, utilizaremos objetos da classe Random
para produzir valores aleatrios.
Um novo objeto gerador de nmeros aleatrios pode ser criado como a seguw
Random randomNumbers = new Random ( ) ;
O objeto gerador de nmeros aleatrios pode ento ser utilizado para gerar boolean, byte, f1 oat, double, i nt, l ong aleatrios e
valores gaussianos -aqui, discutimos apenas os valores i nt aleatrios. Para informaes adicionais sobre a classe Random, visite
java. sun. com/j 2se/5 . 0/docs/api /j ava/uti 1 /Random. htm1 .
Considere a seguinte instruo:
i nt randomVal ue = randomNumbers . n extl nt ( ) ;
O mtodo nextl nt da classe Random gera u valor i nt aleatrio no intervalo -2. 1 47.483.648 a + 2. 147.483.647. Se u mtodo nex t i nt
verdadeiramente produzir valores de maneira aleatria, ento cada valor nesse intervalo deve ter uma chance (ou probabilidade) igual de ser
escolhido toda vez que o mtodo next I nt chamado. Os valores retorados por nex ti nt so na verdade nmeros pseudo-aleatrio! uma
seqncia de valores produzida por um clculo matemtico complexo. O clculo utiliza o horrio do dia atual (que, naturalmente, muda
constantemente) para semear o gerador de nmeros aleatrios de tal maneira que cada execuo de um programa fornece uma seqncia
diferente de valores aleatrios.
O intervalo de valores produzido diretamente pelo mtodo next lnt costuma diferir do i ntervalo de valores requerido em um
aplicativo Java particular. Por exemplo, um programa que simula lanamento de moeda talvez requeira somente O para 'caras' e I para
coroas' . Um programa que simula o lanamento de um dado de seis faces exigiria inteiros aleatrios no intervalo 1
-
6. Um programa
que prev aleatoriamente o prximo tipo de espaonave (entre quatro possibilidades) que voar pelo horiLonte em um videogame
exigiria inteiros aleatrios no intervalo 1 -. Para esses casos, a classe Random fornece outra verso do mtodo nex tI nt que recebe um
argumento i nt e retorna um valor a partir de O, mas sem inclu-lo, at o valor do argumento. Por exemplo, para simular o lanamento de
uma moeda, voc utilizaria a instruo
i n t randomV a l ue randomNumbers . nextl nt( 2 } ;
que retorna O ou 1 .
Lanando um dado de seis faces
Para demonstrar nmeros aleatrios, vamos desenvolver um programa que simula 20 lanamentos de um dado de seis faces e ex1be o
valor de cada lanamento. Iniciamos utilizando nextl nt para produzir os valores aleatrios no intervalo O 5, como a seguir:
face = randomNumbers . nextl n t(
6 ) ;
O argumento 6 -chamado fato r de escala -representa u nmero de valon: nico que nex t I nt deve produLir ( nesse caso, se1s U,
1, 2, 3, 4 e 5). Essa manipulao conhecida como cscalouar o intervalo de valores produzido pelo mtodo R andam next I nt.
b 9 Estudo de caso: Ger aao de numero aleator1os I 7 S
Um dado com sei laces tem os nmeros de 1-6 nas suas laces, no de 0-5. Assim, dt:lucamo: o intervalo dos nmtros produzidos
adiciOnando um Yalor de deslocamento -nesse caso, I -para nosso resultado anterior, como em
face = 1 + randomNumbers . nexti nt( 6 ) ;
O valor de deslocamento (1) especifca o primeiro valor no conjunto desejado de inteiros aleatrios. A instruo anterior atribui face a
um inteiro aleatrio no intervalo de 1 a 6.
A Figura 6. 7 mostra duas sadas de exemplo que confirmam o liuo de que os n:ultados do clculo anterior so inteiros no inttrvalu dt I a
6 e que cada execuo do programa pode produzir uma seqncia diferente de nmeros aleatrios. A linha 3 importa a classe Random do pacote
j a v a . u ti 1 . A linha 9 cria o objeto Random randomNumbe rs para produzir valore aleatrios. A linha 1 6 executa 20 vezes em um loop para
lanar o dado. A instruo i f (linhas 21-22) no loop inicia uma nova linha de sada depois de cada cinco nmeros, dessa forma os resultados
podem ser apresentados em mltiplas linhas.
Lanando um dado de se faces 6000 vezes
Para mostrar que os nmeros produzidos por nex t 1 n t ocorrem com probabilidadt aproximadamen te igual & vamo simular 6000
lanamentos de um dado com o aplicativo na Figura 6. 8. Cada inteiro de I a 6 deve aparecer aproximadamente 1 000 vezes.
Como as duas sadas de exemplo motram, ecalonar e delocar os valore produzidos pelo mtodo n ex t I n t permite que o programa simult
realisticente o lanamento de um dado de seis face. O aplicativo utiliza as instru de controle aninhadas (o swi tch aninhado dentro do
for) para determinar o nmero de veze que a face do dado ocorreu. A instruo for (linhas 21 -7) itera 6000 veze. Durante cada iterao, a
linha 23 produz um valor aleatrio de 1 a 6. Esvalor ento utdo como a expreso de controle (linha 26) da instruo swi tch (linhas
26-6). Com base no valor de face, a instruo swi tch incrementa uma das sis variveis de contador durante cada iterao do loop. (Ao
estudarmos arrays no Captulo 7, mostraremos uma maneira elegante de substituir toda a instruo swi tch nesse programa por uma nica
i
nstruo!) Observe que a instruo swi tch no tem nenhum caso defaul t porque temos um case para cada posvel valor do dado que a
txpre:s o na linha 23 produziria. Execute o programa vrias veze e obrve o reultados. Como se ver, toda vez que voc exeuta ese progama
ele produz resultados diferentes.
1 // F 1 g. 6. 7 : Randomintegers . Java
Z // Intei ros al eatrios desl ocados e escal onados .
3 i mport java. uti l . Random; // o programa uti l i za a cl asse Random
publ i c cl ass Randomintegers
{
publ i c stati c voi d mai n ( String args[] )
8
{
9 Random randomNumbers = new Random( ) ; // gerador de nmero al eatrio
10 i nt face; // armazena cada i nteiro al eatrio gerado
11
1 // faz o l oop 20 vezes
li for ( i nt counter 1 ; counter <= 20; counter++ )
{
1 // sel eciona o i ntei ro al eatrio de 1 a 6
lo face = 1 + randomNumbers . nextint( 6 ) ;
17
18 System.out . pri ntf( d g face ) ; // exibe o valor gerado
19
20 // se o contador for di vi sl vel por 5, i n i c i a uma nova l i nha de sal da
21 i f ( counter % 5 == O )
22 System. out . printl n ( ) ;
23 // for fi nal
24
I ti fim de mai n
25 / / fim da cl asse Randomlntegers
1 5 3 6 2
5 2 6 5 2
4 4 4 2 6
3 6 2 2
ftgura 6. 7 Inteiros aleatrios deslocados e escalonados. (Parte I de 2. )
1 76 Capitulo 6
6 5 4 2 6
1 2 5 1 3
6 3 2 2 1
6 4 2 6 4
Metodos: um exame ma1 s profundo
l2Ul 6. 7 lnte1ros aledtnos deslocados e escalonados. (Parte 2 de 2)
1 // Fi g . 6. 8: Rol l Oi e. java
2 // Rola um dado de seis l ados 6000 vezes .
3 import java. uti l . Random;
4
! pub l 1 c c l ass Rol l Oi e
6 {
7 publ i c stati c voi d mai n ( Stri ng args[] )
8
{
9 Random randomNumbers = new Random( ) ; // gerador de nmero al eatrio
10
11
12
13
14
15
16
17
i nt
i nt
i nt
i nt
i nt
i nt
frequencyl = O ; /
I
mantm a contagem de 1s l anados
frequency2 = O ;
11
contagem de 2s l anados
frequency3 = O;
11
contagem de 3s l anados
frequency4 O;
11 contagem de 4s l anados
frequency5 O;
11 contagem de Ss l anados
frequency6 = O; /1 contagem de 6s l anados
18 i nt face; // armazena o valor l anado mai s recentemente
19
20
I I
resume os resultados de 6000 1 anamentos de um dado
21 for ( i n t rol l 1 ; rol l <= 6000 ; rol l ++ )
22
{
23 face = 1 + randomNumbers .nextl nt( 6 ) ; 11 nmero de 1 a 6
24
2
5 11
deteri na val or de l anamento de 1-6 e i ncrementa o contador apropriado
26
switch (face)
27
{
28
case 1 :
29 ++frequencyl ;
11
i ncrementa o contador de ls
30 break ;
31
case 2 :
32 ++frequency2;
11
i ncrementa o contador de 2s
33 break ;
34 case 3 :
35 ++frequency3; 11 i ncrementa o contador de 3s
'
36 break ;
37 case 4:
38 ++frequency4; /I i ncrementa o contador de 4s
39 break ;
40 case 5:
41 ++frequency5; // i ncrementa o contador de Ss
42 break ;
43 case 6 :
44 ++frequency6;
11
i ncrementa o contador de 6s
45 break ; /
I
opcional no fi nal do switch
46
} 11
switch fi nal
47 } 11
for fi nal
48
49 System.out . pri ntl n ( " Face\tFrequency" ) ; li cabealhos de sada
50 System. out. pri ntf( " l\t%d\n2\t%d\n3\t%d\n4\t%d\n 5\t%d\n6\t%d\n" ,
51 frequency1, frequency2, frequency3 , frequency4,
2 6.8 Rolando um dado de seis lados 6.000 vezes. (Parte I de 2. )
frequency5, frequency6 ) ;
53 // fi m de mai n
54 } // fi m da cl asse Rol l Di e
Face Frequency
1 982
2 1001
3 1015
4 1005
5 1009
6 988
Face Frequency
1 1029
2 994
3 1017
4 1007
5 972
6 981
6 . 9 btudo de caso. Gerao de numero: aleatonos I 7 7
Figra 6.8 Rolando um dado de seis lados 6000 vezes. (Parte 2 de 2.)
6.9.1 Escalonamento e deslocamento generalizado dt numeros aleatrios
Anteriormente, demonstramos a instruo
face = 1 + randomNumbers . next i nt( 6 ) ;
que simula o lanamento de um dado de seis lados. Essa instruo sempre atribui varivel face um inteiro no intervalo 1 ::face ::6. A
largura desse intervalo (isto , o nmero de inteiros consecutivos no intervalo) 6, e o nmero inicial no intervalo 1 . Consultando a
instruo anterior, vemos que a largura do intervalo determinada pelo nmero 6 que passado como um argumento para mtodo
Random next I nt, e o nmero inicial do intervalo o nmero 1 que adicionado a randomNumberGenerator. next I nt ( 6 ) . Podemos
generalizar esse resultado como
number = va/orDeDeslvcamento + randomNumbers . next I nt ( fawrDeEscalvnamento ) ;
onde valorDeDeslocamento especifca o primeiro nmero no intervalo desejado de inteiros consecutivos e fatorDeE:ca/onamento
especifica quantos nmeros esto no intervalo.
Tambm possvel escolher inteiros aleatoriamente a partir de conjuntos de valores alm dos intervalos de inteiros consecutivos.
Por exemplo, para obter um valor aleatrio na seqncia 2, 5, 8, 1 1 e 14, voc poderia utilizar a instruo
number = 2 + 3 * randomNumbers . nexti n t( 5 ) ;
Nesse caso, randomNumberGenerator. next I nt ( 5 ) produz os valores no intervalo de 04. Cada valor produzido multiplicado por 3
para produzir um nmero na seqncia O, 3, 6, 9 e 1 2. Em seguida, adicionamos 2 a esse valor para deslocar o intervalo de valores e obter
um valor na seqncia 2, 5, 8, I I e 14. Podemos generalizar esse resultado como
number = valorDeDelvmmento +
diferenaEntre V a/ore * randomNumbers . nex tI nt ( fawrDeEsntlvnumemv ) ;
ondt l'tdvrDeDeslocamenro especifica o primeiro nmero no intervalo desejado de valores, diferenaEntreValores representa a diferena
entre nmeros consecutivos na seqncia efatorDeEscalonamento especifca quantos nmeros esto no intervalo.
9. 2 Repetio de nmeros aleatrios para teste e depurao
Como mencionamos anteriormente na Seo 6. 9, os mtodos da classe Random na verdade geram nmeros pseudo-aleatrios com base em
clculos matemticos complexos. Chamar repetidamente um dos mtodos Random produz uma seqncia de nmeros que parece ser
aleatria. O clculo que produz os nmeros pseudo-aleatrios utiliza a hora do dia como um valor de semente para alterar o ponto
inicial da seqncia. Cada novo objeto Random se auto-semeia com um valor baseado no relgio do sistema do computador no momento
em que o objeto criado, permitindo que cada execuo de um programa produza uma seqncia diferente de nmeros aleatrios.
Ao depurar um aplicativo, s vezes til repetir a mesma seqncia exata de nmeros pseudo-aleatrios durante cada execuo do
programa. Essa repetibilidade permite provar que seu aplicativo funciona de acordo com uma seqncia especfca de nmeros aleatrios
antes de voc testar o programa com diferentes seqncias de nmeros aleatrios. Se a repetibilidade for importante, voc poder criar
um objeto Random como a seguir:
Random randomNumbers = new Random( seedValue ) ;
I 78 Capitulo Metodos. um exame ma1s profundo
O argumento seedVa 1 ue (tipo 1 ong) semeia o clculo de nmeros aleatrios. Se o mesmo seedVa 1 ue for utilizado todas as veLes, o
objeto Random produz a mesma seqncia de nmeros aleatrios. Voc pode configurar a semente de um objeto Random em qualquer
momento durante a execuo do programa chamando o mtodo setSeed do objeto, como em
randomNumbers . setSeed( seedVal ue ) ;
Dica de preveno de erros 6. 2
Enquanto um programa estiver sob desenvolvimento, crie o objeto Random com um vulor especiico de semente para produzir uma seqnciu
repetvel de nmeros aleatrios toda vez que o programa executado. Se ocorrer um erro de lgica, corria esse erro e teste o programa novamente
com o mesmo valor de semente-isso permite reconstruir a mesma seqncia de nmeros aleatrios que causou o erro. Depois que os erros de
lgica forem removidos, crie o objeto Random sem utilizar um valor de semente, fazendo com que o objeto Rondam gere uma nova seqncia de
nmeros aleatrios toda vez que o programa executado.
t ' Estudo de caso: Um jogo de azar (introduo a enumeraes)
Um jogo popular de azar um jogo de dados conhecido como craps que jogado em cassinos e nas ruas de todo o mundo. As regras do
jogo so simples e diretas:
Voc lana dois dados. Cada dado tem seis faces que comm um, dois, trs, quatro, cincu e seis pomos, respectivamente. Depois que os dados param de
rolar, a soma dos pontos nas faces viradas para cima calculada. Se a soma for 7 ou I I no primeiro lance, voc ganha. Se a soma for 2, 3 ou I 2 no
primeiro lance (chamado craps), voc perde (isto , a 'casa' ganha). Se a soma for 4, 5, 6, 8, 9 ou 10 no primeiro lance, essa soma torna-se sua
'pontuao'. Para ganhar, voc deve continuar a rolar os dados at fazer sua pontuao' (isto , obter um valor igual sua pontuao). Voc perde se
obtiver um 7 antes de fazer a pontuao.
O aplicativo nas figuras 6.9 e 6. 1 O simula o crup:, utilizando mtodos para definir a lgica do jogo. No mtodo ma i n da classe
CrapsTes t (Figura 6. 1 0), a linha 8 cria um objeto da classe Craps (Figura 6.9) e a linha 9 chama seu mtodo pl ay para iniciar o jogo. O
mtodo p 1 ay (Figura 6.9, linhas 21 -65) chama o mtodo ro 1 1 Di c e (Figura 6.9, linhas 68-8 1 ) conforme necessrio para lanar os dois
dados e calcular a soma. Quatro sadas de exemplo na Figura 6. 1 O mostram vitria no primeiro lanamento, derrota no primeiro
lanamento, vitria em um lanamento subseqente e derrota em um lanamento subseqente, respectivamente.
Vamos discutir a declarao da classe Craps na Figura 6.9. Nas regras desse jogo, o jogador deve lanar dois dados no primeiro
lanamento e fazer o mesmo em todos os lanamentos subseqentes. Declaramos o mtodo ro 1 1 Di c e (linhas 68-81 ) para lanar o dado,
calcular e imprimir sua soma. O mtodo ro 1 1 Di c e declarado uma vez, mas chamado a partir de dois lugares (linhas 26 e 50) no
mtodo p 1 ay, que contm a lgica para um jogo de craps completo. O mtodo ro 1 1 Di c e no recebe nenhum argumento, ento tem uma
lista vazia de parmetros. Toda vez que chamado, ro 1 1 Di c e retorna a soma dos dados, assim o tipo de retorno i nt indicado no
cabealho do mtodo (linha 68). Embora as linhas 7 1 e 72 paream idnticas (exceto quanto aos nomes dos dados), elas no
necessariamente produzem o mesmo resultado. Cada uma dessas instrues produz um valor aleatrio no intervalo 1-6. Observe que
randomNumbers (utilizado nas linhas 71 -72} no declarado no mtodo. Em vez disso, ele declarado como uma varivel de instncia
pri v ate da classe e inicializado na Linha 8. Isso permite criar um objeto Random que reutilizado a cada chamada a ro 1 1 Di c e.
1 // Fig. 6. 9: Craps . java
2 // A cl asse Craps simul a o jogo de dados craps .
3 import java. uti l . Random;
4
5 publ i c cl ass Craps
6 {
7 // cri a um gerador de nmeros al eatri os para uso n o mtodo rol l D i ce
8 private Random randomNumbers new Random() ;
9
10 // enumerao com constantes que representam o status do jogo
11 private enum Status { CONTINUE , WON, LOST } ;
12
13
14
15
16
17
18
19
// constantes que representam l anamentos
pri vate final static i nt SNAKE_EYES 2
;
pri v ate fi na 1 static i nt TREY 3 ;
private final stati c i nt SEVEN 7 ;
pri v ate fi na 1 stati c i nt YO LEVEN =
private final static i nt BOX_CARS =
20 // joga uma partida de craps
21 publ i c voi d pl ay( )
1 1
;
12;
comuns
figura 6.9 A classe Craps s1rula o jogo de dados crps (Parte 1 de 3. )
dos dados
l.
6 I O btudo dt:caso: Um Jogo de azar (Introduo a enumeraoes) I 79
23 1 nt myPoi nt O; // pontos se no ganhar ou perder na la. rolagem
24 Status gameStatus; // pode conter CONTINUE, WON ou LOST
25
2b i nt sumOfDi ce = rol l Di ce{ ) ; // primeira rolagem dos dados
27
28 // determi na o status do jogo e a pontuao com base no primei ro l anamento
29 switch ( sumOfDi ce )
30
{
31 case SEVEN: // ganha com 7 no primei ro l anamento
32 case YO_LEVEN: // ganha com 1 1 no primeiro l anamento
33 gameStatus = Status . WON;
34 break;
35 case SNAKE_EYES: // perde com 2 no primeiro l anamento
36 case TREY: // perde com 3 no primeiro l anamento
37 case BOX_CARS: // perde com 12 no primeiro l anamento
38 gameStatus = Status. LOST;
39 break;
40 defaul t: // no ganhou nem perdeu, portanto registra a pontuao
41 gameStatus = Status . CONTINUE; // jogo no terminou
42 myPoi nt = sumOfDi ce; // i nforma a pontuao
43 System. out. pri ntf( "Point i s %d\n" , myPoint } ;
44 break; // opcional no final do switch
45 // switch final
46
47 // enquanto o jogo no estiver completo
48 whi l e (gameStatus == Status. CONTINUE) // nem WON nem LOST
49
{
50 sumOfDi ce rol l Di ce( ) ; // l ana os dados novamente
51
52 // determina o status do jogo
53 i f ( sumOfDi ce == myPoint ) // vi tria por pontuao
54 gameStatus = Status . WON;
55 el se
56 i f ( sumOfDi ce == SEVEN ) // perde obtendo 7 antes de ati ng i r a pontuao
57 gameStatus = Status . LOST;
58 // fim do whi l e
59
60 // exibe uma mensagem ganhou ou perdeu
61 i f (gameStatus == Status. WON}
2 System. out. pri ntl n ( " Pl ayer wws'' ) ;
o3 e 1 se
64 System. out . pri ntl n ( " Pl ayer l oses" } ;
65
}
// fi m do mtodo pl ay
66
67 // lana os dados, cal cul a a soma e exibe os resultados
68 publ i c i nt rol l Di ce( )
69
{
70 // seleciona valores al eatrios do dado
71 i nt di el = 1 + randomNumbers . nextlnt( 6 } ; // primeiro l anamento do dado
72 i nt di e2 1 + randomNumbers . nextlnt( 6 ) ; // segundo l anamento do dado
73
74 i nt sum = di el + di e2; // soma dos val ores dos dados
75
76 // exibe os resultados desse l anamento
77 System. out. pri ntf( " Pl ayer rolled %d + "d = >d\n" ,
78 di el, die2, sum } ;
79
f1gurc 6. 9 A classe Crdps Si mul a o JOgo de dado CICi (Parte 2 de 3 )
1 80 Capi tul o 6 Metodos. um exame mats profundo
o return sum; // retorna a soma dos dados
81 } // fim do mtodo rol l Di ce
82 ) // fim da cl asse Craps
ftgura 6.9 A 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
nem perder no primeiro lanamento, a varivel local gameStatus (linha 24) para monitorar o status geral do jogo e a varivel local
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 nt um valor
em cada desvio da instruo swi tch e, conseqentemente o programa poderia tentar utilizar myPoi nt antes de ela receber um valor. Por
comparao, gameStatus no exige uma inicializao porque recebe um valor a cada desvio da instruo swi tch -portanto,
garantido que ser inicializada antes de ser utilizada.
1 // Fi g. 6 . 10 : CrapsTest. j ava
2 // Apl i cativo para testar a cl asse Craps.
3
4 publ i c cl ass CrapsTest
5
(
6 publ i c static voi d mai n ( String args []
7 {
8 Craps game = new Craps ( ) ;
9 game. pl ay( ) ; // joga uma partida de craps
10 // fim de mai n
11 } // fim da cl asse CrapsTest
Pl ayer rol l ed 5 + 6 = 1 1
Pl ayer wi ns
Pl ayer rol l ed 1 + 2 3
Pl ayer l oses
Pl ayer rol l ed 5 + 4 = 9
Point i s 9
Pl ayer rol l ed 2 + 2 = 4
Pl ayer rol l ed 2 + 6 8
Pl ayer rol l ed 4 + 2 = 6
Pl ayer rol l ed 3 + 6 = 9
Pl ayer wi ns
Pl ayer rol l ed 2 + 6 8
Point i s 8
Pl ayer rol l ed 5 + 1 6
Pl ayer rol l ed 2 + 1 = 3
Pl ayer rol l ed 1 + 6 = 7
Pl ayer l oses
figura 6. 1 O AplicatiVO para testar a classe Craps.
Observe que a varivel local gameStatus declarada como um novo lipo chamado Status, que declaramos na linha 1 1 . O upo
Status declarado como um membro pri v ate da 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. 1 I Escopo das declaraoes 1 8 1

Boa prtica de programao 6.3

Utilize somente letras maisculas nos nomes das constantes. Isso faz com que as constantes sejam destacadas em um programa e lembrem o
programador de que constantes de enumerao no so varivs.
Vanavis do tipo Status podem rceber somente uma das trs constants declaradas na enumerao ou ocorrera um erro de
compilao. Quando se ganha o jogo, o programa confgura a varivel local gameStatus como Status. WON (linhas 33 e 54). Quando se
perde o jogo, programa confgura a varivel local gameS tatus como Status. LOST (linhas 38 e 57). Caso contrrio, o programa
confgura a varivel local gameStatus como Status . CONTINUE (linha 41 ) para indicar que os dados devem ser lanados novamente.
Boa prtica de programao 6.4
Utilizar WIIStames de enumerao (como Status. WON, Status. LOST e Status. CONTINUE) em vez de valores literais inteiros (como O, I e 2)
pode torar os programas mais fceis de ler e manter.
A linha 26 no mtodo p 1 ay chama ro 1 1 Di c e, que seleciona dois valores aleatrios entre I e 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 ay insere a instruo swi te h nas linhas 29-45, que
utilizam o valor sumOfDi c e na linha 26 para determinar se o jogo foi ganho ou perdido, ou se deve continuar com outro lanamento. A soma:
dos dados que resultariam em uma vitria ou perda no primeiro lanamento so declaradas como constantes pub 1 i c fi na 1 s tat i c i 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. Observe que essas constantes, como ocorre com constantes enum, so declaradas, por conveno, com todas as letras maisculas,
fazendo-as se destacar no programa. As linhas 3 1-34 determinam se o jogador ganhou no primeiro lanamento com SEVEN (7) ou YO LEVEN
( 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
48 58 executa. A linha 50 lana os dados novamente. Na linha 53, se sumOfDi c e corresponder a myPoi nt, a linha 54 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
linha 57 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 i n,
p 1 ay (chamado de ma i n) e ro 1 1 Di c e (chamado duas vezes de p 1 ay) -e as instrues de controle swi te h, whi 1 e, i f . . . e1 se e i f
aninhadas. 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 1 stat i c i nt em vez de constantes
e num. A resposta reside no fato de que o programa deve comparar i nt sumOfDi c e (linha 26) com essas constantes para determinar o
resultado de cada lanamento. Suponha que fssemos declarar constantes contendo enum Sum (por exemplo, Sum. SNAKE_EYES)
representando as cinco somas utilizadas no jogo para ento utilizar essas constantes no lugar das variveis fi na 1 nos cases da instruo
swi tch (linhas 29-45). Isso impediria a utilizao de sumOfDi c e como a exprt!so de controle da instruo swi te h o Java no
permite que um i 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
maneira fcil de converter um valor i nt em uma constante e num particular. Traduzir um i nt em 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 pub 1 i c fi na 1 stat i c i nt para representar as somas
dos dados.
Escopo das declaraes
Voc v1 u declaraes de vrias entidades Java como classt!, mtodo. variveis e parmtrus. As declaraes introdutem nomes que
podem ser utilizados para referenciar essas entidades Java. O escopo de 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 seo introduz vrias
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 di ti 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 u corpo
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 outros mtodos da classe.
1 82 Capitulo 6 Metodos. um exdme raa profundo
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'.
Erro comum de programao 6.1 O
Umerro de compilao ocorre quando um varivel /oca/ declarada mais de uma vez emum mtodo.
Dica de preveno de erros 6.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 nas figuras 6. 1 1 e 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 Scope Tes 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 // A classe Scope demonstra os escopos de campo e de varivel l ocal .
3
4 pub l i c cl ass Scope
5 {
6 // campo acessvel para todos os mtodos dessa cl asse
7 private i nt x = 1 ;
8
9 // mtodo begin cri a e i ni ci a l i za a vari vel l ocal x
10 // e chama os mtodos uselocal Variable e useField
11 pub l i c voi d begi n( )
12
{
13 i nt x 5; // varivel l ocal x do mtodo sombrei a o campo x
14
15 System.out. printf( " l ocal x i n method beg i n i s d\n" , x ) ;
16
17 useLocal Vari abl e( ) ; // uselocal Vari abl e tem uma varivel l ocal x
18 useFiel d( ) ; // useFi el d uti l i za o campo x da cl asse Scope
19 uselocalVari abl e( ) ; // useLocal Vari abl e rei n i ci al i za a varivel local x
20 useFi el d( ) ; // campo x da cl asse Scope retm seu valor
21
22 System. ou t . pr
{
ntf( " \nl ocal x i n method begi n i s %d\n" , x .) ;
23 // fi m do mtodo begi n
24
25 // cri a e i ni c i al i za a vari vel l ocal x durante cada chamada
26 publ i c voi d useLocalVari abl e( )
27
{
28 i nt x = 25; // i ni ci al i zada toda vez que useLoca l Variabl e chamado
29
30 System. ou t . pri ntf(
31 "\nl ocal x on entering method uselocal Vari abl e 1 s J\n" , x ) ;
32 ++x; // modi fi ca a vari vel l ocal x desse mtodo
33 System. out. pri ntf(
34 " l ocal x before exi t i ng method uselocal Vari abl e i s %d\n" , x ) ;
35 // fi m do mtodo uselocal Variable
36
37 // mod i fi ca o campo x da classe Scope durante cada chamada
38
publ i c voi d useFi el d ( )
39
{
40 System. ou t . pri ntf(
fagura 6. l I A classe Scope demonstrando os escopos de um campo e de vanve1s loca1s. (Parte I de 2.)
1 1 t 1 c u ' "" cr t lo:l l loy oeUJUu uC l c l tl 1 ll 11 , X ) ;
42 x *= 10; // mod i fi ca o campo x da cl asse Scope
43 System. out. pri ntf{
44 " field x before exl t i ng method useFi el d i s d\n" , x } ;
45 // fi m do mtodo useFi el d
,6 // fim da cl asse Scope
6 1 1 bcopo das decldfaoe 1 83
2Ul8 6 1 1 A classe Scope demonstrando os escopos de um campo e de vanveis loca1s. (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 (linha 13) 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) e use Fi e 1 d (linhas 38-45) -, os quais no aceitam
nenhum argumento e no retornam resultados. O mtodo begi n chama cada mtodo duas vezes (linhas 1 7-20). O mtodo
use loca 1 V a ri ab 1 e declara a varivel local x (linha 28). Quando use loca 1 V a ri ab 1 e chamado pela primeira vez (linha 1 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 (linhas 33-34). Quando use 1 Loca 1 V a ri ab 1 e chamado uma segunda vez (linha 19), ele recria a varivel local x e a
reinicializa como 25, assim a sada de cada chamada a useloca 1 V a ri ab 1 e idntica.
1 // Fi g. 6 . 12 : ScopeTest. java
2 // Apl i cati vo para testar a cl asse Scope.
3
4 publ i c cl ass ScopeTest
5
{
6 // ponto de partida do apl i cativo
7 publ i c stati c voi d mai n { String args[]
8
(
9 Scope testScope new Scope{ ) ;
10 testScope.begi n { ) ;
11 // fi m de mai n
12 } // fim da cl asse ScopeTest
l ocal x i n method beg i n i s 5
l ocal x on entering method uselocal Vari abl e i s 25
l ocal x before exi ti ng method uselocal Variable i s 26
fi el d x on entering ethod useFi el d i s
fi el d x before exi t i ng method useFi el d i s 10
l ocal x on entering method uselocal Vari abl e i s 25
l ocal x before exi ti ng method useLocal Vari abl e i s 26
fi el d x on entering method useFi el d i s 10
fi el d x before exi t i ng method useFi el d i s 100
l ocal x i n method beg i n i s 5
f1gura o 1 1 Apl1cauvo para testar a 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 (linha 20), o campo contm seu valor modificado, 10, assim o mtodo gera sada de 10 e ento 100. Por fim, no
mtodo begi n, o programa gera sada do valor da varivel local x 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 84 Capitulo 6 Metodos. um exame rn<m profundo
6 _ Sobrecarga de metodo
o metodos wm o mesmo nome podem ser dedarados na mesma classe, contanto 4u tenham diirentes conjunto de parmtros
tdeterminados pelo nmero, tipos e ordem dos parmetros) -isso chamado de lUlrearga de mtodo!. Quando um mtodo
sobrecarregado chamado, o compilador Java seleciona o mtodo adequado examinando o nmero, os tipos e a ordem dos argumentos
na chamada. A sobrecarga de mtodos comumente utilizada para criar vrios mtodos com o mesmo nome que realizam as mesmas
tarefas, ou tarefas semelhantes, mas sobre tipos diferentes ou nmeros diferentes de argumentos. Por exemplo, os mtodos Math abs, mi n
e max (resumidos na Seo 6.3) so sobrecarregados com quatro verses:
I Uma com dois parmetros doub 1 e.
2. Uma com dois parmetros fl oat.
3. Uma com dois parmetros i nt.
4. Uma com dois parmetros 1 ong.
Nosso prximo exemplo demonstra como declarar e invocar mtodos sobrecarregados. Veremos exemplos dos construtore
sobrecarregados no Captulo 8.
Declarando mtodos sobrecarregados
Na nossa classe MethodOverl oad (Figura 6. 1 3), inclumos duas verses sobrerregadas de um mtodo chamado square - um que
calcula o quadrado de um i nt (e retorna um i nt) e outro que calcula o quadrado de um doub 1 e (e retorna um doub 1 e). Embora esses
mtodos tenham o mesmo nome e listas e corpos semelhantes de parmetros, voc pode pensar neles simplesmente como dierentes mtodos.
Ajudaria pensar nos nomes dos mtodos como 'square de i nt' e 'square de double', respectivamente. Quando o aplicativo inicia a
execuo, o mtodo ma i n da classe MethodOverl oadTest (Figura 6. 14, linhas 6-1 0) cria um objeto da classe MethodOverl oad (linha 8)
e chama o mtodo testOverl oadedMethods do objeto (linha 9) para gerar a sada do programa (Figura 6. 14).
// Fi g . 6 . 13 : MethodOverl oad.java
// Decl araes de mtodos sobrecarregados .
publ i c cl ass MethodOverload
5 {
6 // teste de mtodos square sobrecarregados
1 publ i c voi d testOverl oadedMethods ( )
8
{
9 System. out. printf( "Square of i nteger 7 1 s %d\n" , square( 7 ) ) ;
10 System. out . pri ntf( "Square of double 7 . 5 1 s ;f\n" , square( 7 . 5 ) ) ;
11 // fim do mtodo testOverl oadedMethods
12
13 // mtodo square com argumento de i nt
14 pub l i c i nt squar( i nt i ntValue )
15
{
16 System. out. printf( "\nCal l ed square with i nt argument : %d\n" ,
17 i ntValue ) ;
18 return i ntValue * i ntValue;
19 } // fim do mtodo square com argumento de i nt
20
21 // mtodo square com argumento double
22 publ i c double square( doubl e doubleValue
Z3
{
24 System. out. printf( " \nCal l ed square with doubl e argument : %f\n" ,
25 doubleValue ) ;
26 return doubleValue * doubleVal ue;
27 // fi m do mtodo square com argumento double
28 } // fim da cl asse MethodOverload
Figura 6. 13 Declaraes de mtodos sobrecarregados.
// Fi g . 6 . 14 : MethodOverl oadTest . j ava
2 // Apl i cati vo para testar a classe MethodOverl oad.
f1gura 6. 1 4 AplicatiVO para testar a classe MethodOverl oad. (Parte 1 de 2 )
4 publ i c cl ass MethodOverl oadTest
5 {
publ i c stati c voi d mai n ( String args[] )
{
8 MethodOverload methodOverload new MethodOverl oad ( ) ;
9 methodOverload. testOverl oadedMethods ( ) ;
10 // fim de mai n
1 1 // fim da cl asse MethodOverl oadTest
Cal l ed square wi th i nt argument : 7
Square of i nteger 7 i s 49
Cal l ed square with double argument : 7 , 500000
Square of double 7 , 5 i s 56, 250000
l2Ut8 6. 1 4 Aplicativo para testar a classe MethodOverl oad. (Parte 2 de 2. )
. 1 2 Sobrecarga d e metodo 1 85
Na Figura 6. 13, a linha 9 invoca o mtodo square com o argumento 7 . Valores literais Inteiros so tratados como um tipo 1 nt, as i a
chamada de mtodo na linha 9 invoca a verso de square nas linhas 14-19 que especica um parmetro i nt. De maneira semelhante, a linha I O
invoca o mwdo squa re com o argumento 7 , 5. Valores de ponto futuante literais so tratados como um tipo doub l e, dessa forma a chamada
de mtodo na linha l O invoca a verso de square nas linhas 22
-
27 que especifca um parmetro doub l e. Cada mtodo primeiro gera a sada de
uma linha de texto para provar que o mtodo adequado foi chamado em cada caso. Na linha 10, observe que o valor do argumento e o valor de
retorno so exibidos com o especifcador de formato %f e que no especifcamos uma preciso em nenhum dos casos. Por padro, valores de
ponto flutuante so exibidos com seis dgitos de preciso se a preciso no for especifcada no especifcador de formato.
Distinguindo entre mtudos sobrewrregados
O compilador distingue os mtodos sobrecarregados pelas suas assinaturas uma combinao do nome e nmero do mtodo, tipos e
ordem dos seus parmetros. Se o compilador examinasse somente os nomes do mtodo durante a compilao, o cdigo na Figura 6. 1 3
seria ambguo -o compilador no saberia distinguir entre os dois mtodos square (linhas 14-19 e 22
-
27). internamente, o
compilador utiliza nomes de mtodo mais longos que incluem o nome original do mtodo, os tipos de cada parmetro e a ordem exata dos
parmetros para determinar se os mtodos em uma classe so nicos nessa classe.
Por exemplo, na Figura 6. 1 3, o compilador utilizaria o nome lgico 'square de i nt' para o mtodo square que especif
i
ca um
parmetro i nt e 'square de doubl e' para o mtodo square que especifca um parmetro doubl e (os nomes reais que o compilador
utiliza so mais confusos). Se a declarao do methodl iniciar como
voi d methodl ( i nt a, fl oat b )
o compilador ento poderia utilizar o nome lgico 'methodl de i nt e f l o a t ' . Se os parmetros forem espccitlcados como
voi d method l (
f
l oat a , i nt b )
o compilador ento poderia utilizar o nome lgico 'methodl de fl oat e i nt '. Observe que a ordem dos tipos de parmetro importante
-o compilador considera os dois cabealhos do method 1 anterior como sendo distintos.
Tipos de retorno dos mtodos sobrecarregados
Na discusso sobre os nomes lgicos dos mtodos utilizados pelo compilador, no mencionamos os tipos de retorno dos mtodos. Isso
ocorre porque as chamadas de mtodo no podem ser diferenciadas pelo tipo de retorno. O programa na Figura 6. 1 5 ilustra os erros de
compilador quando dois mtodos gerados tm a mesma assinatura e tipos diferentes de retorno. Mtodos sobrecarregados podem ter
diferentes tipos de retorno se os mtodos tiverem diferentes listas de parmetro. Alm disso, mtodos sobrecarregados no precisam ter o
mesmo nmero de parmetros.
11
F l y . 6 . 15 : MethodOverl uadrror. Java
t // Mtodos sobrecarregados com assi naturas i dnticas
3 // resulta em erros de compi l ao, mesmo se os ti pos de retorno forem di ferentes .
4
5 publ i c cl ass MethodOverloadError
6 {
7 // decl arao do mtodo square com argumento i nt
8 publ i c i nt square( i nt x )
hgufa o. l 5 Otcldrdbe de rrretodos obrecarregddos conr dSSHldturds uJentrcds cdusar erros de curprld<o. rnesro que o trpos de
retorno seJarn drferentb (Parte I de 2.)
1 86 Cap1tulo 6 Metodos. um exame ma1s prolundo
!
10
return x * x ;
11
12
13 // segunda declarao do mtodo square com argumento i nt
14 // resulta em erros de comp i l ao mesmo que os ti pos de retorno sejam di ferentes
15 publ i c doubl e square( i nt y )
16
{
17 return y * y;
18
1< I I fi m da cl asse MethodOverloadError
MethodOverloadError. java : l5: square (i nt) i s al ready defined i n
MethodOverloadError
publ i c double square( i nt y )
7
erro r
figura 6. 1 5 Declaraes de metodos sobrecarregados com assinaturas tdntiCa cauar erros d e compilao. mesmo que os tipo de
retorno sejam diferentes. (Parte 2 de 2. )
Erro comum de programao 6.1 I
Declarar mtodos sobrecarregados com listas de parmetros idnricas um erro de compilao independentemenre de os tipos de retorno serem
diferenres.
6. I (Opcional) Estudo de caso de GUis e imagens grficas:
Cores e formas preenchidas
Embora voc possa criar muitos projetas interessantes apenas com linhas e formas bsicas, a classe Graphl cs fornece vrias outra
capacidades. Os prximos dois recursos que introduziremos so cores e formas preenchidas. Adicionar cores traz outra dimenso para os
desenhos que um usurio v na tela do computador. Formas preenchidas preenchem regies inteiras com cores slidas em vez de apenas
exibirem os contornos de desenhos.
As cores exibidas nas telas dos computadores so definidas pelos seus componentes vermelho, verde e aLui . &-ses componentes,
denominados valores RGB, contm valores inteiros entre
O
e 255. Quanto mais alto o valor de um componente particular, mais brilhante uma
sombra particular ficar na cor fnal. O Java utiliza a classe C o 1 o r no pacote j a v a . awt para representar wres utilizando valores RGB. Por
convenincia, o objeto Col or contm 1 3 objetos stat i c Col or predefnidos - Col or. BLACK, Col or. BLUE, Col or. CYAN,
Col or. DARK GRAY, Col or. GRAY, Col or. GREEN, Col or. LIGHT GRAY, Col or. MAGENTA, Col or. ORANGE, Col or. PI NK, Col or. RED.
Col o r. WHITE e Col o r. YELLOW. A classe C o 1 o r tambm contm um
-
construtor na forma:
publ i c Col or( i nt r, i nt g , i nt b )
assim, voc pode criar cores personalizadas especifcando os valores para os componentes vermelho, verde e azul individuais de uma cor.
Retngulos e ovais preenchidas so desenhados utilizando os mtodos Graphi cs fi 1 1 Rect e fi 1 1 Ova 1 , respectivamente. Esses dois
mtodos tm os mesmos parmetros das suas contrapartes drawRect e drawova 1 no preenchidas; os dois primeiros parmetros so as
coordenadas para o canto superior esquerdo da forma, enquanto os dois parmetros seguintes determinam sua largura e altura. O
exemplo nas fguras 6. 1 6 e 6. 1 7 demonstra cores e formas preenchidas desenhando e exibindo um rosto amarelo sorridente na tela.
As instrues i mport nas linhas 3
-
5 da Figura 6. 1 6 importam C o 1 o r, Graphi cs e JPane 1 . A classe DrawSmi 1 ey utiliza a !:lasse
C o 1 o r para especifcar as :ores de desenho e a classe Graph i cs para desenhar. Mais uma vez, a classe JPane 1 fornece a rea em que
desenhamos. A linha 14 no mtodo pai ntComponen t utiliza o mtodo Graph i cs setCo 1 o r para confgurar a cor atual de desenho como
C o 1 o r . YELLOW. O mtodo setCo 1 o r requer um argumento, C o 1 o r, para configurar a cor de desenho. Nesse caso, utilizamos o objeto
predefnido C o 1 o r. YELLOW. A linha 1 5 desenha um crculo com um dimetro de 200 para representar o rosto -se os argumentos de
largura e altura forem idnticos, o mtodo fi 1 1 Ova 1 desenhar um crculo. Em seguida, a linha 1 8 confgura a cor como C o 1 o r. 81 ack e
as linhas 1 9-20 desenham os olhos. A linha 23 desenha a boca como uma oval, mas isso no bem o que ns queremos. Para criar um
rosto feliz, vamos 'retocar' a boca. A linha 26 confgura a cor como C o 1 o r. YELLOW, portanto quaisquer formas que desenhamos sero
combinadas com o rosto. A linha 27 desenha um retngulo com metade da altura da boca. Isso 'apaga' a metade superior da boca.
deixando somente a metade inferior. Para criar um sorriso melhor, a linha 28 desenha outra oval para cobrir levemente a parte superior
da boca. A classe DrawSmi 1 eyTest (Figura 6. 1 7) cria e exibe uma J Frame que contm o desenho, o que resulta no sistema chamando o
mtodo pai ntComponent para desenhar o rosto sorridente.
6. 1 3 (Opcional) Estudo de caso de GUis e imagens grficas: Cores e formas preenchidas 1 87
1
11
Fi g . 6 . 16 : DrawSmi l ey. java
2
I I
Demonstra formas preenchi das.
3 import java. awt.Color;
4 import java.awt. Graphi cs;
5 import javax. swi ng. JPanel ;
6
7 publ i c cl ass DrawSmi l ey extends JPanel
8
{
9 publ i c void paintComponent( Graphics g )
10 {
11 super. pai ntComponent( g ) ;
12
13
11 desenha o rosto
14 g . setColor( Color. YELLOW } ;
15 g . f i l lOval ( 10, 10, 200, 200 } ;
16
17
11
desenha os olhos
18 g . setCol or( Color. BLACK ) ;
19 g. fi l lOval ( 55, 65 , 30, 30 ) ;
20 g . fi l l Oval ( 135 , 65. 30 , 30 } ;
21
22
I I
desenha a boca
23 g. fi l lOval ( 50, 110 , 120 , 60 ) ;
24
25
11
" retoca" a boca para criar um sorriso
26 g. setColor( Col or. YELLOW ) ;
27 g . fi l l Rect( 50, 110, 120 , 30 } ;
28 g. fi l lOval ( 50 , 120, 120 , 40 } ;
29
11
fi m do mtodo pai ntComponent
30
11
fim da cl asse DrawSmi l ey
2ul8 6. 1 6 Desenhando um rosto sorridente com cores e formas preenchidas.
1
I I
Fi g. 6. 1 7 : DrawSmi l eyTest. java
2
11 Apl i cati vo de teste que exi be um rosto sorri dente.
3 i mport javax. swing. JFrame;
4
5 publ i c cl ass DrawSmi l eyTest
6 {
7 publ i c static voi d mai n ( String args[]
8
{
9 DrawSmi l ey panel new DrawSmi l ey{ } ;
10 JFrame appl i cati on new JFrame(} ;
11
12 appl i cati on. setDefaul tCl oseOperati on( JFrame. EXIT_ON_CLOSE } ;
13 appl i cati on. add ( panel } ;
14 appl i cation. setSi ze( 230, 250 } ;
15 appl i cati on. setVi si bl e( true ) ;
16 }
I I
fim de ma i n
17
11
fi m da cl asse DrawSmi l eyTest
l2Uf86. 1 7 Criando JFrame para exibir um rosto sorridente. (Parte I de 2. )
188 Captulo 6 Mtodos: um exame mais profundo

2Uf8 6. 1 7 Criando JFrame para exibir um rosto sorridente. (Parte 2 de 2. )
Exerccios do estudo de caso sobre GUs e imagens grficas
6.1 Utilizando o mtodo fi 1 1 Ova 1 , desenhe um alvo que alterna entre duas cores aleatrias, como na Figura 6. 18. Utilize o construtor C o 1 o r
( i nt r, i nt g , i nt b ) com argumentos aleatrios para gerar cores aleatrias.
6. 2 Crie um programa que desenhe dez formas preenchidas aleatrias com cores aleatrias e posies (Figura 6.19). O mtodo pai ntComponent
deve conter um loop que itera dez vezes. Em cada iterao, o loop deve determinar se se deve desenhar um retngulo ou uma oval preenchida, criar uma
cor aleatria e escolher as coordenadas e dimenses aleatoriamente. As coordenadas devem ser escolhidas com base na largura e altura do painel. O
comprimento dos lados deve estar limitado metade da largura ou altura da janela. O que acontece cada vez que pai ntComponent chamado (isto , a
janela redimensionada, exibida etc.)? Resolveremos essa questo no Captulo 8.
6. 1 4 (Opcional) Estudo de caso de engenharia de software:
Identificando operaes de classe
No 'Estudo de caso de engenharia de sofware' no fim das sees nos captulos 3, 4 e 5, seguimos os primeiros passos do projeto orientado
a objetos do nosso sistema ATM. No Captulo 3, identificamos as classes que precisaremos implementar e criamos nosso primeiro
diagrama de classes. No Captulo 4, descrevemos alguns atributos das nossas classes. No Captulo 5, examinamos estados dos objetos e
transies de estado e atividades dos objetos modelados. Nesta seo, determinamos algumas operaes de classe (ou comportamentos)
necessrias para implementar o sistema ATM.
2Ul8 6. 1 8 Um alvo com duas cores aleatrias alternativas.
2Ut8 6. 1 9 Formas geradas aleatoriamente.
1 4 (Opctonal) Estudo de caso de engenhart a de software: Identificando operabes de classe 1 89
Jdentijicundo uperues
Uma operao um servio que os objetos de ura classe forecem aos chemes t usurios) da classe. Pense nas operaes de alguns objetos
do mundo real. As operaes de um rdio incl uem configurar sua estao e volume (em geral invocado por uma pessoa que ajusta os
controles do rdio). As operaes de um carro incluem acelera a (invocada pelo motorista ao pressionar o pedal do acelerador),
desacderao (invocada pelo motorista que pressiona o pedal do freio ou solta o pedal do acelerador), mudana de direo e troca de
marchas. Os objetos de software tambm podem oferecer operaes por exemplo, um objeto de um software grfico poderia oferecer
operaes para desenhar um crculo, uma linha, um quadrado etc. Um objeto de um software de planilha poderia oferecer operaes
como imprimir a planilha, somar os elementos em uma linha ou coluna e diagramar informaes na planilha como um grfco de barras
ou grfico de torta.
Podemos derivar vrias operaes de cada classe examinando os verbos e frases com verbos-chave no documento de requisi lOs.
Relacionamos ento cada um desses aspectos a classes particulares no nosso sistema (Figura 6.20). As frases com verbos na Figura 6.20
ajudam a determinar as operaes de cada classe.
Modelando operues
Para identificar operaes, examinamos as frases com verbos listadas para cada classe na Figura 6.20. A frase executa transaes
linanceiras' associada com a classe ATM implica que a classe ATM instrui as transaes a serem executadas. Portanto, as classes
Ba 1 ance I nqui ry, Wi thdrawa 1 e Depos i t precisam de uma operao para fornecer esse servio ao ATM. Colocamos essa operao (que
identifcamos como execute) no terceiro compartimento das trs classes de transao no diagrama de classes atualizado da Figura 6.21 .
Durante uma sesso no ATM, o objeto ATM invocar a operao execute de cada objeto de transao para inform-lo a executar.
executa transa financeiras
Sal ancelnqui ry
[nenhuma no documento de requisitos]
Wi thdrawa 1
[nenhuma no doumento de requisitos]
Depos i t
[nenhuma no documento de requisitos]
BankDatabase
autentica um usurio, recupera um saldo em conta, creita uma quantia depositada em u conta, debit um valor sacdo de uma conta
Account
reupera um saldo em conta, creita u quantia depositada em uma cnta, debita uma quanti a sacada de uma conta
Screen
exibe uma mensagem para o usurio
Keypad
receb entrada numrica do usurio
CashDi spenser
fornece o dinheiro, indica s contm dinheiro sufciente para satisfer uma solicito de saque
Depos i tSl ot
recebe um envelope de depsito
ftgura .lO Os verbos e frases com verbo para cada classe no sistema ATM.
A UMl representa operaes (implementadas como mtodos em Java) listando o nome da operao, seguido por uma lista separada
por vrgulas de parmetros entre parnteses, um dois-pontos e o tipo de retorno:
nomeDaOperuu ( purmetro 1, parmetro2 . . . . , parmetroN) : tipo de retoro
Cada parmetro na lista separada por vrgulas de parmetros consiste em um nome de parmetro, seguido por um dois-pontos e o tipo de
parmetro:
1omeDoParmerro : tipoDoParmetro
Agora, no listamos os parmetros das nossas operaes -identificaremos e modelaremos os parmetros de algumas operaes
mais adiante. Para algumas operaes, ainda no conhecemos os tipos de retorno, portanto tambm iremos omiti-los do diagrama. Essas
omisses so perfeitamente normais nesse ponto. medida que o nosso projeto e a implementao avanam, adicionaremos os tipos de
retorno remanescentes.
A Figura 6.20 l ista a !rase autentica um usurio' ao lado da classe BankDatabase -o banco de dados o objeto que contm
informaes sobre uma conta necessrias para determinar se o nmero da conta e o PIN inseridos por um usurio correspondem queles
de uma conta mantida pelo banco. Portanto, a classe BankDatabase precisa de uma operao que fornea um servio de autenticao ao
ATM. Colocamos a operao authenti cateUser no terceiro compartimento da classe BankDatabase (Figura 6.21 ). Entretanto, um
objeto da classe Account, no da classe BankDatabase, armazena o nmero da conta e o PIN que devem ser acessados para autenticar um
usurio; dessa forma, a classe Account deve fornecer um servio para validar um PIN, obtido por meio da entrada do usurio, contra um
PIN armazenado em um objeto Account. Portanto, adicionamos uma operao v a 1 i datePIN classe Account. Observe que
especifcamos um tipo de retorno boo 1 ean para as operaes authent i cateUser e v a 1 i datePIN. Cada operao retorna um valor
indicando que a operao foi bem-sucedida ao realizar sua tarefa (isto , um valor de retorno true) ou no (isto , um valor de retorno
fa 1 se).
A Figura 6.20 lista vrias frases com verbos adicionais da classe BankDatabase: 'recupera um saldo em conta', 'credita uma quantia
depositada em uma conta' e 'debita uma quantia sacada de uma conta'. Como ocorre com 'autentica um usurio', essas frases restantes se
referem aos servios que o banco de dados deve fornecer ao ATM, porque o banco de dados armazena todos os dados de uma conta
utilizada para autenticar um usurio e realizar as transaes no ATM. Entretanto, objetos da classe Account na verdade realizam as
operaes s quais essas frases se referem. Portanto, atribumos uma operao classe BankDatabase e classe Account para que elas
1 90 Capitulo Metodos: ur exame ra1 ! p10tundo
correspondam a cada uma dessas frases. Lembre-se de que, a partir do que toi discutido na Seo 3. 10, como a conta bancna contm
informaes sigilosas, no permitimos que o ATM acesse contas diretamente. O banco de dados a tua como um intermedirio entre o
A TM e os dados da conta, evitando assim acesso no autorizado. Como veremos na Seo 7 . 1 4, a classe ATM invoca as operaes da classe
BankDatabase, cada uma das quais, por sua vez, invoca a operao com o mesmo nome na classe Account.
AT
userAuthenticated : Boolean " false
Balancelnquiry
accountNumber : lnteger
execute O
Withdrawal
accountNumber : lnteger
amount : Double
executeO
Deposit
accountNumber : lnteger
amount : Double
execute O
BankDatabase
authenticateUserO : Boolean
getAvailableBalanceO : Double
getTotaiBalanceO : Double
creditO
debitO
t2Ul8 6.2 1 Classes no Sistema AT com atributos e operaes.
Account
accountNumber : lnteger
pin : lnteger
availableBalance : Double
totaiBalance : Double
validatePINO : Boolean
getAvailableBalanceO : Double
getTotaiBalanceO : Double
creditO
debitO
displayMessageQ
Keypad
getlnputO : lnteger
CashDispenser
count : lnteer 500
dispenseCashO
isSuffidentCashAvailableO : .oolean
DepositSiot
isEnvelopeReceivedO : Boolean
A frase recupera um saldo em conta' sugere que as classes BankDatabase e Account precisam de uma operao getBa 1 ance.
entretanto, lembre-se de que criamos dois atributos na classe Account a fim de representar um saldo ava i 1 ab 1 eBa 1 ance e
to ta 1 Ba 1 ance. Uma consulta de saldo requer acesso aos dois atributos de saldo para poder exibi-los ao usurio, mas um saque precisa
verifcar somente o valor de a vai 1 ab 1 eBa 1 ance. Para permitir que objetos no sistema obtenham cada atributo de saldo individualmente,
adicionamos operaes getAvai 1 ab 1 eBa 1 ance e getTota 1 Ba 1 ance ao terceiro compartimento das classes BankDatabase e Account
(Figura 6.21 ). Especifcamos um tipo de retorno Doub 1 e para essas operaes porque os atributos de saldo que eles recuperam so do tipo
Doub 1 e.
As frases credita uma quantia depositada em uma conta' e 'debita uma quantia sacada de uma conta' indicam que as classes
BankDatabase e Account devem realizar operaes para atualizar uma conta durante um depsito e saque, respectivamente. Portanto,
atribumos as operaes credi t e debi t s classes BankDatabase e Account. Lembre-se de que creditar em uma conta (como em um
depsito) s adiciona uma quantia monetria ao atributo to ta 1 Ba 1 ance. Debitar de uma conta (como em um saque), por outro lado,
subtrai a quantia dos dois atributos de saldo. Ocultamos esses detalhes de implementao dentro da classe Account. Esse um bom exemplo
do encapsulamento e ocultamento de informaes.
Se isso fosse um sistema ATM real, as classes BankDatabase e Account tambm forneceriam um conjunto de operaes para permitir
que outro sistema de operaes bancrias atualizasse um saldo na conta do usurio depois de uma confirmao ou rejeio de todo ou
parte de um depsito. A operao confi nnDepos i tAmount, por exemplo, adicionaria uma quantia monetria ao atributo
ava i 1 ab 1 eBa 1 ance, tornando assim os fundos depositados disponveis para saque. A operao rej ectDepos i tAount subtrairia uma quantia
monetria do atributo to ta 1 Ba 1 ance para indicar que um valor monetrio especifcado, recm-depositado por meio do ATM e adicionado ao
to ta 1 Ba 1 ance, no foi encontrado no envelope de depsito. O banco invocaria esoperao depois de determinar que o usurio no incluiu a
quantia monetria correta ou que um cheque no foi compensado (isto , ele 'voltou'). Adicionar essas operaes torna nosso sistema
mais completo, porm no as inclumos nos nossos diagramas de classes nem na nossa implementao porque elas esto alm do escopo
deste estudo de caso.
6 1 4 (pc10nal) Estudo de caso de engenhar a de software: Identificando operaoes de classe 1 9 1
A classe Screen exibe uma mensagem para o usurio' em vrios momen!Os em uma sesso no A TM. Toda a sada vtsual ocorre por
meto da tela do ATM. O documento de requisitos descreve muitos tipos de mensagem (por exemplo, ura mensagem de boas-vindas, urna
mensagem de erro, uma mensagem de agradecimento) que a tela exibe para o usurio. O documento de requisitos tambm indica que a
tda exibe prorpts e menus para o usurio. Entretanto, um prompt na verdade apenas uma mensagem que descreve o que o usurio deve
inserir em seguida e um menu essencialmente um tipo de prompt que consiste em uma srie de mensagens (isto , opes de menu) exibida
wnsecutivamente. Portanto, em vez de atribuir a classe Screen a uma operao individual a fim de exibir cada tipo de mensagem,
prompt e menu, simplesmente criamos uma operao que possa exibir qualquer mensagem especificada por um parmetro. Colocamos
essa operao (di sp 1 ayMessage) no terceiro compartimento da classe Screen no nosso diagrama de classes (Figura 6. 21 ) . Observe que,
nesse momento, no nos preocupamos com o parmetro dessa operao -modelaremos o parmetro mais tarde nesta seo.
A partir da frase 'recebe entrada numrica do usurio' listada pela classe Keypad na Figura 6.20, conclumos que a classe Keypad
deve realizar uma operao get!nput. Como o teclado do ATM, diferentemente de um teclado de computador, contm somente os
nmeros de 0-9, especificamos que essa operao retorna um valor inteiro. Lembre-se de que no documento de requisitos, em diferentes
situaes, talvez seja necessrio que o usurio insira um tipo diferente de nmero (por exemplo, um nmero de conta, um PIN, o nmero
de uma opo de menu, uma quantia de depsito como um nmero de centavos). A classe Keypad simplesmente obtm um valor numrico
para um cliente da classe-ela no determina se o valor atende quaisquer critrios especf
i
cos. Qualquer classe que utilize essa operao
deve verificar se o usurio inseriu um nmero apropriado em uma dada situao e ento responder de maneira correspondente (isto .
exibir uma mensagem de erro via classe Se reen) . [Nota: Quando implementamos o sistema, simulamos o teclado do A TM com um teclado
de computador e, para simplificar, supomos que o usurio no vai inserir uma entrada no-numrica utilizando as teclas no teclado de
computador que no aparecem no teclado do ATM.]
A Figura 6.20 lista 'fornece o dinheiro' para a classe CashDi spenser. Portanto, criamos a operao di spenseCash e a listamos sob
a classe CashDi spenser na Figura 6.2 1 . A classe CashDi spenser tambm 'indica se contm dinheiro suficiente para satisfazer ura
solicitao de saque'. Portanto, inclumos i sSuffi c i entCashAvai 1 ab 1 e, uma operao que retorna um valor do tipo boo 1 ean, da
UML, na classe CashDi spenser. A Figura 6.20 tambm lista 'recebe um envelope de depsito' para a classe Depos i tS1 ot. A abertura
para depsito deve indicar se recebeu um envelope, portanto colocamos uma operao i sEnve 1 opeRecei ved, que retora um valor
boo 1 ean, no terceiro compartimento da classe Depos i tS1 ot. [Nota: Um hardware real da abertura para depsito provavelmente
enviaria um sinal para ao ATM para indicar que um envelope foi recebido. Entretanto, simulamos esse comportamento com uma
operao na classe Depos i tS1 ot para que a classe ATM possa ser invocada a fm de descobrir se a abertura para depsito recebeu um
envelope.]
No listamos nenhuma operao para a classe ATM nesse momento. Ainda no estamos cientes de nenhum servio que a classe ATM
forece para outras classes no sistema. Entretanto, ao implementarmos o sistema com cdigo Java, operaes dessa classe e operaes
adicionais das outras classes no sistema podem surgir.
ldemicando e mode/undv purmelros de vperuo
At este momento no nos preocupamos com os parmetros das nossas operaes Ltnlamos ganhar apenas um entendimento bsico
sobre as operaes de cada classe. Agora, vamos examinar mais detalhadamente alguns parmetros de operao. Identificamos os
parmetros de uma operao examinando quais dados a operao requer para realizar uma tarefa atribuda.
Considere a operao authent i cateUser da classe BankDatabase. Para autenticar um usurio, esa operao deve conhecer o nmero
de conta e o PIN fornecido pelo usurio. Assim, especificamos que a operao authent i cateUser recebe parmetros inteiros
userAccountNumber e userPIN, os quais a operao deve comparar ao nmero de conta e ao PJN de um objeto Account no banco de dados.
Prefxamos esse nomes de parmetros com 'user' para evitar confuso entre os nomes de parmetro da operao e os nomes dos atributos que
pertencem classe Account. Listamos esses parmetros no diagrama de classes na Figura 6.22 que modela somente a classe BankDatabase.
[Notu: perfeitamente normal modelar somente ura classe em um diagrama de classes. Nesse caso, estamos mais preocupados em examinar os
parmetros dessa nica classe em particular, portanto omitimos as outras classes. Nos diagramas de classes posteriores nesse estudo de caso, em
que parmetros no so mais o foco, omitimos esse parmetros para economizar espao. Mas no se esquea de que as operaes listadas nesses
diagramas ainda contm parmetros.]
Lembre-se de que a UML modela cada parmetro em uma lista de parmetros separada por vrgulas da operao listando o nome do
parmetro seguido por um caractere de dois-pontos e pelo tipo de parmetro (na notao da UML). Assim, a Figura 6.22 especifca que a
operao authent i cateUser recebe dois parmetros - userAccountNumber e userP I N, ambos do tipo I nteger. Quando
implementamos o sistema em Java, representaremos esses parmetros com valores i nt.
BankDatabase
authenticateUser( userAccountNumber : lnteger : userPIN : lnteger ) : Boolean
getAvailableBalance( userAccountNumber : lnteger ) : Double
getTotaiBalance( tserAccountNumber : lnteger ) : Double
credit( userAccountNumber : lnteger. amount : Double )
debit( userAcountNumber : lnteger. amount : Double )
Figura 6.22 A classe BankDatabase com parmetros de operao.
192 Captulo Metodos: um exame mc1s protundo
A classe BankDatabase com operaes getAva 1 l ab l eBa I ance, yet1 o ta I Ba I ance+ cred i t e deb1 t tamber requer um parmetro
userAccountNumber para identifi
car a conta qual o banco de dados deve aplicar as operaes, assim inclumos esses parmetros no
diagrama de classes da Figura 6.22. Alm disso, as operaes credi t e debi t requerem um parmetro Doub 1 e amount para especificar a
quantia monetria a ser creditada ou debitada, respectivamente.
O diagrama de classes na Figura 6.23 modela os parmetros das operaes da classe Account. A operao v a 1 i datePI N requer
somente um parmetro userPI N, que contm o PIN especifcado pelo usurio a ser comparado com o PIN associado com a conta. Como
ocorre com suas contrapartes na classe BankDatabase, as operaes credi t e debi t na classe Account requerem um parmetro Doub 1 e
em amount que indica a quantia monetria envolvida na operao. As operaes getAva i 1 ab 1 eBa 1 ance e getTota 1 Ba 1 ance na classe
Account no requerem nenhum dado adicional para realizar suas tarefas. Observe que as operaes da classe Account no requerem um
parmetro de nmero de conta para distinguir entre Accounts, porque essas operaes s podem ser invocadas em um objeto Account
especf
i
co.
A Figura 6.24 modela a classe Screen com um parmetro especificado para a operao di sp 1 ayMessage. Essa operao requer somente
um parmetro Stri ng message que indica o texto a ser exibido. Lembre-se de que os tipos de parmetro listados nos nossos diagramas de
classes esto em notao UM, portanto o tipo Stri ng listado na Figura 6.24 se refere ao tipo UM. Quando implementarmos o sistema em
Java, utilizaremos de fato a classe Java Stri ng para representar esse parmetro.
O diagrama de classes na Figura 6. 25 especifica que a operao di spenseCash da classe CashDi spenser recebe um parmetro
Doub 1 e amount para indicar a quantia monetria (em dlares) a ser entregue. A operao i sSuffi c i entCashAva i 1 ab 1 e tambm recebe
um parmetro Doub 1 e amount para indicar a quantia monetria em questo.
Account
accountNumber : lnteger
pin : lnteger
availableBalance : Oouble
totaiBalance : Oouble
validatePIN( userPIN: lnteger) : Boolean
getAvailableBalanceO : Double
getTotaiBalanceO : Oouble
credit( amount : Double )
debit( amount : Oouble )
figura 6. 23 A classe Account com parmetros de operao.
Screen
displayessage( message ; String )
figura 6.24 A classe Screen com parmetros de operao.
CashDispenser
count : lnteger = SOO
dispenseCash( amount : Oouble )
isSuficientCashAvailable( amount : Oouble ) : Boolean
figura 6.25 A classe CashDi spenser com parmetros de operao.
Obstrve que no discutimos os parmetros para a optrao execute das classes Bal ancelnqui ry, Wi t hdrawal t Depos l t, a
operao getlnput da classe Keypad e a operao i sEnve 1 opeRecei ved da classe Depos i tS1 ot. Nessa fase do nosso processo de
projeto, no podemos determinar se essas operaes exigem dados adicionais para realizar suas tarefas, assim deixamos suas listas de
parmetro vazias. medida que avanamos pelo estudo de caso, podemos decidir adicionar parmetros a essas operaes.
Nesta seo, determinamos vrias operaes realizadas pelas classes no sistema A T. Identifcamos os parmetros e os tipos de
retorno de algumas operaes. medida que prosseguimos pelo nosso processo de projeto, o nmero de operaes que pertencem a cada
classe talvez varie -poderamos descobrir que novas operaes so necessrias ou que algumas operaes atuais so desnecessrias -e
poderamos determinar que algumas das nossas operaes de classe precisam de parmetros adicionais e tipos de retorno diferentes.
lm:tc:ios de revisu du estudu de casu de engenhuriu de sujiwan:
6. I Qual dos seguintes no um comportamento?
a) ler dados a partir de um arquivo
b) imprimir a sada
c) gerar sada de texto
d) obter a entrada do usurio
6. 1 5 Conclusao 1 93
6.2 Se voc fosse adicionar ao sistema ATM uma operao que retornasse o atributo amount da classe Wi thdrawa 1 , como e onde vocspecllicana
essa operao no diagrama de classes da Figura 6.2 1?
6.3 Descreva o signifcado da listagem da operao a seguir que puderia aparecer em um diagrama de classes em um projeto orientado a objeto de
uma calculadora:
add { x : Integer, y : Integer ) : I nteger
Respostas aos exerccios de reviso do estudo de caso de engenharia de sftware
6. 1 c.
6.2 Para especifcar uma operao que recupera o atributo amount da classe Wi thdrawa 1 , a listagem da operao a seguir seria colocada no
compartimento de operaes (isto . terceiro) da classe Wi thdrawa 1 :
getAmount ( ) : Doub1 e
6 3 Essa listagem de operao indica que uma operao chamada de add recebe inteiros x e y como parmetros e retorna um valor inteiro.
6 Concluso
Neste captulo, voc aprendeu mais sobrt os dttalhts das dedaraes de mtodos. Tambm aprendeu a diferena entre mtodos
no
-
stat i c e stat i c e como chamar mtodos s ta ti c precedendo o nome do mtodo com o nome da classe em 4ueele aparece e um ponto
( . ). Voc aprendeu a utilizar o operador + para realizar concatenaes de string. Aprendeu ainda a declarar constantes identifcadas
utilizando tanto tipos enum como variveis pub1 i c final static. Voc viu como utilizar a classe Random para gerar conjuntos de
nmeros aleatrios que podem ser utilizados para simulaes. Tambm aprendeu o escopo dos campos e variveis locais em uma classe.
Por fim, aprendeu que mltiplos mtodos em uma classe podem ser sobrecarregados fornecendo ao mtodo o mesmo nome e assinaturas
diferentes. Esses mtodos podem ser utilizados para realizar as mesmas tarefas, ou tarefas semelhantes, utilizando tipos diferentes ou
numeros diferentes de parmetros.
No Captulo 7, voc aprender a manter listas t tabelas de dados eru arrays. Veni uma implementao mats elegante do aplicativo
4ue lana um dado 6000 vezes e duas verses aprimoradas do nosso estudo de caso GradeBook que voc estudou nos captulos 3-5. Voc
tambm aprender a a cessar os argumentos de linha de comando do aplicativo que so passados para o mtodo ma i n quando um
aplicativo inicia a execuo.
Resumo
A experinia mostrou que a melhor maneira de desenvolver e manter um programa grande constru
-
lo a partir de pequenas partes simples, ou
mdulos. Essa tcnica enominada dividir para conquistar.
H trs tipos de mdulos em Java-mtodos, classes e pacotes. Os mtodos so declarados dentro de classes. Em geral, as classes so agrupadas em
pacotes de modo que possam ser importadas para programas e reutilizadas.
Os mtodos permitem ao programador modularizar um programa separando suas tarefas em unidades autocontidas. As instrues em um mtodo
so escritas somente uma vez e permanecem ocultas em outros mtodos.
Utilizar os mtodos existentes como blocos de construo para criar novos programas uma forma de reutilizao de software que permite aos
programadores evitar a repetio de cdigo dentro de um programa.
Uma chamada de mtodo especifca o nome do mtodo a ser chamado e forece os argumentos que o mtodo chamado requer para realizar sua
tarefa. Quando a chamada de mtodo concluda, o mtodo retorna um resultado ou simplesmente o controle ao seu chamador.

Uma classe pode conter mtodos stati c para realizar tarefas comuns que no exigem um objeto da classe. Quaisquer dados que um metodu
s ta ti c poderia requerer para realizar suas tarefas podem ser enviados ao mtodo como argumentos em uma chamada de mtodo. Um mtodo s ta ti c
chamado especifcando o nome da classe em que o mtodo declarado seguido por um ponto ( . ) e pelo nome do mtodo, como em
NomeDaC/asse.nomeDoMtodo( argumemos )
Os argumentos do mtodo podem ser constantes, variveis ou expresses.
A classe Math fornece os mtodos stati c para realizar clculos matemtiws comuns. A classe Math declara dois campos que representam
constantes matemticas comumente utilizadas: Math . P I e Math . E. A constante Math . P I (3, 14159265358979323846) a relao entre a
circunferncia de um crculo e seu dimetro. A constante Ma th. E (2,7182818284590452354) o valor da base para logaritmos naturais (calculados
com o mtodo stati c Math 1 og).
Math . PI e Math . E so declaradas com os modifcadores pub 1 i c, fi na 1 e sta ti c. Torn
-
los pub 1 i c permite que outros programadores utilizem
esses campos nas suas prprias classes. Qualquer campo declarado com a palavra-chave fi na 1 constante -seu valor no pode ser alterado
depois que o campo inicializado. Tanto P I como E so declarados fi na 1 porque seus valores nunca mudam. Tornar esses campos s tat i c permite
que eles sejam a cessados via nome da classe Ma t h e um ponto ( . ) separador, como ocorre com os mtodos da classe Ma th.
1 94 Capitulo 6 Metodos. um exame ma1s profundo
Quando objetos de uma classe contendo campos s ta t 1 c t variveis de classe) so cnados, wdos o objetos dessa clasc compartilham uma cpia dos
campos sta ti c da classe. As variveis de classe e as variveis de instncia representam os campos de uma classe. Examinaremos outros detalhes
sobre os campos stat i c na Seo 8. 1 1 .
Quando voc executa a Java Virtual Machine tJ VM) com o comando j a v a, a J V M terna invocar o mtodo mai n da classe que voc espmlica. A
JVM carrega a classe especifcada pelo NomeDaC/asse e utiliza esse nome de classe para invocar o mtodo ma i n. Voc pode especifcar uma lista
opcional de Stri ngs (separadas por espaos) como argumentos de linha de comando que a JVM passar para seu aplicativo.
Voc pode colocar um mtodo main em cada classe que voc declara -somente o mtodo main da classe que voc utiliza para executar o
aplicativo ser chamado. Alguns programadores tiram proveito disso para incorporar um pequeno programa de teste a cada classe que eles
declaram.
Quando um mtodo chamado, o programa cria uma cpia dos valores de argumentos do mtodo e atribui esses valores aos parmetros
correspondentes do mtodo, que so criados e inicializados quando o mtodo chamado. Quando o controle do programa retorna ao ponto no
programa em que o mtodo foi chamado, os parmetros do mtodo so removidos da memria.
Um mtodo pode retornar no mximo um valor, mas o valor retornado poderia ser uma referncia a um objeto 4ue contm muitos valores.
Variveis devem ser declaradas c.omo campos de uma classe somente se forem utilizadas em mais de um mtodo da classe ou se o programa deve
salvar seus valores entre chamadas aos mtodos da classe.
H trs maneiras de chamar um mtodo -utilizar o prprio nome de um mtodo para chamar um outro mtodo da mesma classe; utilizar uma
varivel que contm uma referncia a um objeto, seguida por um ponto ( . ) e o nome do mtodo para chamar um mtodo do objeto referenciado; e
utilizar o nome da classe e um ponto ( . ) para chamar um mtodo s ta ti c de uma classe.
H trs maneiras de retornar o controle a uma instruo que chama um mtodo. Se o mtodo no retornar um resultado, o controle retornar
quando o fuxo do programa alcanar a chave direita de fechamento do mtodo ou quando a instruo
return;
tor executada. Se o mtodo retornar um resultado, a instruo
ersreturn;
avalia a expresso e ento imediatamente retorna o valor resultante ao chamador.
Se um mtodo tiver mais de um parmetro, os parmetros sero especifcados como uma lista separada por vrgulas. Deve h a ver um argumento na
chamada de mtodo para cada parmetro na declarao do mtodo. Alm disso, cada argumento deve ser consistente com o tipo do parmetro
correspondente. Se um mtodo no aceitar argumentos, a lista de parmetros estar vazia.
Stri ngs podem ser concatenadas com o operador +, o que posiciona os caracteres do operando direi to no fnal dos caracteres do operando
esquerdo.
Todos o objetos e valores primitivos em Java tm uma representao de Stri ng. Quando um objeto e concatenado com uma Stri ng, o objeto
convertido em uma String e ento as duas Stri ngs so concatenadas.
Para valores primitivos utilizados na concatenao de strings, o JVM trata da converso dos valores primitivos em Stri ngs. Se um boo 1 ean for
concatenado com uma String, a palavra ' t rue' ou a palavra ' fa 1 se ' ser utilizada para representar o valor O. Se houver zeros finais em um
valor de ponto futuante, eles sero descartados quando o nmero for concatenado para formar uma Stri ng.
Todos os objetos em Java tm um mtodo especial denominado toStri ng que retorna uma representao Stri ng do contedo do objeto. Quando
um objeto concatenado com uma Stri ng, a JVM chama implicitamente o mtodo toStri ng do objeto a fim de obter a representao string do
objeto.
Quando um literal Stri ng grande digitado no cdigo-fonte de um programa, os programadores podem dividir essa Stri ng em vrias Stri ng
menores, colocando-as em mltiplas linhas de cdigo para melhorar a legibilidade e remontando ento as Stri ngs via concatenao.
As pilhas so conhecidas como estruturas de dados do tipo ltimo a entrar, primeiro a sair (LIFO -last-in,first-out ) -o ltimo item inserido na
pilha o primeiro item que removido da pilha.
Um mtodo chamado deve saber como retorar ao seu chamador, portanto o endereo de retorno do mtodo chamador colocado na pilha de
execuo de programa quando o mtodo chamado. Se uma srie de chamadas de mtodo ocorrer, os sucessivos endereos de retorno so
empilhados na ordem 'ltimo a entrar, primeiro a sair' de modo que o ltimo mtodo a executar ser o primeiro a retorar ao seu chamador.
A pilha de execuo de programa contm a memria para as variveis locais utilizadas em cada invocao de um mtodo durante a execuo de um
programa. Esses dados so conhecidos como registro de ativao ou quadro de pilha da chamada de mtodo. Quando uma chamada de mtodo
feita, o registro de ativao dessa chamada de mtodo inserido na pilha de execuo de programas. Quando o mtodo retorna ao seu chamador, o
registro de ativao dessa chamada de mtodo retirado da pilha e essas variveis locais no so mais conhecidas para o programa. Se uma varivel
local que armazena uma referncia a um objeto for a nica varivel no programa com uma referncia a esse objeto, quando o registro de ativao
que contm essa varivel local for retirado da pilha, o objeto no pode mais ser acessado pelo programa e conseqentemente ser excludo da
memria pela JVM durante a 'coleta de lixo'.
A quantidade de memria em um computador fnita, ponanto somente certa quantidade de memria pode ser utilizada para armazenar registros
de ativao na pilha de execuo do programa. Se houver um nmero maior de chamadas de mtodo do que seus registros de ativao podem
armazenar na pilha de execuo do programa, ocorrer um erro conhecido como estouro de pilha. O aplicativo compilar corretamente, mas sua
execuo causa um estouro de pilha.
Um recurso importante das chamadas de mtodo a promoo de argumentos convener o valor de um argumento para o tipo que o mtodo
espera receber no seu parmetro correspondente.
Um conjunto de regras de promoo se aplica a expresses que contm valores de dois ou mais tipos primitivos e a valores de tipo primitivo passados
como argumentos para os mtodos. Cada valor promovido para o tipo 'mais alto' na expresso. Em casos em que as informaes podem ser perdidas
devido converso, o compilador Java exige que o programador utilize um operador de coero para explicitamente forar a converso.
Terrmolog1a 1 95
0 objclU da dasse Random Wacote Java. ut 1 l ) pudem produzir valor 1 nt, l ong, fl oat ou doub l e aleatnu. 0 me tudo Math random podt
produzir valores doub 1 e no intervalo O . O : x < 1 . O, onde x o valor retorado pelo mtodo random.
O mtodo Random next I nt gera um valor aleatrio i nt no intervalo entre -2. 1 47.483.648 e + 2. 1 47 .4!3.647. Os valores retornados por
nex t I nt so na verdade nmeros pseudo-aleatrios -uma seqncia de valores produzida por um clculo matemtico complexo. Esse clculo
utiliza a hora do dia atual para semear o gerador de nmeros aleatrios de maneira que cada execuo de um programa fornece uma seqncia
diferente de valores aleatrios.
A classe Random fornece outra verso do mtodo next I nt qut recebe um argumento i nt e retoma um valor a partir de O, mas sem inclu
-
lo, at o
valor do argumento.
Os nmeros aleatrios em um intervalo podem ser gerados com
number valorDeDes/ocamento randomNumbers . nex tI n t ( jarurLet:culunwnento
)
; +
onde ''alurLeLeslocumcnru espec1fica o primeiro nmero no intervalo desejado de inteiro wnsecutivos e juturLeEscalunumelllu especilia 4uantos
nmeros esto no intervalo.
Os nmeros aleatrios podem ser tswlhidos a partir de intervalos dt inteiro no-wnseuuvos, como em
number I!urDeDeslocammw +
dierenaEmreValores * randomNumbers. nextint ( fatorLeEscalunumentu ) ;
onde v<iurDeDeslocamento especifica o primeiro nmero no intervalo de valores, diferenuEntr'ulures representa a d1terena entre nmero
consecutivos na seqncia efatorDeEsca/onamemo especifica quantos nmeros esto no intervalo.
Para depurao, s vezes til repetir a mesma seqncia de nmeros pseudo
-
aleatrios durante cada execuo de programa para provar que seu
aplicativo funciona com uma seqncia especfca de nmeros aleatrios antes de testar o programa com diferentes seqncias de nmeros
aleatrios. Se a repetibilidade for importante, voc poder criar um objeto Random passando um valor inteiro 1 ong para o construtor. Se a mesma
semente for utilizada todas as vezes que o programa executa, o objeto Random produz a mesma seqncia de nmeros aleatrios. Voc tambm
pode configurar a semente de um objeto Random a qualquer momento chamando o mtodo setSeed do objeto.
Uma enumerao introduzida pela palavra
-
chave e num (novo no J2SE 5.0) e um nome de tipo. Como com qualquer classe, as chaves ( I e ) )
delimitam o corpo de uma declarao enum. Dentro das chaves h uma lista de constantes de enumerao separada por vrgulas, cada uma
representando um valor nico. Os identificadores em uma enum devem ser nicos. Podem
-
se atribuir variveis de um tipo enum somente a
constantes do tipo e num.
Constantes tambm podem ser declaradas coro variveis pub 1 i c fi na 1 s tat i c. Essas constantes, por conveno, so declaradas com todas as
letras maisculas, fazendo com que elas se destaquem no programa.
O escopo a parte do programa em que uma entidade, coro uma varivel ou um mtodo, pode ser referida pelo seu nome. Diz
-
se que essa entidade
est no escopo' para essa parte do programa.
O scopo de uma declarao de parmetro o corpo do mtodo em que a declarao aparece.
O escopo de uma declarao de varivel local vai do ponto em que a declarao aparece at o linal desse bloco.
O esopo de um rtulo em que uma instruo break ou conti nue rotulada o corpo da instruo rotulada.
O escopo de uma declarao de varivel local que aparece na seo de inicialzayo do cabealho de uma instruo for o corpo da instruo for
com as outras expresses no cabealho.
O escopo de um rto_do ou campo de uma classe o corpo inteiro da dasse. lsso prmne que o mtodos da classe utilizem nomes simples para
chamar os outros mtodos da classe e acesser os campos da classe.
Qualquer bloco pode conter declaraes de varivel. Se uma varivel lol ou uu1 parmetro em um mtodo tiver o mesmo nome de um campo, o
campo permanece 'sombreado' at que o bloco termine a execuo.
O Java permite que vrios mtodos com o mesmo nome sejam declarados em uma classe, contanto que os me todos tenham diferentes conJunto dt
parmetros (determinados pelo nmero, ordem e tipos dos parmetros). Essa tcnica denominada sobrecarga de mtodo.
Mtodos sobrecarregados so diferenciados por suas assinaturas -combinaes dos nomes dos mtodos e nmeros, tipos e ordem dos seus
parmetros. Os mtodos no podem ser diferenciados por tipo de retorno.
Terminologia
abordagem dmd1r para .onqulStar
argumento de linha de comando
assinatura de um mtodo
bloco
campos ocultos'
chamada de mtodo
classe Random
colocar (em uma pilha)
componentes reutilizveis de software
concatenao de string
constante de enumerao
declarao de mtodo
deslocar um intervalo {nmeros aleatrios)
documentao da API do Java
elemento sorte
enumerao
escopo de uma dedarau
estouro de pilha
estrutura de dado ultimo a entrar, pr11U1ro a
sair (LIFO - last-in.irsc-ow)
fator de escala (nmeros aleatrios)
fazer sua pontuao Uogo de dados c:rup)
funo
implememao ocul ta detalhada
interface de programas aplicativos
invocar um mtodo
Java Apphcauou Prograrm10g lnterlace
(API)
lista de parmetros
lista de parmetros separada por virgulas
mtodo de classe
mtodo declarado pelo programador
mtodo nextint de Random
mtodo random de Math
mtodo setSeed de Random
mtodo sobrecarregado
modularizando um programa com mtodo
mdulo
nmero pseudo-aleatro
1 96 6 Metodos: um exame mats DIOUHUO
oumros altatonos
pacote
pilha d excuo do programa
procedimento
rtirar ldi uma p1lha)
reutilizao de software
simulao palavra
-
cha v e num
palavra
-
chave fi na 1
palavra
-
chave return
parmetro
parmetro formal
pilha
pilha de chamada dt mtodo
Exerccios de reviso
promoo de argumentos
promoes de tipos primitivo
quadro de pilha
registro de ativao
regras de promoo
relacionamento hierrquico de mtodo
trabalhador/mtodo chefe
6. I Preencha as lacunas em cada uma das seguintes instrues:
sobrecarga de mtodos
sombrear um campo
valor de deslocamento (nmeros aleatrios)
valor de semente (nmeros aleatrios)
varivel de classe
varivel local
a) Um mtodo invocado com um( a} --
,
.
--
..
b) Uma varivel conhecida somente dentro do mtodo em que declarado chama-se -
-
,
-
-
c) A instruo em um mtodo chamado pode ser utilizada para passar o valor de uma expresso de volta para o metodo de
chamada.
d) A palavra
-
chave indica que um mtodo no retora um valor.
e) Os dados podem ser adicionados ou removidos somente do( a) de uma pilha.
f As pilhas so conhecidas como estruturas de dados -o ltimo item colocado (inserido) na pilha e o pnmtmo item reurado
(removido) da pilha.
g) As trs maneiras de retornar o controle de um mtodo chamado a um chamador so e

h) Um objeto da classe produz nmeros aleatrios.
i) A pilha de execuo de programa contm a memria criada para variveis loca
.
is a cada invocao de um mtodo durante a execuo de
um programa. Esses dados, armazenados como uma parte da pilha de execuo de programa, so conhecidos como ou
da chamada de mtodo.
j)
=
se
-
,
-
ho
_
u
_
v
-
er
-
mais chamadas de mtodo do que pode ser armazenado na pilha de execuo do programa, um erro conhecido como

--ocorrer.
k) O (A) de uma declarao a parte de um programa que pode referenciar a entidade na declarao pelo nome.
I) Em Java possvel ter diversos mtodos com o mesmo nome que operam, separadamente, sobre diferentes tipos ou nmeros de
argumentos. Esse recurso denominado mtodo de
--
:
-
=-
-
m) A pilha de execuo de programa tambm denominada pilha de

6.2 Para a classe Craps na Figura 6.9, declare o escopo de cada uma das seguintes entidades:
a) a varivel randomNumbers.
b) a varivel di el.
c) o mtodo ro 1 1 Di c e.
d) o mtodo p 1 ay.
e) a varivel sumOfDi c e.
6. 3 Escreva um aplicativo que teste se os exemplos de chamadas de mtodo da classe Ma th mostrada na Figura 6.2 realmente produz os reultados
indicados.
6.4 Fornea o cabealho de mtodo para cada um dos seguintes mtodos.
a) O mtodo hypotenuse, que aceita dois argumentos de ponto flutuante d preciso dupla s i de l e si de2 e retorna um resultado de
ponto futuante de dupla preciso.
b) O mtodo sma 1 1 est, que recebe trs inteiros x, y e z e retorna um inteiro.
c) O mtodo i nstruct i ons, que no aceita nenhum argumento e no retorna um valor. [Nota: Esses mtodos so comumente utilizados
para exibio de instrues para o usurio.]
d) O mtodo i ntToF1 oat, que aceita um argumento inteiro number e retorna um resultado de ponto futuante.
6. 5 Em;ontre o erro em cada um dos seguintes segmentos de programa. Explique como corrigir o erro.
a) i n t g ( )
{
System. out . pri n t 1 n ( " l ro l ut mtthod y" ) ;
i nt h ( )
{
System.out . pri nt1 n(
b) 1 11 t sum( i nt x, i n t y )
i nt resu1 t ;
resu1 t = x + y ;
J- m:Un.J , ) ;
c) vo1 d f ( float a ) ;
{
float a ;
System. out . pri ntl n ( a ) ;
d) voi d product ( )
{
i nt a : 6 , b : 5 , c : , resu l t ;
resul t a * b * c ;
System. ou t . pri ntf( "Resul t i s %d\ll" , resul t ) ;
return resul t ;
Respostas dos exerccios de revi so I 9 7
6.6 Escreva um aplicativo Java completo para solicitar ao usurio o raio (do tipo doub 1 e) de uma esfera e chame o mtodo sphereVo l ume para
calcular e exibir o volume da esfera. Utilize a seguinte instruo para calcular o volume:
double vol ume : ( 4. 0 / 3 . 0 ) * Math. PI * Math. pow( radi us, 3 )
Respostas dos exerccios de reviso
6. 1 a) chamada de mtodo. b) varivel local. c) return. d) voi d. e) parte superior. I) ltimo a entrar, primeiro a sair (LIFO). g) return; ou
return expresso; ou encontre a chave direita de fechamento de um mtodo. h) Random. i) registro de ativao, quadro de pilha. j) estouro de pilha. k)
escopo. I) sobrecarga. m) chamada de mtodo.
6.2 a) corpo de classe. b) bloco que define o corpo do mtodo ro l l Di c e. c) corpo de classe. d) corpo de classe. e) bloco que deline o corpo do
mtodo pl ay.
6.3 A seguinte soluo demonstra os mtodos da classe Math na Figura 6.2:
1 // Exerc ci o 6 . 3 : MathTest . java
2 // Testando os mtodos da cl asse Math.
3
4 publ i c class MathTest
5
{
6 publ i c stat i c voi d mai n ( String args[] )
7
{
8 System. out. pri ntf( Math . abs ( 23 . 7 ) : %f\n" , Math . abs ( 23 . 7 ) ) ;
9 System.out . pri ntf( "Math . abs ( 0. 0 ) Yf\n" , Math. abs ( 0. 0 ) ) ;
10 System. out . pri ntf( "Math . abs ( -23. 7 ) 9f\n" , Math.abs( -23 . 7 ) ) ;
11 System. out. pri ntf( "Math . cei l ( 9 . 2 ) %f\n" , Math. cei l ( 9 . 2 ) ) ;
12 System. out. pri ntf( "Math . cei l ( -9 . 8 ) %f\n" , Math . cei l ( -9 . 8 ) ) ;
13 System. out. printf( "Math . cos ( 0. 0 ) %f\n" , Math.cos( 0. 0 ) ) ;
14 System. ut. printf( "Math . exp( 1 . 0 ) %f\n , Math. exp( 1 . 0 ) ) ;
15 System. out. printf( "Mat h . exp( 2. 0 ) = %f\n" , Math.exp( 2. 0 ) ) ;
16 System. out. pri ntf( "Math . fl oor ( 9. 2 ) %f\n " , Math. floor( 9 . 2 ) ) ;
17 System. out. pri ntf( Math . fl oor( -9 . 8 ) %f\n" ,
18 Math. floor( -9. 8 ) ) ;
19 System. out. pri ntf( "Math . l og{ Math . E ) %f\n" ,
20
Math. l og ( Math. E ) ) ;
21 System. out. pri ntf ( "Math . 1 og ( Math. E * Math. E ) %f\n " ,
22 Mat h . l og ( Math . E * Math . E ) ) ;
23 System. out. pri ntf( "Math . max ( 2 . 3, 12 . 7 ) %f\n " ,
24 Math.max( 2 . 3, 12 . 7 ) ) ;
25 System. out.printf( "Math. max( -2 . 3, - 12 . 7 ) %f\n" ,
26 Math.max( -2. 3 , - 12 . 7 ) ) ;
27 System.out.pri ntf( "Math . mi n ( 2 . 3 , 12 . 7 ) t\n" ,
28 Math. mi n ( 2 . 3 , 1 2. 7 ) ) ;
29 System. out. pri ntf( Math . mi n { -2 . 3 , -12 . 7 ) - :f\n" ,
30 Math. mi n ( -2 . 3 , -12 . 7 ) ) ;
31 System. out. pri ntf( "Math . pow( 2. 0, 7 . O ) -f\n" ,
32
Math.pow( 2 . 0 , 7 . O ) ) ;
33 System. out.printf( "Math . pow( 9 . 0, 0 . 5 ) ,. ,f\n" ,
34
Math.pow( 9 . 0 , 0. 5 ) ) ;
1 98 Captulo 6 Mtodos: um exame mais profundo
35 System. out. printf( "Math . s1 n( 0. 0 ) - t\n" , Math . s i n ( 0. 0 ) ) ;
36 System. out. printf( "Math . sqrt ( 900. 0 ) %f\n" ,
37 Math . sqrt( 900. 0 ) ) ;
38 System. out. pri ntf( "Math. sqrt( 9. 0 ) %f\n" , Math.sqrt( 9. 0 ) ) ;
39 System. out. pri ntf( "Math . tan ( 0. 0 ) %f\n" , Math.tan( 0. 0 ) ) ;
40 ) // fim de mai n
41 // fi m da cl asse MathTest
Math . abs( 23, 7 ) 23, 700000
Math . abs( 0, 0 ) = 0, 000000
Math . abs( -23,7 ) 23, 700000
Math . cei l ( 9, 2 ) 10,000000
Math . cei l ( -9,8 ) -9, 000000
Math . cos( 0, 0 ) 1 , 000000
Math.exp( 1 , 0 ) 2, 718282
Math.exp( 2, 0 ) 7 , 389056
Math.floor( 9, 2 ) 9, 000000
Math. fl oor( -9,8 ) -10, 000000
Math . l og ( Math. E ) 1, 000000
Math . l og ( Math. E * Math . E ) 2, 000000
Math.max( 2, 3; 12, 7 ) 12, 700000
Math.max( -2, 3; -12 , 7 ) -2, 300000
Math.mi n ( 2, 3; 12, 7 ) 2 , 300000
Math.mi n ( -2, 3; -12, 7 ) -12,700000
Math. pow( 2, 0; 7, 0 ) 128, 000000
Math.pow( 9, 0; 0, 5 ) 3 ,000000
Math . si n ( 0, 0 ) 0, 000000
Math.sqrt( 900, 0 ) = 30, 000000
Math. sqrt( 9,0 ) 3 , 000000
Math . tan( 0, 0 ) 0, 000000
6.4 a) double hypotenuse( double si del , doubl e si de2 )
b) i nt sma l l est( i nt x, i nt y, i nt z )
void i nstructi ons ( )
d) float i ntToFl oat( i nt number )
6. 5 a) Erro: O mtodo h declarado dentro do mtodo g.
Correo: Mova a declarao de h para fora da declarao de g.
b) Erro: O mtodo supostamente deve retornar um inteiro, mas no o faz.
Correo: Exclua a varivel resu 1 t e coloque a instruo
return x + y;
no mtodo, ou adicione a seguinte instruo no fim do corpo de mtodo:
return resul t ;
c) Erro: O ponto-e-vrgula aps o parntese direito da lista de parmetros est incorreto, e o parmetro a no deve ser redeclarado no
mtodo.
Correo: Exclua o ponto-e-vrgula aps o parntese direito da lista de parmetros e exclua a declarao fl oat a; .
d) Erro: O mtodo retorna um valor quando supostamente no deveria faz-lo.
Correo: Altere o tipo de retorno de voi d para i nt.
6.6 A seguinte soluo calcula o volume de uma esfera, utilizando o raio inserido pelo usurio:
1 // Exercci o 6. 6 : Sphere. j ava
2 // Cal cul a o vol ume de uma esfera.
3 i mport java . ut i l . Scanner;
4
5 publ i c cl ass Sphere
6
{
7 // obtm o rai o a part i r do usurio e exibe o vol ume da esfera
8 publ i c void deterineSphereVol ume()
9
{
10 Scanner i nput = new Scanner( System. i n ) ;
11
1 System.out . pnnt( " tnter fdOlu or phen. " ) ;
13 double radi us = i nput. nextDoubl e( ) ;
14
15 System. out . pri ntf ( " V o 1 ume i s %f\n" , sphereVo 1 ume ( r adi us ) ) ;
16 } // fi m do mtodo determineSphereVol ume
17
18 // cal cul a e retorna o vol ume da esfera
19 publ i c double sphereVolume( double radius
20
{
21 double vol ume = ( 4.0
I
3 . 0 ) * Math . PI * Math. pow( radi us, 3 ) ;
22 return vol ume;
23 } // fim do mtodo sphereVol ume
24 } // fim da c l asse Sphere
1 11 Exerc c1 o 6 . 6 : SphereTest . java
2 // Cal cul a o vol ume de uma esfera.
3
4 publ i c cl ass SphereTest
5 {
6 // ponto de partida do apl i cativo
7 publ i c stat i c voi d mai n ( String args[]
8 {
9 Sphere mySphere new Sphere ( ) ;
10 mySphere. determi neSphereVol ume( ) ;
1 1 } // f i m d e mai n
12 } // fim da cl asse SphereTest
Enter radius of sphere: 4
Vol ume i s 268.082573
Exerccios
6. 7 Qual o valor de x depois que cada uma das seguintes instrues executada?
a) x = Math . abs ( 7. 5 ) ;
b) x = Math. fl or( 7 . 5 } ;
c) x = Math . abs( 0. 0 ) ;
d) x = Math . cei l ( 0. 0 } ;
e) x = Math . abs ( -6 . 4 } ;
Q x = Mat h . cei l ( -6 . 4 ) ;
g) x = Mat h . cei l ( -Math. abs( -8 Math . floor( - - ) ) ) ;
ExerciCIOS I 99
6. 8 Um estacionamento cobra uma taxa mnima de $ 2 para estacionar por ate trs horas. Um adicional de $ 0,50 por hora nu necessuriumente
immu e cobrado aps a trs primeiras horas. A carga mxima para qualquer dado perodo de 24 horas $ I O. Suponha que nenhum carro fica
estacionado por mais de 24 horas por vez. Escreva um aplicativo que calcule e exiba a taxas de estacionamento para cada cliente que estacionou nessa
garagem ontem. Voc deve inserir a horas de estacionamento para cada cliente. O programa deve exibir a cobrana para o cliente aluai e calcular e
exibir o total dos recibos de ontem. O programa deve utilizar o mtodo cal cul ateCharges para determinar a cobrana para cada cliente.
6. 9 Uma aplicao do mtodo Math . fl oor arredondar um valor para o inteiro mais prximo. A instruo
y = Math.floor( x + 0. 5 ) ;
vai arredondar o nmero x para o inteiro mais prximo e atribuir o resultado a y. Escreva um aplicativo que l valores doub 1 e e utilize a instruo
anterior para arredondar cada um dos nmeros para o inteiro mais prximo. Para cada nmero processado, exiba ambos os nmeros, o original e o
arredondado.
6. 1 O Math. fl oor pode ser utilizado para arredondar um nmero para uma casa decimal especifica. A instruo
y Math fl oort x * 10 + 0. 5 ) I lU;
arredonda X para a casa decimal (isto , a primeira posto a direita do ponto dt !rao dectmal). A trtruo
y = Math .floor( x * lOU + 0. 5 )
I
100;
arrdonda x para a casa centesimal (isto , a segunda posio direita do ponto de !rao de,tmal)~ Escreva um aplicativo que ddina quatro mtodos
para arredondar um nmero x de vrias maneiras:
200 Capitulo 6 Metodos. um exame mal! prolundo
a) roundToi nteger( number )
b) roundToTenth s ( number )
roundToHundredths ( number )
d) roundToThousandths ( number )
Para tada leitura de valor, seu programa deve exibir o valor original, o nmero arredondado para o inteiro mais prximo, o nmero arredondado para
o dcimo mais prximo, o nmero arredondado para o centsimo mais prximo e o nmero arredondado para o milsimo mais prximo.
6. 1 I Responda a cada uma das seguintes perguntas:
a) O que signilica escolher nmeros "aleatoriamente"?
b) Por que o mtodo Math . random til para simular jogos de atar"l
c) Por que freqentemente necessrio escalonar ou deslocar os valore produttdos por um objeto Random"!
d) Por que a simulao computadorizada de situaes do mundo real uma tcnica til?
6. 1 2 Escreva instrues que atribuem inteiros aleatrios varivel 11 nos seguintes intervalos:
a) I 51 5 2
b) I 5 11 $ I 00
c) 0 5n 59
d) 1 .000 $n 5 1 1 1 2
e) -1 5 n 5 1
O -3 5n $ l l
6. 1 3 Para cada um dos segumtes onjuntos de tntetro, etreva uma nica instruyo 4ue exiba um ou mero aleatoriamente a partir do tanJunw.
a) 2, 4, 6, 8, 1 0.
b) 3, 5, 7, 9, 1 1 .
c) 6, 10, 14, 18, 22.
6. 1 4 Escreva um mtodo i ntegerPower ( base, exponent ) que retora o valor de
baseX'et
Por exemplo, i ntegerPower ( 3, 4 ) calcula 3
4
(ou 3 * 3 * 3 3). Assuma que exponent um IlHe iro no-zero posntvo, e base um HHeiro. U mtodo
i ntegerPower deve utilizar um loop for ou whi 1 e para controlar o clculo. No utilize nenhum mtodo da biblioteca de matemtica. Incorpore esse
mtodo a um aplicativo que l os valores inteiros para base e exponent e realiza o clculo com o mtodo i ntegerPower.
6. I 5 Dlna u mtodo hypotenuse que calcule o comprimento da hipotenusa de um tringulo direito quando os comprimentos dos outros dois lados so
conhc,tdos. (Utilize os dados do exemplo na Figura 6.26.) O mtodo deve receber dois argumentos do tipo doub 1 e e retornar a hipotenusa como um doub 1 e.
Incorpore es mtodo a um aplicativo que l valores para si del e si deZ e realiza o clculo com o mtodo hypotenuse. Determine o comprimento da
bipotenusa para cada um dos tringulos na Figura 6.26.
I
2
3
3. 0
5.0
8.0
4. 0
12 . o
15.0
2ut8 6.26 Valores para os lados dos tringulos no Exerccio 6. 1 5.
6. 1 6 Escreva um me rodo mu 1 ti p 1 e que determllla um par de inteiro se o segundo intetro for mltiplo do primeiro. O mtodo deve aceitar dois
argumentos inteiros e retornar t rue se o segundo for mltiplo do primeiro e f a 1 se o contrrio. Incorpore esse mtodo a um aplicativo que insere uma
srie de pares inteiros (um par por vez) e determina se o segundo valor em cada par mltiplo do primeiro.
6. I 7 Escreva um mtodo i sEven que utiliza o operador de resto (%) para determinar st um inteiro par. O mtodo deve aceitar um argumento
wteiro e retornar t rue se o inteiro for par e fa 1 se o contrrio. Incorpore esse mtodo a um aplicativo que insere uma seqncia de inteiros (um por vez)
e determina se cada um par ou impar.
6. 1 8 Escreva um mtodo squareOfAsteri sks 4ue exibe um quadrado slido {o mesmo nmero de linhas e colunas) de asteriscos CUJo lado
especilicado no parmetro inteiro s i de. Por exemplo, se s i de for 4, o mtodo dever exibir
****
****
****
lncurpore esse me todo a um aphcaliVu 4ue l um valor tutetro para s 1 de a parttr da entrada forecida pelo usuano e gera sada dos astemw wm o
mtodo squareOfAsteri sks.
6. I 9 Modifique o mtodo niado nu Exerci cio 6. 1 ! para formar o quadrado a partir de qualquer que seja o caractere contido no parmetro de
caractere fi 1 1 Character. Portanto, se s i de for 5 e fi 1 1 Character for '#', o mtodo deve exibir
#UI#
///1
N/ #II
II II
#1#1#
EerCICtO! 20 I
. 20 Esm!a um aplicamo 4u sohma ao usurio o raJO 1 lum cirwlo e uulita um me todo chamado c 1 r c I eArea para calcular a ara do l;ulo.
6. 2 I Escreva segmentos de programa que realizam cada uma das sgumtes tardb:
a) Calcule a parte inteira do quociente quando o inteiro a dividido pelo intmo b.
b) Calcule o resto inteiro quando o inteiro a dividido pelo inteiro b.
c) Utilize segmentos do programa desenvolvidos nas partes (a) e (b) para ecrevtr um me todo d 1 sp I ayD1 9 i ts que rcb um 11Hmu tnm 1
e 99999 e o exibe como uma seqncia de dgitos, separando cada par de dgitos por dois espaos. Por exemplo, o inteiro 4562 deve
aparecer como
4 5 6 2
d) Incorpore o mtodo desenvolvido na parte (c) a um aplicativo qut insr um intiro e chama di sp l ayDi gi ts passando o mtodo qu o
inteiro inseriu. Exiba os resultados.
. 22 Implemente os seguintes mtodos de inteiro:
a) O mtodo c e l s i us retorna o equivalente em Celsius de uma temperatura em Fahrenheit utilizando o clculo
c = 5. 0 I 9. 0 * ( F - 32 ) ;
b) O mtodo fahrenhei t retorna o equivalente em Fahrenheit de uma temperatura m Celsius utilizando o clculo
F 9. o I . o * c + 32;
c) Utiliz os mtodos nas parts (a) e (b) para escrever um aplicativo que permite ao usurio insrir uma tmperatura em Fahrnhen e extbt
o equivalente em Celsius ou inserir uma temperatura em Celsius e exibe o equivalente em Fahrenheit.
6.23 Escreva um mtodo mini mum3 que retorna o menor de trs nmeros de ponto futuante. Utilize o mtodo Math. mi n para implementar
mi ni mum3. Incorpore o mtodo a um aplicativo que l trs valores do usurio, determina o menor valor e exibe o resultado.
6.24 Dizemos que um nmero inteiro um nmero perfeiro se a soma de seus fatores, incluindo I (mas no o prprio nmero), igual ao nmero. Por
exemplo, 6 um nmero perfeito porque 6 I + 2 + 3. Escreva um mtodo perfect que determina se parmetro number um nmero perfeito. Utilize
esse mtodo em um applet que determina e exibe todos os nmeros perfeitos entre l e l .000. Exiba os fatores de cada nmero perfeito confirmando que o
nmero de fato perfeito. Desafe o poder de computao do seu computador testando nmeros bem maiores que l .000. Exiba os resultados.
6 25 Dizemos que um inteiro primo se ele divisvel somente por I e ele prprio. Por exemplo, 2, 3, 5 e 7 so primos, mas 4, 6, 8 e 9 no o so.
a) Escreva um mtodo que determina se um nmero primo.
b) Utilize esse mtodo em um aplicativo que determina e exibe todos os nmeros primos menores que 10.000. Quantos desse numeros
I 0.000 voc precisa testar a fim de assegurar que encontrou todos os primos?
c) Inicialmente voc poderia pensar que n/2 o limite superior que deve testar para ver se um nmero primo, mas voc precisa ir apenas ate
a raiz quadrada de n. Por qu? Reescreva o programa e execute-o de ambas as maneiras. Estime o melhor desempenho.
6. 16 Escreva um mtodo que aceita um valor inteiro e retorna o nmero com seus dgitos invertidos. Por exemplo, dado o nmero 7.31 . o
mtodo deve retornar 1 .367. Incorpore o mtodo a um aplicativo que l um valor a partir da entrada fornecida pelo usurio e exibe o resultado.
6.2 7 O mximo divisor comum (MDC) de dois inteiros o maior inteiro que divisvel por cada um dos dois nmeros. Escreva um mtodo mdc que retora
o mximo divisor comum de dois inteiros. Incorpore o mtodo a um aplicativo que l dois valores do usurio e exibe o reultado.
6.28 Escreva um mtodo qual i tyPoi nts que insere a mdia de um aluno e retora 4 se a mdia estiver entre 90 e I 00, 3 se a mdia estiver entre 80 e
89, 2 se a mdia estiver entre 70 e 79, 1 se a mdia estiver entre 60 e 69, e O se a mdia for mais baixa que 60. Incorpore o mtodo a um aplicativo que l um
valor do usurio e exibe o resultado.
6.2 9 Escreva um aplicativo que simula o lanamento de uma moeda. Deixe o programa lanar uma moeda toda vez que o usurio escolher a opo
'Toss Coi n' no menu. Conte o nmero de vezes que cada lado da moeda aparece. Exiba os resultados. O programa deve chamar um mtodo separado
fl i p que no aceita nenhum argumento e retorna fa l se para coroa e t rue para cara. [Nota: Se o programa simular o arremesso de moeda de maneira
ralista, cada lado da moeda deve aparecer aproximadamente metade das vezes.)
6. 30 Os computadores esto desempenhando um crescente papel na educao. bneva um programa que ajudara um estudante do ensmo
fundamental a aprender multiplicao. Utilize um objeto Random para produzir dois inteiros positivos de um algarismo. O programa ento deve fazer
ao usurio uma pergunta, como
How much i s 6 times 7?
U aluno tnsere ento a resposta. Em seguida, o programa verifica a rsposta do aluno. Se esuvr wrreta, exiba a mensagent "Very good ! " e faa outra
pergunta de multiplicao. Se a resposta estiver errada, exiba a mensagem "No. Pl e ase t ry aga i n . " e deixe que o estudante tente a mesma pergunta
repetidamente at por fm responder corretamente. Um mtodo separado deve ser utilizado para gerar cada nova pergunta. Esse mtodo deve ser
chamado uma vez quando a aplicao inicia a execuo e toda vez que o usurio responde pergunta corretamente.
6.3 I O uso de computadores na educao referido como instruo auxiliada porcomplllador(C AI computer-u.,:llltd 11wnwwn). Um problema
que s denvolve em ambientes CAI a fadiga do estudante. Esse problema pode ser eliminado variando as respostas do omputador para prender a
ateno do estudante. Modifque o programa do Exerccio 6.30 de modo que os vrios comentrios sejam exibidos para cada resposta correta e cada
resposta incorreta, como segue:
Respostas para uma resposta correra:
Very good! [Mui to bom! ]
Excel lent! [Excel ente ! ]
Ni ce work! [Bom trabal ho! ]
Keep up the good work! [Conti nue o bom traba l ho! ]
Kcspostas para uma resposta incorreta:
No. Please try agai n . [No. Tente de novo.)
Wrong. Try once more. [Errado. Tente mai5 uma vez . ]
202 Cap tulo 6 Metodos. um exame ma1s profundo
Don ' t g i ve up! [No des i sta! ]
No. Keep tryi ng. [No. Continue tentando . ]
Uulze gerao de nmeros aleatrios para escolher um nmero eum I 4 que str utilizado para selecionar uma resposta apropnada para ada
resposta. Utilize uma instruo swi tch para emitir as respostas.
6.32 Sistemas mais sofisticados de instrues auxiliadas por computador ronituram o desempenho do estudante durante um perodo de tempo. A
deciso sobre um novo tpico freqentemente baseada no sucesso do estudante com tpicos prvios. Modifique o programa de Exerccio 6. 31 para
contar o nmero de respostas corretas e incorretas digitadas pelo estudante. Depois que o aluno digitar 10 respostas, seu programa deve calcular a
porcentagem de respostas corretas. Se a porcentagem for inferior a 75%, exiba P1 e ase as k your i nstructor for extra h e 1 p [Pea ajuda ao seu
i nstrutor] e reinicialize o programa para que outro estudante possa experiment-lo.
6. 3 3 Escreva um aplicativo que joga 'adivinhe o nmero' como a seguir: Seu programa escolhe o nmero a ser adivinhado selecionando um 1ntmo
aleatno no intervalo de I a 1 .000. O aplicativo exibe o prompt Guess a number between 1 and 1 . 000 [Advi nhe um nmero entre 1 e 1 . 000] . O
jogador insere uma primeira suposio. Se o palpite do jogador estiver incorreto, seu programa deve exibir Too h i gh. Try aga i n [Mui to a 1 to. Tente
novamente] ou Too 1 ow. Try aga i n [Mui to bai xo. Tente novamente] . Para ajudar o jogador a 'zerar' mediante uma resposta correta, o programa
deve solicitar ao usurio o prximo palpite. Quando o usurio insere a resposta correta, exiba Congratul ati ons . You guessed the number!
[Parabns , voc adi vi nhou o nmero ! ] e permita que o usurio escolha se quer jogar novamente. [Noru: A tcnica de adivinhao empregada nesse
problema semelhante a uma pesquisa binria, discutida no Captulo 16. ]
6. 34 Modifque o programa de Exerccio 6.33 para contar o nmero de suposies que o jogador faz. Se o nmero for l O ou menos, exiba E1 ther
you know the secret o r you got 1 ucky! [Voc sabe o segredo ou tem mui ta sorte! ] se o jogador adivinbar o nmero em 1 O tentativas, exiba
Aha! You know the secret! [Aha! Voc sabe o segredo! ] . Se o jogador fizer mais que 10 adivinhaes, exiba You should be abl e to do
better! [Voc capaz de fazer me 1 hor! ] . Por que esse jogo no deve precisar de mais que I O suposies? Bem, a cada 'boa suposio' o jogador
deve ser capaz de eliminar metade dos nmeros. Agora mostre por que qualquer nmero I a 1 .000 pode ser adivinhado em I O ou menos tentativas.
6. 35 Os exerccios 6.30 a 6.32 desenvolveram um programa de instruo auxiliada po. wmputador para ensinar multiplicao a um estudante do
ensino fundamental. Realize os seguintes aprimoramentos:
a) Modifque o programa para permitir que o usurio insira uma capacidade de nvel de graduao. Um nvel de notas de I significa que o
programa deve utilizar somente nmeros de um dgito nos problemas, um nvel de notas de 2 signifca que o programa deve utilizar
nmeros de dois dgitos, e assim por diante.
b) Modifque o programa para permitir que o usurio selecione os tipos de problemas aritmticos que ele deseja estudar. Uma opo de 1
signifca apenas problemas de adio, 2 signifca apenas problemas de subtrao, 3 signifca apenas problemas de multiplicao, 4 significa
apenas problemas de diviso, e 5 signifca uma combinao aleatria de problemas de todos esses tipos.
6. 3 6 Escreva um mtodo di s tance para calcular a distncia entre dois pontos (xl ,y I ) e (x2,y2). Todos os nmeros e valores de retorno devem ser
do tipo doub 1 e. Incorpore esse mtodo a um aplicativo que permite que o usurio insira as coordenadas de pontos.
6.3 7 Modifque o programa de jogo de dados da Figura 6.9 para permitir apostas. Inicialize a varivel bankBa 1 ance como $ 1 .000. Pea ao
jogador para inserir um wager (uma aposta). Verifque se o wager menor que ou igual a bankBa 1 ance e, se no o for, faa o usurio reinserir o wager
. at um wager vlido ser inserido. Depois que um wager correto foi inserido, execute um jogo de dados. Se o jogador ganhar, aumente bankBa 1 ance
por wager e exiba o novo bankBa 1 ance. Se o jogador perder, diminua bankBa 1 ance por wager, exiba o novo bankBa 1 ance, verifique se
bankBa 1 ance tornou-se zero e, se tiver ocorrido, exiba a mensagem "Sorry. You bus ted ! " [" Descu 1 pe, mas voc fa 1 i u ! "] . Enquanto o jogo se
desenvolve, exiba vrias mensagens para criar uma 'conversa', como "Oh , you ' re goi ng for broke, huh?" ["Oh , parece que voc vai quebrar,
hei n?"] ou "Aw c ' mon, take a chance ! " ["Ah, vamos l , d uma chance para sua sorte ! "] ou "You ' re up bi g . Now' s the time to cash
i n your chi ps ! " [Voc est' montado na grana. Agora hora de trocar essas fichas e embol sar o di nhei ro ! "] . lmplemente a
'conversa' como um mtodo separado que escolhe aleatoriamente a string a exibir.
6. 38 Escreva um aplicativo que exibe uma tabela de equivalentes binrios octal e hexadecimal dos nmeros decimais no intervalo I a 256. Se voc
no estiver familiarizado com esses sistemas numricos, leia o Apndice E primeiro.

Você também pode gostar