Katy sierra & bert bates   java use a cabeça
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Katy sierra & bert bates java use a cabeça

on

  • 4,195 views

Use a Cabeça Java

Use a Cabeça Java

Statistics

Views

Total Views
4,195
Views on SlideShare
4,195
Embed Views
0

Actions

Likes
2
Downloads
209
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Katy sierra & bert bates java use a cabeça Document Transcript

  • 1. Use a Cabeça! Aprenda como os -~ segmentos (threads)f podem mudar sua vida( banho no ..;.ct;.Çf )-i : ;ãj~"• I Faça os conceitos de Java se incorporarem ..,..---- à sua mente/". Evite erros embaraçosos --- - de-OO------ .-- /". Bote-a cabeça - a:ca--- p ~ funcionar com os 42 " quebra-cabeças em Java ~ .,I
  • 2. o que estão dizendo sobre Use a Cabeça! A Amazon escolheu Use a Cabeça! Java A Software Development Magazine indicou como Top Ten Editors Choice for Use a CabeçaFlava para finalista do 14h . _. Compll!er Books of 2©3(primeira edição) Annual Jolt ColaIProduct Excellence Awards "O livro Use a Cabeça! Java, de Kathy e Bert, transfonnará a página impressa na coisa mais próxima de uma QUI que você jamais viu. De uma maneira divertida e moderna, os autores tornam o aprendizado de Java uma experiência envolvente do tipo o que eles vão inventar agora?." - Warren Keuffel, Software Development Magazine r o " .. . a única maneira de saber valor de um tutorial é comprovar se ele é eficiente em ensinar. Use a Cabeça! Java sobressai-se ao ensinar. Certo, achei infantil, porém percebi que estava entendendo completamente os tópicos enquanto percorria o livro." " O estilo de Use a Cabeça! Java tornou o aprendizado, digamos, mais fácil." - slashdot (resenha de um alternativo sério) "Além do estilo atraente que o conduzirá de leigo ao status de defensor exaltado da Java, Use a Cabeça! Java aborda várias questões práticas que outros livros deixam de lado, como o temível exercício para o leitor... . É inteligente, ousado, moderno e prático - não existem muitos livros que conseguem alegar isso e sustentar a alegação enquanto ensinam a serialização deobjetos e protocolos de inicialização de rede." . .- Dr. Dan Russell, Diretor do Use r Sciences and Experience Research mM Almaden Research Center (e que ensina Inteligência Artificial na Universidade de Stanford) "É rápido, irreverente, divertido e interessante. Tome cuidado - você pode realmente aprender algo!" .. . ~ - Ken Arnold, ex-engenheiro sênior da Sun Microsyst~ms .....-." Co-autor de "A Linguagem de Programação Java" (com James Gosling, criador do Java) "A tecnologia Java está em todos os lugares - se você for desenvolvedor de softwares e não tiver aprendido Java, definitivamente I "I chegou a hora de mergulhar - de cabeça." - Scott McNealy, Presidente, conselheiro e CEO da Sun Microsystems "Use a Cabeça! lava é como o Monty Python encontrando a gangue dos quatro ... O texto é tão bem dividido por quebra-cabeças e histórias. testes e exemplos, que você abordará terreno como em nenhum outro livro de computação." - Douglas Rowe, Grupo de Usuários Java de Columbia 11111111m~ 11111 111m 11011l1li1111 gll LlV 33661 Reg.100289 Use a cabeça ! Java 005.133 JAVA S571u 2005 2.ed. "f --éx.2S--· ~ ,,~.";. ~ .h ~ .I ........__________________________________ ________ ~ t
  • 3. ....Elogios a Use a Cabeça! Java sÊscÊ- ----1 S!8L10TECA -I"Leia Use a Cabeça! Java e você passará a experimentar novamente a diversão ao aprender... Para pessoas que gostam de "Iaprender novas linguagens, e não têm experiência em ciência da computação e programação, este livro é uma jóia.. . É um livroque torna divertido o aprendizado de uma linguagem de computador complexa. Espero que haja mais autores querendo deixar o r-.. Ivelho molde dos estilos de escrita tradicionais. Apreuder linguagens de computação deve ser divertido e não difícil." --" - Judith Taylor, Southeast Ohio Macromedia User Group =1 ~ I1"Se você quer aprender Java, não procure mais: bem-vindo ao primeiro livro técnico baseado em GUls! Este formato inovador ebem-elaborado fornece benefícios que outros textos sobre Java simplesmente não conseguem .. . Prepare-se para uma jornada ·realmente notável pelo universo do Java." " I - Neil R. Bauman, Capitão & CEO, Geek Cruises (www.GeekCruises.com)"Se você for relativamente iniciante em programação e estiver interessado em Java, aqui está seu livro ... Abordando tudo, dosobjetos à criação de interfaces gráficas de usuário (GUI, graphical user inteiface), da manipulação de exceções (erros) às redes(soquetes) e segmentação múltipla, e até mesmo o empacotamento de sua pilha de classes em um arquivo de instalação, este livroé bem completo .. . Se você aprecia esse estilo, estou certo de que amará o livro e, como eu, desejará que a série Use a Cabeça! seestenda a muitos outros assuntos! " - LinuxQuestions.org"Fiquei viciado nos contos, códigos comentados, entrevistas engraçadas e exercícios mentais." - Michael Yuan, autor, Enterprise J2ME" Use a Cabeça! Java ... dá um novo sentido à frase de marketing Há sempre um OReilly para isso. Adquiri este livro porquevárias pessoas que respeito o descreveram com termos como revolucionário , dizendo que era uma abordagem totalmentediferente para um livro. O resultado é engraçado, irreverente, atual, interativo e brilhante ... Ler este livro é como sentar na sala deespera de uma conferência, aprendendo - e rindo - com colegas ... Se você quiser ENTENDER Java, compre-o." - Andrew Pollack, www.thenorth.com"Se há alguém no mundo familiarizado com o conceito de Use a Cabeça! , provavelmente sou eu. Este livro é tão bom, que mecasmia com ele na TV! " - Rick Rockwell, comediante ° noivo original do programa de televisão da Fox "Who wants to marry a millionaire""Esse negócio é tão estranhamente bom que me faz querer CHORAR! Estou perplexo." - Floyd Jones, autor sênior de textos técnicoslPoolboy, BEA"A lguns dias atrás recebi minha cópia de Use a Cabeça! Java de Kathy Sierra e Bert Bates. Li apenas parte do livro, mas o queme surpreendeu é que, mesmo não tendo conseguido dormir naquel a primeira noite, me vi pensando: Certo só mais uma página,ent.ão irei para a cama. " - Joe Litton
  • 4. a introdução Elogios a outros livros da série Use a Cabeça! de co-autoria de Kathy e Sert A Amazon escolheu Use a Cabeça! Servlets como A Software Development Magazine indicou Tap Ten Editors Choice for Computer Books of Use a Cabeça! Servlets e Use a Cabeça! 2004 (prim~ira edição) Design Patterns como finalistas do lShAnnual Product Excellence Awards" . "Sinto-me como se milhares de livros tivessem sido tirados de cima de minha cabeça." - Ward Cunningham, inventor do Wiki e fundador do Hillside Group "Ri, chorei, fiquei comovido." - Dan Steinberg, editor-chefe, java.net "Minha primeira reação foi rolar no chão de tanto rir. Depois de me refazer, percebi que este livro não é apenas altamente preciso, e sim que se trata da melhor obra de introdução já publicada sobre padrões de projeto." - Dr. Timothy A. Budd, professor associado de ciência da computação na Universidade do Estado do Oregon e autor de vários livros, inclusive C++ for Java programmers......... "O tom preciso para o codificador genial e casual guru que existe em todos nós. A obra de referência certa para estratégias práticas de desenvolvimento - este livro me fez acompanhar o assunto sem a necessidade de agüentar a ultrapassada e cansativa ladainha acadêmica." - Travis Kalanick, fundador do Scour and Red Swoosh e membro do MIT TRIOO "FINALMENTE - um livro sobre Java escrito da maneira que eu escolheria se eu fosse eu mesmo . Falando sério - este livro definitivamente deixa para trás qualquer outro livro sobre s01tware que já li ... Um bom livro é muito difícil de escrever; é preciso muito tempo para deixar as coisas se desdobrarem em uma seqüência natural, "orientada ao leitor". É muito trabalhoso. A maioria dos autores claramente não está à altura do desafio. Parabéns à equipe do Use a Cabeça! EJB por um trabalho de primeira classe! - Wally Flint "Não poderia imaginar uma pessoa sorrindo ao estudar um livro de TI! Usando os materiais do Use a Cabeça! ElB, acertei bastante (91 %) e consegui um recorde mundial como o mais jovem SCBSD, 14 anos." - Afsah Shafquat (SCBCD mais jovem do mundo) "O livro Use a Cabeça! Servlets é tão bom quanto o Use a Cabeça! ElB , que me fez rir E acertar 97% do exame!" - Jef Cumps, consultor de J2EE, Cronos - -- - - ----- -- - ,~~ -------- ..
  • 5. r Use a Cabeça! Java Do original Head First Java Copyrigh t © 2005 da Prii tora.AJt9. Boe-b-I=t-da. . - . - --- Authorized translation Irom English language editiol1, enfitled Head First Java, ISBN 0-596-00920-8, by Kathy Sierra and Berf Bates, published by O ReiUy Media, Inc., Copyright © 2003, 2005 by O Rei!!) Media, lnc. PORTUGUESE language edition published by Editora Alta Books, Copyright © 2005 by Editora Alta Books. Todos os direitos reservados e protegidos pela Lei 5988 de 14/12/73. Nenhuma parte deste livro, sem autorização prévia por escrito da editora, poderá ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrônico, mecânico, fotográfico, gravação ou quaisquer outros. Todo o esforço foi feito para fornecer a mais completa e adequada informação, contudo a editora e o(s) autor(es) não assumem responsabilidade pelos resultados e usos da informação fornecida. Recomendamos aos leitores testar a informação, bem como tomar todos os cuidados necessários (como o backup), antes da efetiva utilização. Este livro não contém CD-ROM, disquete ou qualquer outra mídia. Erratas e atualizações: Sempre nos esforçamos para entregar a você, leitor, um livro livre de erros técnicos ou de conteúdo; porém, nem sempre isso é conseguido, seja por motivo de alteração de software, interpretação ou mesmo quando alguns deslizes constam na versão original de alguns livros que traduzimos. Sendo assim, criamos em nosso site, www.altabooks.com.br. a seção Erratas, onde relataremos, com a devida correção, qualquer erro encontrado em nossos livros. Avisos e Renúncia de Direitos: Este livro é vendido como está, sem garantia de qualquer tipo, seja expressa ou implícita. ---, , ,--.. I Marcas Registradas: Todos os termos mencionados e reconhecidos como Marca Registrada e/ou comercial são de responsabilidade de seus proprietários. A Editora informa não estar associada a nenhum produto e/ou fornecedor apresentado no livro. No decorrer da r---. I. obra, imagens, nomes de produtos e fabricantes podem ter sido utilizados, e desde já a Editora informa que o uso é apenas ilustrativo e/ou educativo, não visando ao lucro, favorecimento ou desmerecimento do produto/fabricante. Produção Editorial Editora Alta Books Preparação e Coordenação: Fernanda Silveira Tradução: Aldir José Coelho Revisão: Gustav Schmid Revisão Técnica: Késsia Nina - Licenciatura em Computação pela Universidade de Brasília (UNB) Diagramação: Eduardo Rodrigues Rio I ,-. Impresso no Brasilo código de propriedade intelectual de r de Julho de 1992 proíbe expressamente o uso coletivo sem autorização dos detentoresdo direito autoral da obra, bem como a cópia ilegal do original. Esta prática generalizada nos estabelecimentos de ensino,provoca uma brutal baixa nas vendas dos livros a ponto de impossibilitar os autores de criarem novas obras. Av. Nil o Peçanha. 155, ejs. 110 1 a 11 06 - Castelo Rio de Janeiro - RJ . CEP : 20020- 100 Tel: 2 1 2532-6556/ Fax: 2215-0225 www.aII Llhooks.coOl.br e-mail : altabooks@altabooks.eom.br
  • 6. a introdução Use a Cabeça! Java™ Tradução daJava que fosse mais interessante do segunda ediçãoque esperar na fila do DETRAN pararenovar sua carteira de habilitação? Talvez seja apenas um sonho .. . Kathy Sierra Bert Bates
  • 7. a introdução . À nossa mente, por estar sempre presente (apesar de .qualquer prova em contrário) -~-~------------------------------------------------------------------
  • 8. - Criadores da série Use a C~bE3ça! BertKathy tem interesse no ensino de teoria desde quando era Bert é desenvolvedor e projetista de softwares, mas aprojetista de jogos (criou jogos para a Virgin, MGM e experiência de uma década em inteligência artificial direcionouAmblin). Ela desenvolveu grande parte do formato Use a seu interesse para o ensino de teoria e para treinamentosCabeça! enquanto ensinava Criação em Nova Mídia no baseados em tecnologia. Desde então tem ensinadoprograma de extensão em Estudos de Entretenimento da programação para clientes. Recentemente, foi membro daUCLA. Recentemente foi instrutora mestre na Sun equipe de desenvolvimento de vários exan1es de certificaçãoMicrosystems, preparando os professores da Sun para ensinar em Java da Sun.as tecnologias Java mais novas, e foi a principal criadora de Ele passou a primeira década de sua caITeira em softwaresvários exames de certificação da Sun para programadores e viajando pelo mundo para ajudar clientes de radiodifusão comodesenvolvedores Java. Junto com Bert Bates, tem usado a Radjo New Zealand, o Weather Channel e a Arts &ativamente os conceitos do Use a Cabeça! lava para instruir Entertainment Network (A & E). Um de seus projetoscentenas de professores, desenvolvedores e até não- favoritos foi construir a simulação completa de um sistema deprogramadores. Também foi a fundadora de um dos maiores ferrovias para a Union Pacific Railroad.sites Web de comunidade Java do mundo, o javaranch.com, edo blog Creating Passionate Users. Bert é um adepto inveterado do player GO e há muito tempo trabalha em um programa Go . Ele é um guitarrista razoávelAlém deste livro, Kathy foi co-autora de Use a Cabeça! que agora passou para o banjo e gosta de se divertir esquiando,Servlets, Use a Cabeça. ElE e Use a Cabeça! Design correndo e tentando adestrar (ou ser adestrado por) seu cavaloPatterns. islandês Andi.Em seu tempo livre ela aprecia seu novo cavalo islandês, gosta Bert foi co-autor dos mesmos livros que Kathy e estáde esquiar, correr e da velocidade da luz. trabalhando muito na próxima remessa (consulte o blog para ver as atualizações).kathy@wickedlysmart:.com Você pode encontiá-Io no servidor Go IGS (sob o login jackStraw). I .~- .~ terrapin@wickedlysmart.com ~h .L ~- iJEmbora Karh y e Ber! renre m respo nd er o má xim o possível de men sagens el e correio ele trt)nico , () vo lum e ue corres pomJ é nci a e sua agencia ele v iage ns lorn<Í isso ..Jifíci!. A melh or (mais ráp iJ a) maneira de obter ajuda técn ica com reiação ~() li vro e no ha .lunf{ ati vo fórum ue iniciantes Ja va em j avaranch. coll1. L .,;: "--" ----. ... "" 1°
  • 9. a introdução Sumário Introdução Il!l Seu cérebro e o Java. Aqui está você tentando aprender algo, enquanto o seu cérebro está lhe I fazendo o favor de garantir que o aprendizado não vingue. Seu cérebro está pensando "É melhor deixar espaço para coisas mais importantes, como que animais selvagens evitar e se praticar snowboard pelado é uma má idéia". Portanto, como você fará o seu cérebro pensar que sua vida depende do que você conhecer a respeito do Java? Para quem é este livro? xxii xviii No que seu cérebro está pensando xxi ii xv iii Metaconhecimento xxv xx Faça o seu cérebro se curvar xxvii xxi Requisitos para ler este livro xxviii xxii Editores técnicos xxx xxiv Agradecimentos xxxi xxv Aprofu ndando-se O Java o levará a novas fronteiras. No humilde lançamento para o público como a (suposta) 1 versão 1.02, o Java seduziu os programadores com sua sintaxe amigável , recursos orientados a objetos, gerenciamento de memória e, o melhor de tudo - a promessa de portabilidade. Examinaremos isso rapidamente e escreveremos, compilaremos e executaremos alguns códigos. Falaremos sobre a sintaxe, loops, ramificações e o que torna o Java tão interessante . Mergulhe. Como a Java funciona 2 Method Party { } Estrutura do código em Java 5 o aload_ O Anatomia de uma classe 6 1 invokespecial O método main( ) 6 U <Method java. 1Ir----=;....-- Loops 8 lang.Object{» Ramificação condicional (testes if) 9 4 return Codificando o aplicativo "99 garrafas de cerveja " 10 Bytecode compilado Parafraseando 12 Máquinas virtuais Bate-papo na fogueira: compilador vs. JVM 13 Exercícios e quebra-cabeças 15 Uma viagem até Objetópolis Ouvi dizer que haveria objetos. No Capítulo 1, colocamos todo o código no método main( ).".........r"- 2 Essa não é exatamente uma abordagem orientada a objetos. Portanto, agora temos que deixar esse universo procedimental para trás e começar a criar alguns objetos por nossa própria conta. Examinaremos o que torna o desenvolvimento orientado a objetos (00, object-oriented) em Java tão divertido. Discutiremos a diferença entre uma classe e um objeto. Examinaremos como os Cão objetos podem melhorar sua vida. tamanho raça uma classe Guerra nas Cadeiras (Brad O Adepto de 00 vs. Larry O Usuário de Procedimentos) 20 nome Herança (uma introdução) 22 Sobrepondo métodos (uma introdução) 23 O que existe em uma classe (métodos, va ri áveis de instância)? 24 Criando seu primeiro objeto 26 - -- _... ----- 27 Usando main( ) muitos Código do Jogo de Adivinhação 28 objetos . Exe rcícios e quebra-cabeças 31 ix
  • 10. ,. . .- ,. Conheça suas variªy~~i~L . Existem duas versões de variáveis: primitivas e de referência. Deve haver mais coisas na vida além de inteiros, strings e matrizes. E se você tiver um objeto DonodeAnimal com uma variável de instância Cão? Ou um Carro com um Motor? Neste capítu lo desvelaremos os mistérios dos tipos usados no Java e examinaremos o que você pode declarar como uma variáve l, o que pode inserir em uma variável e o que pode fazer com ela. E para concluir discutiremos o que acontece realmente na pilha de lixo coletável. Declarando uma variável (no Java há a preocupação com o tipo) 36 Tipos primitivos ("Quero um duplo com espuma, por favor") 36 Palavras-chave no Java 38 Variáveis de referê ncia (controle remoto de um objeto) 39 Declaração atribuição de objeto 41 Objetos na pilha de li xo coletável 42 referência Matrizes (uma introdução) 43 de objeto Exercícios e quebra-cabeças 47 Como os objetos se comportam O estado afeta o comportamento, o comportamento afeta o estado. Sabemos que os r- objetos têm estado e comportamento, representados pelas variáveis de instância e métodos. I Agora examinaremos como o estado e o comportamento estão relacionados. O comportamento de I ~J um objeto usa um estado exclusivo dele. Em outras palavras , os métodos usam os valores das variáveis de instância. Por exemplo "Se o cão pesar menos de 27 qui los, grite de alegria, caso Passar por va1.or significa contrário .. .". Alteremos alguns estados! =1 Os métodos usam o estado do objeto (latir diferente) 52 Os argumentos e tipos de retorno do método 53 Passar por valor (a va riável é sempre copiada) 55 Métodos de captura e config uração 56 Encapsulamento (use-o ou arrisque-se a ser humilhado) 57 int Usando referências em uma matriz int 60foo.go(x) ; void go(intz) { } Exercícios e quebra-cabeças 63 Métodos extra fortes x J, Aumentemos a força de nossos métodos. Você apredeu sobre as variáveis, brincou com 5 algun s objetos e escreveu um pequeno código. Mas precisa de mais ferramentas . Como os operadores. E os loops. Pode ser útil gerar números aleatórios. E converter uma string em um inteiro, sim, isso seria avançado. E por que não aprender tudo através da criação de algo real , J- ~ , para vermos como é escrever (e testar) um programa a partir do zero. Talvez um jogo, como o Sink a Dot Com (semelhante à Batalha Naval).Construi remos o jogo sink a Dot Com Construindo o jogo Sink a Dot Com 70 A Come ça ndo com o jogo Sin k a Dot Com simp·les (uma versão mais simples) 71 B Escrevendo o código preparatório (pseudocódigo do jogo) E 74 c tJ Código de teste do Dot Com simples 76 N Codifica ndo o jogo Dot Com simples 77 Cl D P ts.Cpm Código fin al do Dot Com simples 79 E Gerando números aleatórios com Math.random( ) 83 Código predefinido para obtenção de entradas do usuário a parti r da linha de comando 84 F Iterando com loops for 85 G As~ Me. om Convertendo tipos primitivos extensos para um tam anho menor 88 Exercícios e quebra-cabeças 88
  • 11. f:], ;- --.- - ........, a introdução Usando a biblioteca Java o Java vem com centenas de classes predefinidas. Você não terá que reinventar a roda 6 se souber como encontrar o que precisa na biblioteca Java, normalmente conhecida como APl Java. Há coisas melhores a fazer. Se você pretende escrever códigos, pode escrever somente as partes que forem exclusivas de seu aplicativo. A principal biblioteca Java consiste em uma piiha gigante de classes apenas esperando para serem usadas como blocos de construção. "Bom saber que há uma ArrayList no pacote java.util. Analisando o erro do jogo DotCom simples 94 Mas como poderia descobrir ArrayList (beneficiando-se da APl Java) 97 isso sozinha?" Corrigindo o código da classe DotCom 102 Construindo o jogo real (Sink a Dot Com) 103 Código preparatório do jogo real 107 manual 108 Código do jogo real Expressões booleanas 112 Usando a biblioteca (APl Java) 114 Usando pacotes (instruções importantes, nomes totalmente qualificados) 114 Usando os documentos e livros de referência do APl HTML 117 Exercícios e quebra-cabeças 120 Melhor viver em Objetópolis Planeje seus programas com o futuro em mente. E se você pudesse escrever códigos que 7 outra pessoa conseguisse estender, facilmente? E se pudesse escrever códigos que fossem flexíveis, para aquelas irritantes alterações de último minuto nas especificações? Quando chegar ao Plano de Polimorfismo, você aprenderá as 5 etapas para a obtenção de um projeto de classes mais adequado, os 3 truques do polimorfismo, as 8 maneiras de criar um código flexível e, se agir agora - uma lição bônus sobre as 4 dicas para a exploração da herança . Entendendo a herança (relacionamentos da superclasse e subclasse) 125 Projetando uma árvore de herança (a simulação da classe Animal) 127 Evitando a duplicação de código (usando a herança) 127 / Sobrepondo métodos 128 É-UM e TEM-UM (garota na banheira) 130 O que você herdará de sua superclasse? 133 O que a herança lhe fornecerá realmente? 134 Polimorfismo (usando a referência de um supertipo a um objeto da subclasse) 135 Regras da sobreposição (não mexa nesses argumentos e tipos de retorno!) 138 Sobrecarga do método (nada mais do que a reutilização do nome do método) 139 Exercícios e quebra-cabeças 140 Polimorfismo real A herança é apenas o começo. Para explorar 9 polimorfismo, precisamos de interfaces. 8 Temos que ir além da simples herança e alcançar a flexibilidade que você só conseguirá projetando e codificando em interfaces. O que é uma interface? Uma classe 100% abstrata . O que é uma classe abstrata? Uma classe que não pode ser instanciada, Em que isso é útil? Leia o cap ítulo ... Conterta a class"e Object o = al . get(index ) ; Object em uma Algumas classes simplesmente não devem ser instanciadas 147 Dog d = (Dog) o; ~ cl~sse Cào que d . ro am ( ) ; vaca sabe ql.! & Classes abstratas (não podem ser instanciadas) 148 Métodos abstratos (devem ser implementados) 149 O polimorfismo em ação 151 Classe Object (a superclasse final de tudo) 152 Extraindo objetos de uma ArrayList (eles são capturados com o tipo Object) 153 O compilador ve rifica o tipo ae refe-rencía (antes de permitir que v ocê "ch-a um cnétodo) 155 -me Entrando em cantata com seu objeto interno 156 Referências polimórficas 157 xi
  • 12. Co n,::~e ndo U rn! _referência de obj eto (passando mais para ~a i xo n§l árvore de heran ça) 158 Losango Fatal (probl ema de herança múltipla ) 162 Usando interfaces (a melhor solução!) 162 Exercícios e quebra-cabeças 167 Vida e morte de um objeto 9 Objetos nascem e objetos morrem. Você é quem manda. Você decide quando e como construÍ-Ias. Decide quando abandoná-los . O Coletor de Lixo (ge, garbage collector} solicita memória . Examinaremos como os objetos são criados, onde residem e como manter ou abandoná- los eficientemente. Isso significa que falaremos sobre o heap, a pilha, o escopo, construtores, superconstrutores, referências. nulas e qualificação para o gc. ~~anão êlguem cbamar o mé~oão go{), esse obja t o D-,;.cJr be:ns. ab<.~.TldOnddo. SUIt única: .referencia roí A pilha e o heap onde os objetos e as variáveis residem 172 reprogramada pi!J.rõ. um obj e ta Duc:k Métodos da pilha 172 Onde as variáveis locais residem 173 Onde as variáveis de instância residem 174 O milagre da criação de objetos 175, Construtores (o código que será executado quando você usar new) 175 Inicializando o estado de um novo objeto Duck (Pato) 177 Construtores sobrecarregados 179 Construtores de superclasse (cadeia de construtores) 182 d reaebe.! U1t: novo objeta Duck" Chamando construtores sobrecarregados usando this( ) 184 deixando o objeto DllCR c~~~~~ ~l :0 primeiro) abanàonaào~ Agora esse A vida de um objeto 187 primeí~·o objetc pode ser Coleta de Lixo (e como tornar os objetos qualificados) 189 "I consideraoo e .1.in:i nado . Exercícios e quebra-cabeças 194 ~I Os números são importantes -S~ ----.. Faça o cálculo. O APl Java tem métodos para valor absoluto, arredondamento, min/max, etc. 10 - 1. i Mas e quanto à formatação? Você pode querer que os números sejam exibidos apenas com duas "I __ o casas decimais ou com pontos em todos os locais corretos. E pode querer exibir e manipular datas, também. E quanto à conversão de uma string em um número? Ou a conversão dEi um número em uma string? Começaremos aprendendo o que significa para uma variável ou método ser estático. Variáveis estáticas são compartilhadas por todas as instâncias de uma classe. Classe Math (você precisa realmente de uma instância dela?) 198primei ra instância segunda in9"àncía de J:id Métodos estáticos 199de kiã (cr íença ) Variáveis estáticas 202 Constantes (variáveis estáticas finais) 204 Métodos de Math (random( ), round( ), abs( ), etc.) 207 Classes encapsuladoras (Integer, Boolean, Character, etc.) 207 Auto-inserção 209 Formatação de números 212 Formatação e manipulação de datas 217 Importações estáticas 220 Exercícios e quebra-cabeças 222 variáveis de instâncía: uma por instán=ia Va.ríEl1reis -est á.cicas: u,ma por classe . . ~xii iL -"
  • 13. a introdução Comportamento arriscado Problemas acontecem. o arquivo não está no local. O servidor está travado., 1 Independentemente de quanto você é bom em programação, não é possível controlar tudo. Quando criar um método perigoso, precisará de um código para manipular o que acontecer de~ errado. Mas como saber quando um método é perigoso? Onde inserir o código que manipulará a situação excepcionaf? Neste capítulo, construiremos um MIDI Music Player, que usará o perigosot APl JavaSound, portanto, é melhor descobrirmos. Criando um aparelho de som (como o BeatBox) 226 E se você tiver que chamar o código perigoso? 228 lança uma exceção Exceções dizem "algo inadequado pode ter ocorrido ..." 228 , . ?(---{01--- - - O compilador garantirá (ele verificará) que você fique ciente dos riscos 229 ~".::, _u , Capturando exceções usando uma instrução try/catch (skatista) 230 ~.~ao . -7) ........~~, !: F-iJO".I!" - - - I--- CD Controle do fluxo em blocos try/catch 233 ~."~~. chama um "" """" classe com O bloco final/y (não importa o que aconteça, desligue o forno!) 233 seu código método perigoso um método Capturando várias exceções (a ordem é importante) 235 per igoso Declarando uma exceção (apenas desvie) 239 Manipule ou declare como lei 240 Receita de código (emitindo sons) 241 Exercícios e quebra-cabeças 247 Uma história muito gráfica Encare a realidade, você precisa criar GUls. Mesmo se acredita que durante o resto de sua vida escreverá somente código no lado do servidor, cedo ou tarde terá que criar ferramentas e vai querer uma interface gráfica. Dedicaremos dois capítulos às GUls e aprenderemos mais sobre determinados recursos de linguagem, inclusive a Manipulação de Eventos e as Classes Internas. Inseriremos um botão na tela, pintaremos a tela, exibiremos uma figura jpeg e trabalharemos ate mesmo com um pouco de animação. c la ss MyOu ter Class { private int x; Sua primeira GUI 252 claS5 r-1yl nnerCl ass ( Capturando um evento de usuário 254 void go () { Implemente uma interface ouvinte 254 .éJ x= 42 ; } l/fecha a classe 1n terna Capturando o evento ActionEvent de um botão 256 } l/fecha a classe externa Inserindo figuras em uma GUI 258 Dive rsão com paintComponent( ) 259 Agora os ob j eto s ext e r n o O objeto Graphics2D 260 e interno estão intimamente ligaàos . inner Inserindo mais de um botão em uma tela 263 Classes internas ao resgate (torne seu ouvinte uma classe interna) 266 Animação (mova-a , pinte-a, mova-a , pinte-a , mova-a, pinte-a ... ) 270 Esses dois objetos do heap cêm uma ligação espe ci al . O objeco interno ~ode u sar as Receita de código (pintando figuras ao ritmo de música) 273 variavei s d o objet:. o e x ter no ( e vice - versa j. Exercícios e quebra-cabeças 278 Trabalhe em seu Swing O Swing é fácil. A menos que você se importe realmente com o local de cada elemento. O código Swing parece fácil, mas depois de compilar, executar e examiná-lo nos damos conta disto: "ei, isso não deveria estar aí. " O que torna fácil a codificação é o que torna difícil o controle - o Gerenciador de Layout. Más com um pouco de esforço, você pode fazer os gerenciadores de layout se curvarem a sua vontade. Neste capítulo, trabalharemos em nosso Swing e aprenderemos mais sobre os elementos gráficos. 282 Gerenciadores de Layout (eles controlam o tamanho e o local) 282 Três Gerenciadores de Layout (borda, fluxo, caixa) 284 xiii
  • 14. ,r- - " /" r" í ~F ! ~II Os e2ementos L ..~L __ ~__ ~~~~~~J _B~r_d_e~L!!,out(co ntrola cinco regiões) S?,Ç ___ _ .__ . n_ _ _ _ _ _ ~ ~ ___ ~ 284 ~I "~~ . das parCE-S superior e { _. __.. f _ _ _ _ _ Borte ."~ _ _ _:· ,"- - FlowLayout (controla a ordem e o tamanho preferido) - ~-~- - . ( - - - - 286 :infericr BoxLayout (como no fluxo , mas pode empilhar componentes verticalmente) 288 ficar.am com a altura selecionada. Oeste CE!ltJ:o . Leste JTextField (para entrada de usuário de uma linha) JTextArea (para texto de rolagem de várias linhas) 290 290 " "I ./ JCheckBox (foi feita a seleção?) 291 Os compone.!ites ( da esquerda e t O fsn::rc :ficárli .! JList (uma lista de seleção rolável) 292 - I da direita ficaram c om a cam <) q".!; IHlib1:6:Z Receita de código (O código completo - construindo o cliente de bate-papo BeatBox) 293 "" ~I ------- l ----" Exe rcícios e quebra-cabeças 297 /-. I 2argura ,~====~==~~~==~==~ s~ · > selecionada. - I I Salvando objetos Os objetos podem ser achatados e reconstituídos. Os objefos possuem estado e comportamento. O comportamento reside na classe , mas o estado reside dentro de cada objeto. Se o seu programa tiver que salvar o estado, você poderá fazê-lo da maneira mais difícil, examinando cada objeto e gravando meticulosamente o valor de cada variável de instância. Ou , da maneira mais fácil, orientada a objetos - simplesmente congele o objeto (serialize-o) e reconstitua-a (desserialize), para que volte ao que era. serializado 1 Salvando o estado do objeto Gravando um objeto serializado em um arquivo Fluxos Java de entra da e saída (conexões e encadeamentos) 302 303 304 Serialização de objeto 305 Implementando a interface Serializable 306 Alguma Usando variáveis transientes 308 pergunta? desserializ a ão Desserializando um objeto 309 Gravando em um arquivo de texto 312 java.io.File 316 Lendo em um arquivo de texto 317 Dividindo uma string em fichas com split( ) 320 Receita de código 324 Exercicios e quebra-cabeças 326 Crie uma conexão Conecte-se com o ambiente externo. É fácil. Todos os detalhes de nível inferior de rede são definidos pelas classes na biblioteca java.net. Um dos melhores recursos do Java é que enviar e receber dados através de uma rede é realmente apenas uma atividade de EIS com um fluxo de conexão um pouco diferente na extremidade da cadeia. Neste capítulo criaremos soquetes de cliente. Criaremos soquetes de servidor. Criaremos clientes e servidores. Antes do fim do capítulo, você terá um cliente de bate-papo totalmente funcional com vários segmentos. Dissemos com vários segmentos? Conexâo de soquete ccm a porta 5000 pare Visão geral do programa de bate-papo 330 .!t, , o S0r:1;~:Ldcr de Ewde.reço lP;;. J60if .1 .1 03 . Conectando, enviando e recebendo 331 Soquetes de rede 332 Portas TCP 332 Lendo dados em um soquete (usando BufferedReader) 334 GravéJndo dados em um saquete (üsando PrintWriter) 335 Escrevendo o programa Daily Advice Client 336 Criando um servidor simples 337 Código do Dail y Advice Server 337 Criando um cliente de bate-papo 339 ----- i Várias pilhas de chamada 343 ~ Iniciando um novo segmento (crie-o, inicie-o) ,-.., 343 xiv ; ...:-c",:;.,. - -./11-
  • 15. a in trodução A interface Runnable (a tarefa do segmento) 344 Três estados de um novo objeto Thread (novo, executável , em execução) 345 O loop executável em execução 346 Agendador de segmentos (é ele quem decide e não você) 346 Colocando um segmento em suspensão 349 Criando e iniciando dois segmentos 350 Problemas de concorrência : esse casal pode ser salvo? 351, O problema de concorrência de Ryan e Mônica, em código 352, "" Bloqueando para gerar atomicidade 355 Todo objeto tem um bloqueio 356 O temível problema da "Atualização Perdida" 356 Métodos sincronizados (usando um bloqueio) 358 Impasse! 359 Código de ChatClient com vários segmentos 361 Código predefinido para SimpleChatServer 362 Exercícios e quebra-cabeças 365 Estruturas de dados A classificação é instantânea em Java. Você tem todas as ferramentas para coletar e manipular dados sem ter que escrever seus próprios algoritmos de classificação. O Java Collections Framework tem uma estrutura de dados que deve funcionar para praticamente qualquer coisa que você precisar fazer. Quer manter uma lista que você possa aumentar facilmente? Encontrar algo pelo nome? Criar uma lista que exclua automaticamente todos os dados repetidos? Classificar seus colaboradores por quantas vezes lhe traíram? Conjuntos 370 Classificando como ArrayList com Collections .sort( ) 372 U st Dados genéricos e garantia de tipo 376 Classificando itens que im plementam a interface Comparable 381 Classificando itens com um comparador personalizado 384 O APl de conjuntos - listas, conjuntos e mapas 388 Evitando dados repetidos com HashSet 388 Sobrepondo hashCode( ) e equals( ) 390 HashMap 394 Usando curingas para gerar polimorfismo 399 Map Exercícios e quebra-cabeças 400 Lance seu código É hora de pôr em prática. Você escreveu seu código. Testou o código. Aprimorou-o. Você 17 contou para todo mundo que conhece que, se nunca se deparar com uma linha de código novamente, não haverá problema. Mas, no fim das contas, terá criado uma obra de arte. O negócio funciona mesmo! Porém, fazer o que agora? Nesses dois últimos capítulos, estudaremos como organizar, empacotar e implantar seu código Java. Examinaremos opções de implantação local, semilocal e remota , incluindo arquivos jar executáveis, o Java Web Start, RMI e Servlets. Calma. Alguns dos recursos mais interessantes em Java são mais fáceis de usar do que você imagina. Opções de implantação 404 Mantenha os arquivos de seu código-fonte e de suas classes separados 405 Criando um arquivo JAR (Java ARchives) executável 406 Processando um arqu ivo JAR executável 407 Insira suas classes em um pacote! 407 MyApp.jar Os pacotes devem ter uma esfrUf[jfã a diretório ctuequ ada -é A M "TVU Compilando e executando co m pacotes 409 MyApp.class xv mi
  • 16. Compilando com -d 410 ;;;;o 411 O My Ap~.jál o Java Web Start (JWS) para a implantação na Web 415 Como criar e implantar um aplicativo JWS 417 Exercícios e quebra-cabeças 417 Computação distribuída Trabalhar remotamente não precisa ser ruim. Certo, as coisas são mais fáceis quando 1 todas as partes do aplicativo estão em um local, em um heap, com um JVM para regular tudo. Mas nem sempre isso é possível. Ou desejável. E se seu aplicativo manipular cálculos poderosos? E se ele precisar de dados de um banco de dados seguro? Neste capítulo, aprenderemos a usar o surpreendentemente simples Rêmote Method Invocation (RMI) do Java. Também examinaremos rapidamente os Servlets, os Enterprise Java Beans (EJB) e o Jini. Cliente ~ " servidor I ro U ~l; ~ O Remote Method Invocation (RMI) do Java, na prática, bem detalhado 422 ~. . Servlets (uma visão rápida) 433 r~~ Enterprise Java Beans (EJB) , uma visão muito rápida (/ ","~~ . :!I U . ~ . j ~ Jlnl , o melhor entre todos os truques . . Construindo o navegador universal de serviços realmente avançado 438 439 441 ~ OFim 450 "" 0.-/ Apêndice A " -./ O projeto final da receita de código. O código completo do beat box de bate-papo cliente- " servidor. Sua chance de ser uma estrela do rock . "" " BeatBoxFinal (código cliente) 452 MusicServer (código servidor) 456 ~ ,... --..<. " " r-- Apêndice B Os dez principais itens que não apareceram no livro. Ainda não podemos soltá-lo no mundo. Temos mais algumas coisas para você, mas é aqui que acaba o livro. E dessa vez é ,- verdade . Lista dos dez mais 460xvi
  • 17. como usar Introdução ", t~ . )l, ~ Â Nesta seçã.o$ respondemos ti pergunta intrigante: ~ HMas por que eles colocilram isto em um livro de p.rog.:t?L~ação em Java?" ~ ~ ~ ~ J À ,A .Acc_, ~ xvii ,~___ AID. ._ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ __ __ __ _ _ ____ · .
  • 18. como usar e.s:e :1 ::; A quem se destina este livro? -_._--- - - -- ---- Se você puder responder "sim" a todas estas perguntas: Este não é ;üm~obr~ d~ Q) Você já programou? referência. Use a Cabeça! Java é um livro projetado ® Quer aprender Java? para aprendizado. não é . uma enciclopédia de fatos ~ Prefere conversas estimulantes na hora do jantar a palestras secas, chatas e técnicas? sobre a Java. /..-...., Então este livro é destinado a você. Quem provavelmente deve ficar longe deste livro? Se você puder responder "sim" a qualquer das perguntas a seguir: Sua experiência em programação se limita somente à HTML, sem nenhum contato com linguagens de script? r-.. . (Se você já fez algo com loops ou lógica if/then, conseguirá se virar com este livro, mas somente tags HTML podem não ser o suficiente.) ® Você é um bom programador de C++ procurando um livro de referência? ~ você tem medo de tentar algo diferente? Prefere fazer um tratamento de canal a misturar listras e xadrez? Acredita que um livro técnico não pode ser sério se houver a figura de um pato na seção de gerenciamento da memória? Então este livro não é para você. r I .......1 [Nota do pessoal de marketing: quem retirou a parte sobre como este livro serve para qua.lqu ..r pessoa com um·cartão de c r édito válido? E quanto à promoção d e fér ias "Dê uma Java de presente" que di scutimos .•. - Fred.) ~ISabemos em que você está pensando."Como isto pode ser um livro sério de programação Java·"Para que todas as figuras?" Seu cérebro acba que I.SSO é"Conseguirei aprender realmente dessa forma)" importante &"Estou sentindo cheiro de pizza?"E sabemos no qu e sua mente está pensando. -ISeu cérebro procura novidade. Está sempre procurando, pesquisando, esperando por algo incomum. Ele ~Ifoi gerado assim e o aj uda a permanecer vivo. ;jAtualmente, há menos probabilidades de você se tornar o almoço de um tigre. Mas seu cérebro ainda está -, ~Iprocurando. Só que você não sabe.Mas o que seu cérebro faz com toda as coisas rotineiras , comuns e cotidianas que você encontra? Opossívef para evitar que interfiram em sua verdadeira tarefa - gravar as coisas que interessam. Não .;2.interessa gravar as coisas irrelevantes; elas nunca passam pelo filtro "é claro que isso não é importante".Como seu cérebro sabe o que é importante? Suponhamos que você saia para a sua caminhada diária e umtigre salte em sua frente; o que aconteceria dentro de sua cabeça?Acionamento dos neurônios. Ativação das emoções. Explosilo química. ..~E é assim que seu cérebro fica sabendo ...Isso deve ser importante! Não esqueça!Mas imagine se você estivesse em casa, ou em uma biblioteca. É um local seguro, aconchegante, sem tigres.Você está estudando. Preparando-se para um exame. Ou tentando aprender algum assunto técnico difícil, algoq ue o seu chefe acha qu e vai levar uma semana, dez dias no máximo.Só há um probl ema. Se u cérebro está tentando lhe fazer um grande favor. Está tentando se certificar ele queesse conteúdo obviamenre irrelevante não use recursos escassos. Recursos que seri am melhor utilizados noXVIII introducâG
  • 19. a introduçaõ · I ~ armazenamento das coisas realmente importantes . s~~ cérebro acha crue não val e a Como os tigres. Como o perigo de incêndio. Como ;ena guardar ISSC~ você nunca tentar praticar novamente snowboard de short. . E não há LIma maneira simples de dizer a seu cérebro: "Ei, cérebro, muito obrigado, mas , independentemente de o quanto esse livro seja chato, e de como eu estou registrando esse fato em um nível baixo na escala Richter emocional nesse momento, quero realmente que você guarde isso." Pensamos no leitor de "Use a Cabeça! Java" como um aprendiz. Mas o que é necessário para aprender algo? Primeiro, você tem que captar, depois se É preciso chamar .um método no servidor certificar de que não vai deixar isso escapar. Não é apenas empurrar os fatos para dentro de sua cabeça. Com base nas pesquisas mais recentes da ciência cognitiva, da neurobiologia e da psicologia educacional, é preciso muito mais para se aprender do que apenas texto em uma página. Sabemos o que interessa ao seu cérebro. Alguns dos princípios de aprendizagem da série Use a Cabeça!: retorno Destaque o aspecto visual. As figuras são muito mais fáceis de memorizar do que palavras isoladas e tornam o aprendizado mais eficaz (até 89% de melhoria em estudos de lembrança e transferência de Serviço RMI conhecimento). Também tornam as coisas mais inteligíveis. Coloque as remoto palavras dentro ou perto da figura às quais estão relacionadas, em vez de embaixo ou em outra página, e os aprendizes ficarão duas vezes mais aptos do que o normal a resolver problemas referentes ao conteúdo. Use um estilo coloquial e personalizado. Em estudos recentes, alunos se saíram até 40% melhor em testes pós-aprendizado quando o conteúdo se comunicava diretamente com o leitor, usando um estilo coloquial em primeira pessoa em vez de adotar um tom formal. Contar histórias em vez de proferir palestras. Usar linguagem casual. Não se leve tão a sério. Em quem você prestaria mais atenção: em uma companhia estimulante no jantar ou em uma palestra? Faça o aprendiz pensar com mais afinco. Em outras palavras, a menos que você flexione seus neurônios o ativamente, não acontecerá muita coisa em sua cabeça. Um leitor tem que estar motivado , engajado, curioso e inspirado a resolver problemas, tirar conclusões e gerar novos conhecimentos. E, para que isso ocorra, você precisa de desafios, exercícios e perguntas que instiguem o pensamento, além de atividades que envolvam os dois lados do cérebro e vários sentidos. Faz sentido dizer que a banheira É-UM banheiro? Que o banheiro É-UMA banheira? Ou. trata-se de um relacionamento TEM-UM? Prenda - e mantenha presa - a atenção do leitor. Todos nós já tivemos uma experiência do tipo "quero realmente aprender isso, mas não consigo ficar Sem corpo no método! acordado após a página um". Seu cérebro presta atenção em coisas que são fora do Termine-o com um ponto-a-vírgula comum, interessantes, estranhas, atraentes, inesperadas. Aprender sobre um assunto técnico novo e difícil não precisa ser chato. O cérebro aprenderá muito mais rapidamente se não o for.}L Toque as emoções deles. Agora sabemos que sua habilidade de se lembrar de algo depende muito do conteúdo~ ._emoc~ona1. Você se lembr~rá do que lhe preocupar. Le~1brará quando sentir al~o. Não est.amo~ falando de histórias,. dramatIcas so15re um memnO e seu (;acllürro:-E~li:1IIlV" H1Lnd"()-cle-gJ"lP~CLm{)s·1-düde, dlversao, de pensamentos do.J--- tipo "mas o que é isso?" e do sentimento "so u mais eu!" que surge quando você resolve um enigma, aprende algo que as~ outras pessoas acham difícil ou percebe que sabe algo que Bob "sou mais técnico que você" da engen haria nc70 sabe . .~._______.J.. .. você está aqui ... xix
  • 20. .... I r-.. como usar este ;ív, () Metacognição: entendendo o p~~.?at"D.~nto. _ _ _ __ Se você quiser realmente aprender, e quiser fazê-lo mais rápida e efic ientemente, preste atenção em ,--- , como sua atenção é atraída. Pense em como você pensa. Entenda como aprende. Quase ninguém fe z cursos de metacognição ou teoria do aprendizado quando estava crescendo. Esperavam que aprendêssemos, mas raramente nos ens in avam a aprender. Mas presumimos que, por você estar segurando este livro, deseja aprender Java. E é provável que não queira demorar muito. Para aproveitar este livro ao máximo, ou qualquer livro ou experiência de aprendizagem, tome as rédeas de seu cérebro. Dedique-se a esse conteúdo. ! ~ I O truque é fazer seu cérebro ver o novo material que você está aprendendo como I Realmente Importante. Crucial para seu bem-estar. Tão importante quanto um tigre. Caso --j contrário, você estará em batalha constante, com seu cérebro fazendo o melhor para não deixar o novo conteúdo escapar. Mas exatamente como fazer seu cérebro tratar a Java como se fosse um tigre fanllnto ? Há a maneira tediosa e lenta ou a mais rápida e eficaz. A maneira lenta é através da repetição contínua. É claro que você sabe que pode aprender e se lembrar até do mais chato dos tópicos, se continuar in sistindo nisso . Com um nível suficiente de repetição, seu cérebro pensará: "Isto não parece importante, mas, como ele continua se dedicando à mesma coisa repetidamenre, portanto, suponho que deva ser." A maneira mais rápida é fazer qualquer coisa que aumente a atividade cerebral, principalmente tipos diferentes de atividade cerebral. Os itens da página anterior são grande parte da solução e todoscomprovadamente ajudarão seu cérebro a t.rabalhar a seu favor. Por exemplo, estudos mostram que inserir palavras dentro das figuras que elas descrevem Ce não em algum outro local da página, como em uma legenda. ou no corpo do texto) fará com que seu cérebro tente descobrir como as palavras e a figura estão relacionadas. e isso ocasionará o acionamento de mais neurónios. Maior acionamento de neurónios = mais chances de seu cérebro perceber que isso é algo em que vale a pena prestar atenção e possivelmente memorizar. O estilo coloquial ajuda, porque as pessoas tendem a prestar mais atenção quando percebem que estão em uma conversa, já que se espera que elas acompanhem o assunto e exponham sua opinião. O interessante é que seu cérebro não está necessariamente preocupado com o fato de a "conversa" ser entre você e um livro! Por outro lado , se o estilo da redação for formal e seco, ele a perceberá como se você estivesse assistindo a uma palestra enquanto senta em uma sala cheia de espectadores passivos. Não é preciso ficar acordado. Mas figuras e um estilo coloquial são apenas o começo. Entenda o que fizemos: Usamos figuras , porque seu cérebro capta estímulos visuais e não texto. No que diz ~ U respeito ao cérebro, uma figura realmente vale por 1.024 palavras. E quando usamos texto Dog e figuras em conjunto, embutimos o texto nas figuras , porque o cérebro funciona mais . eficientemente quando o texto está dentro daquilo a que ele se refere e não em uma legenda ou oculto em algum local da redação . Seja o compilador Usamos a repetição, dizendo a mesma coisa de diferentes maneiras e por meios distintos , e vários sentidos, para aumentar a chance de que o conteúdo seja codificado em mai s de uma área de seu cérebro. ........ . Usamos conceitos e figuras de maneiras inesperadas, porque seu cérebro capta novidades, e .~ empregamos figuras e idéias com pelo menos algum conteúdo emocional, porque o cérebro foi programado para prestar atenção à bioquímica das emoções. Qualquer coisa que fizer você sentir algo terá mais probabilidade de ser lembrada, mesmo se esse sentimento não passar de um a pequena animação, surpresa ou interesse. Usamos um estilo coloquial personalizado, porque seu cérebro foi programado para prestar ~ ~~ mai s atenção quando anedita que está ocorrendo uma conversa do que qUqndo acha que você está passivamente assistindo a uma apresentação. Ele fará isso até mesmo quando você . Estamos em esti ver lendo. . .. ENIGMÓPOLlS xx in troduç;;)o
  • 21. ~, -tI ?;-=- a introdução Incluímos mais de SO exercícios, porque seu cérebro foi programado para aprender e lembrar melhor quando vocêfaz coisas e não quando lê. E criamos exercícios desafiadores porém viáveis, porque é isso que a maioria das pessoas prefere. DISCRIMINAÇÃO h Usamos vários estilos de aprendizagem , porque você pode preferi r procedimentos passo a DOS PONTOS passo, enquanto outra pessqa pode querer ter uma visão geral primeiro e outra deseje apenas h ver um exemplo de código. Mas independentemente de sua preferência de aprendizado, todos J, se beneficiarão em ver o mesmo conteúdo representado de várias maneiras. Tudo sobre o Java I~ Incluímos conteúdo para os dois lados de seu cérebro , porque, quanto mais ele estiver comprometido, maior probabilidade você terá de aprender e lembrar e mais tempo I~ conseguirá se concentrar. Já que trabalhar um lado do cérebro geralmente significa dar ao outro lado a chance de descansar, você pode ser mais produtivo no aprendizado durante um - ~~ J" período maior. E incluímos histórias e exercícios que apresentam mais de um ponto de vista, porque seu cérebro foi programado para aprender mai s intensamente quando é forçado a fazer avaliações e julgamentos. ~Halterofilismo cerebral Incluímos desafios, com exercícios, e perguntas que nem sempre têm uma resposta direta, porque seu cérebro foi programado para aprender e lembrar quando tem que trabalhar em algo (da mesma forma que você não consegue colocar seu corpo em forma apenas observando pessoas fazendo ginástica). Mas fizemos o melhor que pudemos para assegurar que, quando você estiver se esforçando muito , isso ocorra envolvendo as coisas certas. Que você não gaSte nem mesmo um dendrite extra processando um exemplo difícil de entender ou analisando jargões carregados e complexos ou texto extremamente conciso. Usamos uma abordagem 80/20. Presumimos que, se você estiver tentando obter um PhD , em Java, esse não será seu único livro. Portanto, não abordamos tudo. Apenas o que você J" realmente usará. Veja o que VOCÊ pode fazer para fazer seu cérebro obedecer. Fizemos nossa parte. O resto é com você. Essas dicas são um ponto de partida; escute seu cérebro e descubra o que funciona com você e o que não funciona. Tente coisas novas. __________________ K Re~::: ...!:.s~ ~ col~ ~ ~a~elade i~ ._ _ _ _ _ _. Q}Tenha calma . Quando mais você entender, menos @Beba água. Muita . água. . terá que memorizar. Seu cérebro funcionará me lhor com um bom banho. A Não leia apenas. Pare e pense. Quando o livro lhe desidratação (que pode ocorrer antes mesmo de você fizer uma pergunta, não passe apenas para a sentir sede) diminui a função cognitiva. resposta. Imagine que alguém está realmente fazendo a pergunta. Quando você forçar seu cérebro a pensar, ~Fale sobre o assunto. Em voz alta. mais chances terá de aprender e lembrar. Falar ativa uma parte diferente do cérebro . Se vo cê estiver tentando entender algo, ou aumentar suas ~Faça os exercícios. Es~reva suas próprias chances de se lembrar de algo posteriormente, fale ~L anotações. . em voz alta. Melhor ainda , tente explicar em voz alta para outra pessoa. Você apre nderá mais ~h Nós os inserimos, mas se os resolvermos, isso seria rapidamente e pode descobrir particularidades que como ter outra pessoa f azendo uma prova para você . E fh não olhe apenas para os exercícios . Use um lápis . Há muitas evidências de que a atividade física durante não tinha percebido ao ler sobre o assunto. ~Escute . ), o estudo pode aumentar o aprendizado. seu cérebro. Preste atenção se seu cérebro está ficando ~~ @Leia a parte "Não existem perguntas idiotas" sobrecarregado. Se perceber que começou a ler .} superficialment e ou a esquecer o que acabou de ler, :: . Quero dizer todas. Não são apenas notas laterais - é hora de fazer um intervalo. Uma ve z que tiver elas fazem parte do conteúdo principal! Às vezes as passado de um certo ponto, você não aprenderá com perguntas são mais úteis do que as respostas. maior rapidez tentando assimilar mais e pode até prejudicar o processo. ~Não leia tudo no mesmo local . Levante-se, estique o corpo, mova -se , mude de @Sinta algo! cadeira, v á até outra sala. Isso ajudará seu cérebro Seu cérebro precisa saber que isso é importante . a sentir algo e não deixará que o aprendizado fique Envolva ~se com as histórias . Cri e suas próprias muito ligado a um local específico. legendas para as fotos. Reclamar de uma piada ruim é melhor do que não sentir absolutamente nada. ~Deixe essa ser a última coisa a ser feita antes de você ir para a cama. Ou pelo menos a última ~Digite e execute o código. coisa desafiadora. Digi te e execute os exemplos de código. Em seguida, Parte do aprendizado (principalmente a trans f erência você poderá fazer te stes alterando e aperfeiçoando o ~____ _par~ :..lll.:~ór ia de lon~o prazo) ocorre~á d~pois que código (ou interrompendo - o, o que às ve ze s é a VOce recnar o J.lvro . ~eu - c...~uvr€C.l.~ct ue t-empv-- -me--±-hor maneira. de descobr i r () qu.e está re.almente L.U.II ~ próprio, para continua r processando. Se você captar acontecendo). Em exemplos longos de códigos algo novo durante e ss e tempo de processamento, parte predefinidos, você pode fazer o download dos do que acabou de aprender será perdida. arquivos -fonte a part ir de j eadjavafirst . com você está aqui ;. xxiL:~------ _______________________________________________________________________________________
  • 22. como usar este U"iT; ," rRequisitos deste livro: - - - - - - --Você não precisa ele nenhuma outra ferramenta de desenvolvimento, como um ambiente de desenvolvimentointegrado (IDE. Integrated Development Environment). Recomendamos que não use nada a não ser um editorde texto básico até concluir a leitura (e principalmente não antes do Capítulo 16). Um IDE pode lhe protegerele alguns dos detalhes que são muito importantes, portanto, você se sairá muito melhor aprendendo na linhade comando e, em seguida, após ter compreendido realmente o que está acontecendo, passe para umaferramenta que automatize parte do processo. Configurando o Java j - Se você já não tiver um SDK (Software Development Kit) Java 2 Standard Edition 1.5 ou superior, precisará dele. Se estiver trabalhando no Linux, Windows ou Solaris, poderá adquiri-lo gratuitamente em java.sun.com (site Web para desenvolvedores Java). Geralmente não são necessários mais do que dois cliques na página principal para que a página de downloads do J2SE seja acessada. Capture a última versão nela-beta publicada. O SDK inclui tudo que você precisará para compilar e executar o Java. r--. . Se você estiver executando o Mac OS X 10.4, o SDK Javajá estará instalado. Ele faz parte do OS X e você não terá que fazer mais nada. Se estiver com uma versão anterior do OS X, terá uma versão desatualizada do Java que servirá para 95% dos códigos deste livro. Nota: este livro foi baseado no Java 1.5, mas por razões desconhecidas ele marketing, logo após o r " i lançamento, a Sun a renomeou como Java 5, embora tenha mantido "IS como o número da versão no kit do desenvolvedor. Portanto, se você se deparar com Java 1.5, Java 5, Java 5.0 ou "Tiger" (pseudônimo r original da versão 5), são todas a mesma coisa. Nunca houve um Java 3.0 ou 4.0 - ele saltou da versão IA ,,! ../ , para a 5.0, mas você ainda encontrará locais onde é chamado de 1.5 em vez ele 5. Não pergunte por quê. I (Ah, e apenas para deixar a situação mais divertida, tanto o Java 5 quanto o Mac OS X 10.4 receberam o r , " mesmo pseudônimo "Tiger", e já que o OS X 10.4 é a versão do Mac OS necessária à execução do Java 5, ~1 você ouvirá pessoas falando sobre "Tiger em Tiger". Isso significa apenas Java 5 no OS X 10.4.) ~j - O SDK não inclui a documentação do APl e você precisa dela! Acesse novamente java.sun.com e capture a documentação do APl J2SE. Você também pode acessar os documentos do APl on-line, sem fazer o - I download,.mas isso é complicado. Acredite. Melhor fazer o download. i - Você precisará de um editor de texto. Praticamente qualquer editor de texto pode ser usado (vi, emacs, pico), inclusive os de GUI que vêm com a maioria dos sistemas operacionais. O Bloco de Notas , WordPad, TextEdit, etc., todos servirão, contanto que você se certifique de que eles não acrescentem um ".txC ao final de seu código-fonte. - Quando você tiver feito o download e descompactado, compactado ou seja lá o que for preciso (depende de que versão e para qual sistema operacional), terá que adicionar uma entrada para sua variável de ambiente PATH, que apontará para o diretório bin dentro do diretório Java principal. Por exemplo, se o J2SDK inserir um diretório em sua unidade de disco chamado "j2sdkl.5.0", olhe dentro desse diretório e você encontrará o diretório "bin" onde os arquivos bináJios (as ferramentas) do Java residem. O diretória bin é aquele para o qual você precisará de uma variável PATH, para que, quando digitar: % javac na linha de comando, seu terminal saiba como encontrar o compiladorjavac. Nota: se você ti ver probl emas com sua in stalação. recomendamos qu e acesse javaranch. com e se associe ao fórum Java-Beggining ! Na verdade, você deve fazer isso. lendo ou não problemas.Nota: grande parte dos códigos desle li vro estão di sponívei s em wi ckedl ys mart. com JJ", ~~xxii introduçãü t~~~ ------------------~
  • 23. a introdução Usmnos urna UNL :fict íci a. Coisas de última hora que você precisa saber: modificada ê maia simpLes Esta é uma experiência de aprendizado e não uma obra de referência. Eliminamos deliberadamente tudo que pudesse atrapalhar o aprendizado, independentemente do que estivéssemos abordando em um certo ponto do livro. E, na primeira leitura, é preciso Cão ) estudar desde o início, porque o livro faz suposições sobre o que você já viu e aprendeu. tamanho Usamos diagramas simples semelhantes à UML. latir( ) Se .tivéssemos usado UML pura, você veria algo parecido com Java, mas com sintaxe comer ( ) 1 totalmente errada. Portanto, usamos uma versão simplificada de UML que não entra em pers eguirGato ( ) conflito com a sintaxe do Java. Se você ainda não conhece UML, não terá que se preocupar J em aprender Java e UML ao mesmo tempo. Não nos preocupamos com a organização e o empacotamento de seu código até o fim do livro. Neste livro, você pode dar prosseguimento à tarefa de aprender Java, sem se preocupar com Aponte seu lápis alguns dos detalhes organizacionais e administrativos do desenvolvimento de programas em Java. No dia-a-dia, você terá que conhecer - e usar - esses detalhes, portanto, eles foram Você deve executar TODAS as abordados cuidadosamente. Mas deixamos para o fim do livro (Capítulo 17) . Relaxe atividades "Aponte seu lápi s" enquanto aprecia o Java, tranqÜilamente. i:.-... Os exercícios de fim de capítulo são obrigatórios; os quebra-cabeças são opcionais. As respostas dos dois estão no fim de cada capítulo. Uma coisa que você precisa saber sobre os quebra-cabeças - eles são enigmas. Como nos L -.., enigmas lógicos, nos estimuladores cerebrais, nas palavras cruzadas, etc. Os exerc.ícios L estão aqui para ajudar você a praticar o que aprendeu, e é recomendável fazê-los. Os quebra-cabeças são diferentes e alguns deles são bem desafiadores de uma maneira ",:1---, enigmática. Esses quebra-cabeças foram projetados para funcionar como decifradores de ~L enigmas e, provavelmente, você saberá quando encontrar um. Se não tiver certeza, sugerimos que tente fazer alguns deles, mas, independentemente do que acontecer, não h . desanime se não conseguir resolver um quebra-cabeça ou se simplesmente não tiver As atividades marcadas com o logo t ipo Exercí c i o ( t éni s d e t -- tempo para isso. corrida ) são obrigatóriasl . ~~ Não deixe de executá - las r se Os exercícios "Aponte Seu Lápis" não têm respostas. quiser mesmo aprender Java. Pelo menos não impressas neste livro. Para alguns deles, não há resposta correta e, em outros, parte da experiência de aprendizado da atividade será você decidir se e quando suas repostas estão corretas. (A lgumas de nossa respostas sugeridas estão disponíveis em wickedlysmart.com.) Os exemplos de código são tão simples quanto possível É frustrante percorrer 200 linhas de código procurando pelas duas linhas que você precisa Se você se deparar com o entender. A maioria dos exemplos deste livro é mostrada no contexto mais simples possível, logoti po Quebra-Cabeças, a atívidade é opcional e, se não para que a parte que você estiver tentando aprender fique clara e fácil. Portanto, não ~spere for um apreciaãor de lógi ca que o código seja rob usto ou mesmo completo. Isso vai depender de você depois que traiç"oeíra ou palavras terminar o livro. Os exemplos do livro foram escritos especificamente para o aprendizado e cruzadas, também não gostará nem sempre func ion am perfeitamente. . dessas atívidades . . - ,-l .... _________ br. ~· você está aqui ~ xxii i--;
  • 24. como usar est3 ;:V:d r IEditores técnicos"Todos merecem crédito, mas os erros são respo nsabilidade apenas do autor. .. " Alguém acredita nisso? Estão vendo as duaspessoas que se encontram nesta página? Se você en contrar problemas técnicos. provavelmente será culpa delas. :) l"alenr ir... Crsttazo MINI de Jessíca i.:le-ssica Sane / ~ I ~ I , . ~,Jess trabalha na Hewlett-Packard na Equipe de Serviços de Valentin Valentin Crettaz tem o diploma de Mestre em Ciência rJAuto-Reparo. Ela se formou em Engenharia da Computação na da Informação e Computação do Instituto Federal Suíço deVillanova University, tem os certificados SCPJ 1.4 e SCWCD e Tecnologia em Lausanne. (EPFL). Ele trabalhou como _.{ ~(se passaram literalmente vários meses desde que recebeu seu engenheiro de softwares com a SRI International (Menlo Park,diploma de Mestre em Engenharia de Softwares na Drexel CA) e como engenheiro chefe no Laboratório de Engenharia ;:(University (uau!). de Softwares do EPFL. -iQuando não está trabalhando, estudando ou dirigindo seu Valentin é co-fundador e CTO da Condris Technologies, umaMINI Cooper S, Jess pode ser encontrada brigando com seu empresa especializada no desenvolvimento de soluções degato pelo novelo enquanto conclui seu último projeto de tricô arquitetura de softwares .ou crochê (alguém aí quer um gorro?). Ela é originalmente de Seus interesses em pesquisa e desenvolvimento incluemSalt Lake City, Utah (não, ela não é mórmon .. . É claro, você tecnologias orientadas à apresentação, padrões de projeto edeve ter pensado nisso) e atualmente vive perto da Filadélfia arqu.itetura, serviços Web e arquitetura de software. Além decom seu marido, Mendra, e dois gatos: Cbai e Sake. cuidar de sua esposa, praticar jardinagem, ler e fazer algumVocê pode encontrá-la moderando fóruns técnicos em esporte, Valentin é moderador dos fóruns SCBCD e SCDJWSjavaranch.com. no Javaranch.com.Ele tem os certificados SCJP, SCJD, SCBSC, SCWCD e SCDJWS. Também teve a oportunidade de ser o co-autor do Simulador de Exames SCBCD do Whizlabs. (Ainda estamos chocados em vê-lo de gravata). ~ ~ :li _§J.;xxiv Imrooucso ~! I . ~.lt ---------------------------------------
  • 25. ·~. ~- a Introdução h Outras pessoas que merecem (culpa) crédito: h h Na OReilLy: h Muito obrigado a NIike Loukides da O Reilly, por participar deste projeto e aj udar a formar o conceito Use a Cabeça! em um livro (e I" série) . Quando esta segunda edição foi para a gráfica, já havia cinco Alguns de nossos revisores h livros Use a Cabeça! e ele esteve conosco em todos. A Tim OReilly, especialistas em Ja.va ••• por se dispor a entrar em algo completamente novo e diferente. Obrigado ao inteligente Kyle Hart, por descobrir como a série Use a Cabeça. poderia servir aos outros e por lançá-la. Para concluir, a Eddie Freedman, por projetar a capa da série "com ênfase na cabeça". Jef Cumps i"",, Nossos intrépidos testadores beta e equipe de revisores: ~. Agradecemos muito ao diretor de nossa equipe técnica no javaranch, 1 .Johannes de Jong. Esta é sua quinta vez trabalhando conosco em um livro Use a Cabeça! e estamos felizes por você ainda estar em contato. 1___ Jerr Cumps já.está em seu terceiro livro conosco e continua implacável I~ em achar áreas onde teríamos que ser mais claros ou COlTetos. 1 Corey McGlone. você é ótimo. E achamos que deu as explicações mais claras sobre o javaranch. Você deve perceber que roubamos uma ou duas i~ delas. Jason Menard nos salvou tecnicamente em mais do que apenas I~ alguns detalhes, e Thomas Paul, como sempre, nos forneceu feedback1-- . especializado e encontrou os sutis problemas do Java que o resto de nós deixou passar. Jane Griscti conhece Java (e sabe alguma coisa de redação) e foi ótimo tê-la ajudando na nova edição junto com o l~ associado de longa data do javaranch Barry Gaunt. I~ Mailyn de Queiroz nos deu excelente suporte nas duas edições do livro. rb.omas PaUl~I~ Chris Jones, John Nyquist, James Cubeta, Terri Cubeta e Ira Becker nos foram de grande ajuda na primeira edição.-;:.1____... 1 Agradecimentos especiais a alguns dos envolvidos na série Use a I~ Cabeça! que nos têm ajudado desde o início: Angelo Celeste, Mjkalai Marilyn de I Queiroz"h Zaikin e Thomas Durr (twduff.com). E obrigado a nosso fantástico agente, David Rogelberg do StudioB (mas, falando sério, e quanto aos direitos do filme?) Ira Becker s çubeta . Jame Terr~ cubeta Cbris Jon.es - - -- ---- - - ----- VOG8 esta aqUi ~ xxv
  • 26. como usar este iivl"Q Quando você pensou que nãQb;:nll:~r:iaJ]laj~ :::lgr:::lrlpr.imA.ntos*. Mais especialistas técnicos em Java que ajudaram na primeira edição (em ordem semialeatória): Emiko Hori, Michael Taupitz, Mike Gallihugh , Manish Hatwalne, James Chegwidden, Shweta Mathur, Mohamed Mazahim, John Paverd, Joseph Bih, Skulrat Patanavanich, Sunil Palicha, Suddhasatwa Ghosh, Ramki Srinivasan, Alfred Raouf, Angelo Celeste, Mikalai Zaikin, John Zoetebier, Jim Pleger, Barry Gaunt e Mark Dielen.A equipe dos quebra-cabeças da primeira edição: Dirk Schrekmann. Mary "Campeã de Cruzadas em Java" Leners, Rodney 1. Woodruff, Gavin Bong e Jason Menard, O Javaranch tem sorte por contar com se~ ap~io. Outros conspiradores a ·agradecer: Paul Wheaton, o principal Olientador do javaranch por dar suporte a milhares de aprendizes de Java.Solveig Haugland, instrutora de J2EE e autora de Dating design patterns (Encontrando-se com os padrõesde projeto): ,,; !Os autores Dori Smith e Tom Negrino (backupbrain.com), por nos ajudarem a conhecer o mundo doslivros técnicos. ",,Nossos parceiros no clime Head First, Eric Freeman e Beth Freeman (autores de Use a Cabeça! Design ~I iPatterns) , por disponibilizarem a BawlsTM para que terminássemos a tempo . "I ,.Sherry Dorris, por tudo que realmente importa. "Ii ;-.,, 1Os bravos pioneiros que adotaram a série Use a Cabeça!: "I ~Joe Litton, Ross P. Goldberg, Dominic Da Silva, honestpuck, Danny Bromberg, Stephen Lepp, Elton Hughes,Eric Christensen, Vulinh Nguyen, Mark Rau, Abdulhaf, Nathan Oliphant, Michael Bradly, Alex DalTow,Michael Fischer, Sarah Nottingham, Tim Allen, Bob Thomas e Mike Bibby (o primeiro). ~I ,.j !u /" O grande número de agradecimelllos se deve ao fato de estarmos teslando a teoria de que todas as pessoas mencionadas nos ..,"-"ilgradecilllentos de um livro comprarão pelo menos uma cópia, provavelm e nt e mais, pensando nos parentes e con hecidos. Se você quiserestar nos agradecimentos de nosso próxim.o li vro e tiver lima família grande, nos e~c rev a. ---- .ftw=.,.-:,xxvi introdução ~~l ---------------------------------------=~.
  • 27. - 1 1 - ~ 1 dê um Mergulho Rápido i k-" I r......-.- Aprofundando-se Venha, a água está ótima! Mergulharemos direto na criação de um código, em seguida, nós o compilaremos e o executaremos. Falaremos sobre a sintaxe, loops, ramificações e o que torna a. Java tão interessante. Logo você estará codificando. r-. . Tr-. I ----.. I o Java o levará a novas fronteiras. No humilde lançamento para o público como a (suposta) versão 1.02, o Java seduziu os programadores com sua sintaxe amigável, recursos orientados a objetos, gerenciamento de memória e, o melhor de tudo - a promessa de portabilidade. A possibilidade de escrever uma vez! executar em qualquer local exerce uma atração muito forte. Seguidores devotados surgiram, enquanto os programadores combatiam os erros, limitações e, ah sim, o fato de ela ser muito lenta. Mas isso foi há muito t.empo. Se você for iniciante em Java, tem: r--.. sorte. Alguns de nós tiveram que passar por algo como andar quase dez quilômetros na neve e subir montanhas pelos dois lados .(descalços), para fazer até mesmo o applet mais simples funcionar. poderoso Java atual. . •. Mas você pode manipular o mais fácil, rápido e muito mais ~ este é um novo capítulo
  • 28. como (j ~:::2 fu nciona Como o Java funcionao objetivo é escrever um aplicativo (neste exemplo, um convite de festa interativo) e fazê-lo fu nci onar emqualquer di spositivo que seus am igos tiverem. Method Party ( ) Código-fonte do convite de festa 1 #1 <Method . fava . l ang .Object(» Código-fonte 4 ret u rn • Cr ie um do cumento para o código - fonte. Use um pro t ocolo estabelecido Compilador Execute seu Saída (código) Máquinas virtuais O compilado r criará um (nesse caso, a linguagem Java) . documento em um compilador de c ódigo-f onte. O novo documento, c odi ficado em bytecode Java . Qualqu er o dispositivo capaz de Seus a migos não têm uma compilador procurará máquina Java física, mas erros e não deixará executar Java consegui rá todos têm uma máquina Java você c omp ilar até interpretar/conve rter esse virtual (implementada em -; ter cer t eza de que a r quivo em algo que possa ~I software ) sendo exe cu tada tu do será executado processar. O byt ec ode c ompi lado é dependente dentro de seus aparelhos ~I corretamente. eletrônicos. A máquina da plataforma. virtual lerá e executará o bytecode.o que você fará em JavaVocê criará um arquivo de código-fonte, compilará usando o compilador javac e, em seguida, executará obytecode compilado em um a máquina virtualJava. import java.awc.* impo rt java. awt. event. class ?arty { public void buildlnvite () t-lethod Party ( ) Frame f = new Fram e() ; Labe l 1 == n ew o aload_ O 1 invokespecial #1 <Method Label("Party at Tirn_s"); java.lang . Object(» Button b : : . new Sutcon ("Vou bet .. ) ; 4 return l1ethod vo id buildlnvi te (J Buccon c ::::. new O new #2 <Class java . awt.Fra!T1e> ) Button ("Shoot me"); 3 dup Pane I p = new panel(}; 4 invokespec i al #3 <Hethod p.addll) ; 1/ mais código aqui. java awt Frame(» Compilador -. -- Máquinas virtuais Saída (código) Código-fonte o • Digite seu código-fonte. Salve como : Party.java Compile o arquivo party.java executando o javac (o aplicativo do Código compilado: Party . class Execute o programa iniciando a Java Virtual Machi n e (JVM) com o arquivo c omp ilador) . Se não Party.class. A JVM houver erros, você converterá o bytecode terá um segundo em algo que a documento chamado plataforma subjacente Party.class e ntenda e executará -I O arqu ivo s e u programa. r Party . class gerado pelo compilador é composto de byt:ecodes.:~i:C·" a;. : E.O ,z:.:...~~~r;:,-~(=.mus :r~s F·ssas ..; 71S::.r;;C.S5 se:JaIl.! wtL {Ut:Ol."l.a.l ~ ~ t-açe ~~ai escrever código IGal (:;Jlt brs·ve;mêS por enqu~1tCl/ q.1ere.mcs apc.::e z qtlC t.er..ha Ulll5 idé2â d6 C61Y!O t ndo SÊ enc3ix;:.;2 capítulo
  • 29. o Ç) "O ã. -ro Um histórico bem resumido do Java o:: AÍ. o ::J .!: v ::J Ol cu L- O) -cu ctI (1) 2 > c; E :::1 ctI -, 3.500 (O) () o <tJ) o > 1:;1 ... IctI O 3.000 ctI c. 2.500 ctI -(.) Q) o :c :.õ 2.000 1.500 ctI O 1.000 ~ cn Q) cn cn ctI () 500 O - Java 1.02 Java 1.1 Java 2 (versões 1.2 - 1.4) Java 5.0 (versões 1.5 e posteriores) 250 classes 500 classes 2.300 classes 3.500 classes Lenta. Um pouco ma is rápida. MUito mais rápida. Mais recursos, mais fácil de Nome e logotipo Mais recursos , mais Po de (em al gumas situações) desenvolver. in teressante s. amigável. Começando a ser exec ut ada e m velocidades Divertida de u sar . se tornar muito condi zentes . Pro fi ssion al, Além d e ad ici ona r mais de n;lil Muito s erros . Os popular. Código de GUI poderosa. Vem e m três clas s es comp l ement ares, a Java applets são o mais adequado . versões: Micro Edition 5. O (conhecida como "Tigerj ) destaque. (J2ME), Standard Edit ion acre s cento u alterações (J 2SE) e Enterprise Edition sign if icativas à própria .(J2EE). Torna - se a linguagem l ingu agem, tornando-a maiS j fáCil preferida para novos (pe lo menos em teoria) p ar l os ap li cativos empresari ai s prog r a madores e f ornecendo novo s (pr incipa lmente os baseados recu r sos que eram populare; em na Web) e móvei s . ou tr a s linguagens.~ .. ,( ç ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ;( ,.J (.(
  • 30. - aponte seu íápis Tente adivinhar o que cada linha de código está faze ndo ... (As respostas estão na próxima página.) Veja como é fácil escrever código Java. " . ~ . int size = 27; String name = "Fido"; Dog myDog = new Dog(name, si ze); x = s i ze - 5; if (x < 1 5) myDog.bark(S); wh ile (x > 3) { myDog.play(); ~I ,-... ! I int[] nurnList = {2 , 4,6,S}; - I System. out.print("Hello"); :j ~ I I System.out.print("Dog: " + name); String num = "S"; :;{ - ! ,..--.., 1 int z = In teger .pars e l nt(num) ; ---I ~! try { readTheFile("myFile . txt" ); catch (F ileNotFoundException ex) { System.out.prin t("File no t found .") ; P: Sei que existem o Java 2 e o Java 5.0, mas existiram o Java 3 e 4? E por que Java 5.0 e não Java 2.0? R: As brincadeiras do marketing ... Quando a versão do Java passou de 1.1 para 1.2, as alterações foram tão significativas, que os anunciantes decidiram que precisavam de um "nome" totalmente novo, portanto .começaram a chamá-Ia de Java 2 , ainda que a versão fosse realmente a 1.2. Porém, as versões 1.3 e 1.4 continuaram a ser consideradas como Java 2. Nunca houve o Java 3 ou 4. Começando pelo Java versão 1.5, os anunciantes decidiram novamente que as alterações eram tão significativas, que um novo nome era necessário (e a maioria dos desenvolvedores concordou) , logo, eles avaliaram as opções. O próximo número na seqüência do nome seria "3", mas chamar o Java 1.5 de Java 3 parecia mais confuso, portanto, decidiram nomeá-lo Java 5.0 para usar o "5" da versão "1. 5". Logo, o Java original compreendeu as versões que iam da 1.02 (o primeiro lançamento oficial) às conhecidas simplesmente como "Java". As versões 1.2, 1.3 e 1.4 consistiram no "Java 2". E começando na versão 1.5, ele passou a se chamar "Java 5.0". Mas você também o verá sendo chamado de "Java 5" (sem o ".0") e "Tiger" (seu codinome original) . Não temos idéia do que acontecerá com a próxima versão ... :)::. 4 capíluio ~~ ;~L~
  • 31. l dê um Mergulho Rápido .r". Respostas do exercício Ainda não é preciso se preocupar em entender tudo isso! Tudo que se encontra aqui é explicado com maiores detalhes no livro, grande parte nas primeiras 40 páginas . Se o Java lembrar uma linguagem que você usou no passado, alguns desses itens parecerão simples. Ca~o contrário, não se preocupe com isso. Chegaremos lá ... Veja como é· fácil escrever código Java. int si ze = 27; declara uma variável de tipo inteiro ch~da • size e lhe atribui o valor 27 Str i ng name = "Fido"; declara uma variável de string de ~aracteres cbamada name e lhe atribuí o valor "Fido" Dog myDog = new Dog (name, size ); declara a nova v ariável de tipo Dog chamada myDog e cria o novo objeto Dog usando name e size x = size - 5; subtrai 5 de 27 "(valor de size) e atribui o valor a uma variável chamada x se X (valor = 22) for menor do que 15, informa ao cão (dog) para latir if (x < 15) myDog.bark(8); while (x > 3) myDog.p l ay() ; int[ ] numList = {2 ,4 ,6,8} ; declara a lista de variáveis de tipo inteiro numList e insere :1, 4, 6, 8. nela System.out.print ( "Hello") ; exibe "Bel.lo"... Irovave1.mente na 1.inha de comando System. out.print("Dog: " + name) exibe "Hello Fido" (o valor de name é "Fido") na 1.inba de comando St ri ng num = " 8"; dec1.ara a variável. de string de caracteres num e 1.he atribui o valor "S" int z = I ntege r.parse l nt (num) ; converte a string de caracteres "8" DO valor numérico real 8 try { tenta fazer algo ••• Pode ser que o que estamos tentando não funcione ... readTheFi l e ("myF ile. txt" ) lê um arquivo de texto chamado "myFile . tx~U (ou pelo menos TENTA ler .0 arquivo ... ) deve ser o fim das "tentativas" , portanto, acho que é lossível tentar fazer muitas coisas . .. catch(FileNotFoundExc e pti on ex) aqui deve ser - onde você . saberá se o que tentou não funcionou •. . System.out.print("File n ot fo und. " ); se o que tentamos não deu certo, exibiremos "File Dot found u na lillha de comando parece que tudo que se encontra entre { } é o que deve .ser rei to se a tentativa não funcionar . .•. Estrutura do código em Java o que existe em um p ublic class Dog{ arquivo-FONTE? Um arquivo de código-fonte (com a extensão .java) contém uma definição de classe . A classe J representa uma parte de seu programa, embora um aplicativo muito pequeno possa precisar classe I j r" apenas de uma classe. A classe deve ficar dentro de uma par de chaves. -======.=:1 ,..-." O que existe em uma CLASSE? public class Dog { ,..-." void bark ( ) { í! ., Uma classe tem um ou mais métodos. Na classe ~ " , > ,..-." Dog, o método bark conterá instruções de como o cão deve latir. Seus métodos devem ser declarados dentro de uma classe (em outras palavras, dentro das chaves da classe). método você está aqui I> 5 .~a==---=""",,~~ _ _ ~ _ _ _ _ _ _____-_ _ ~_- _ _ __
  • 32. • uma classe Java nllhl i r clas-s__ Dog _{_ o que existe em um MÉTODO? void bark ( ) [ Dentro das chaves de um método, escreva as in struções de como e le instruçãol; instrução2; deve ser executado. O código do método é basicamente um conjunto de r instruções, e por enquanto você pode considerar o método como se i~ fosse uma função ou procedimento. instruções Anatomia de uma classe " , Quando a JVM começar a ser executada, procurará a classe que você forn eceu na linha de comando. Em " i seguida, começaGl a procurar um método especialmente escrito que se pareça exatamente com: ;::"1 ~: public static void main (String[] args) { II seu código entra aqui Depois a JVM executará tudo que estiver entre as chaves { } de seu método principal. Todo aplicativo Java precisa ter pelo menos uma classe e um método main (não um método main por classe, apenas um por aplicativo) . assa é uma chave de ! / classe (ã.uh) o nome dessa abertu== ã.e pública para que todos po•• = aama-. I I c1.a sse classe Ipublic I~?assll::r:tAPpl t§lol retorno.. void nome desse . ~ . método s:i..gnl.r~ca que arç....:me-nt-os do !1létodo. Ess€ , ( abordaremos não há valor / mécoào deve receber uma isso depois) de retorno . d . , matr~z e str~ngs , e a chave de matriz se chamará l args J abertura I . I / / / do método Ipublicllstaticl~§in ll(stI;"ing[ . l args>l8J ISystém ~ otit ~prfnt tl"I R~lé!"~~~ essa instrução significa / . ~ toda instr-üção DEVE terminar com ponto-e - virgu~a!! a string que voc4 exibir ne saída padrão (o que: exibir padrão é a linha de comando) [I]:- - cbave à$ fecnamento do método maín Não se preocupe em memorizar nada agora. Est e oapítulo é ~:-- chave de fechamento .8 c.1.a sse MyFirsf:App apenas uma. aprese.!ltação. Criando uma classe com um método main Em Java, tudo é inserido em um a classe. Você criará seu arquivo de códi go-fonte (com extensão .Java) e, em seguida, o converterá em um novo arqui vo de classe (com extensão .class). Quando executar seu program a. na verdade estará executando um a classe. Executar um program a significa informar à Java Virtual Machine (JVM ) para "carregar a classe Helio e, em seguida , execute seu mé.todo main( ). Continue executando até todo o código de main ter termin ado". No Capítulo 2, nos aprofundare mos no assunto das classes, mas, por enqu anto, você só precisa pensar ni sto : como escrever um código Java de modo que ele seja exectttado? E tudo começa com main( ). O método main ( ) é onde seu programa começará a ser executado. Inde pe ndentemente cio tamanho de !-.eu programa (em outras palavras , não importa quantas c/asses () seu programa vai usar), é preciso que haja um método main( ) que dê início ao processo.
  • 33. dê um Mergulho Rápido, publ ic class"....... HyF irs t App p ubl i c staci c v o id { I ] main (S t ring[] args) { public class MyFirstApp { System . out .p rint (" I I] public static void main (String[] argslt Rul e !") ; ) ) System . out.println("I Rule!") ; System.out .println("The World"); o Salve MyFirstApp . javaI,......" Et Compile javac MyFirstApp.java o Execute Method Par t y () o aload_O 1 i n v okes p e ci a l #- 1 <Method java.lim;J .Cbject () > 4 return Hethod voi d " ~(~~~~]:.,j o getstatic #-2 <Field . MyFirstApp.class o que você pode inserir no método main? Quando você estiver dentro de main (ou de qualquer método), a diversão A brincadeira começará. Você pode inserir todas as coisas que costumam ser usadas na maioria das linguagens de programação parafazer o computador executar algo. Seu código pode instruir a NM a: o fazer algo Instruções : declarações, atribuições, chamadas de método, etc. int x = 3 ; String name = "Dirk"; x = x * 17; - Cada instrução deve terminar System.out.print("x is" + x); com ponto- e - vírgula. double d = Math.random(); x = x + 1; II isto é um comentário - Um comentário de linha única Et fazer algo repetidamente começa com dua s barras . x = 22; Loops: for e while while (x > 12) II esta linha me incomoda x = x - 1; - A maioria dos espaços em branco não é importante . x 3 for (int x = O; x < 1 0 ; x = x + 1 ) { System.out.print("x is now " + xl; - As variáveis são declaradas com um nome e um tipo (você aprenderá todo s os tipos Java E) fazer algo sob essa condição no Cap ítul o 3). Ramificação: testes if/else Int weight; if (x == 10) ( II tipo: int, nome: weight System.out.print("x must be 10"); else ( - As classes e mét o dos devem ser definidos dentro de um par System . out.print ( "x isnt 10"); de chaves. _ _ _...Ji...Jf ,(....~x_ -<- -.J.+-&-+aa-m€-,.-equ.als ~ ~D.i..l:k---!)-!)L)--+-_ _ _ _ _ _ _ " public void go( ) System . out.println("Gently"); II o código entra aqui } System.out.prin t("thi s line r uns no matt e r what"); você está aqui> 7
  • 34. aspectos básicos da jav2 Iterando e iterando e ... while maisBolas = = verdadeiro) o Java tem três estruturas de loop padrão: ~j)hil e, do-while efor. Você verá continueJogando( ); todos os loops posteriormente no livro, mas não nesse momento; dessa forma, usemos while por enquan to. A sintaxe (para não mencionar a lógica) é tão simples, qu e provavelmente você já deve ter adormecido. Contanto que alguma condição seja verdadeira, você fará algo dentro do bloco de loop. O bloco de loop é delimitado por um par de chaves; portanto, o que você quiser repetir terá que estar dentro desse bloco. A principal parte de um loop é o teste condicional. Em Java, o teste . condicional é uma expressão que resulta em um valor booleano - em outras palavras, algo que é verdadeiro oufalso. Se você di sser algo como "Enquanto (while) sorveteNoPote for verdadeiro, continue a tirar" , terá claramente um teste booleano. Há sorvete no pote ou não há. Mas se você dissesse "Enquanto Boh continuar a tirar", não teria realmente um teste. Para fazer isso funcionar, você teria que alterar para algo como "Enquanto Bob estiver roncando ... " ou "Enquanto Bob não estiver usando xadrez ... " .Testes booleanos simples "Você pode criar um teste booleano simples para verificar o valor de uma variável, usando um operador decomparação como: < (menor que) > (maior que) ==(igualdade) (sim, são dois sinais de igualdade)Observe a diferença entre o operador de atribuição (apenas um sinal de igualdade) e o operador igual a (doissinais de igualdade). Muitos programadores digitam acidentalmente = quando querem dizer = =. (Mas não ~você.) ~ A , int x = 4; II atribui 4 a x while (x > 3) { ,j II o código do loop será e xecutado porque ,4 II x é maior qu e 3 x = x - 1; II ou f i c ar í a mo s e te rnament e no lo op i nt z = 27; /I while (z == 17) II o código do loop não será executado porque II z não é igual a 17 .~ Não existem )( Perguntas Idiotas )( XP: Por que temos que inserir tudo em uma classe? )t:R: o Java é uma linguagem orientada a objetos (00). Não é como antigamente, quando tínhamos compiladoresantiquados e criávamos um arquivo-fonte monolítico com uma pilha .de procedimentos. No Capítulo 2, você )( ~ ..aprenderá que uma classe consiste no projeto de um objeto e que quase tudo em Java é um objeto.P: Tenho que inserir um método main em toda classe que criar? . ~.R: Não. Um programa em Java pode usar várias classes (até mesmo centenas) , mas você pode ter só uma com um método main - que fará o programa começar a ser executado. Você pode criar classes de teste, no entanto,que tenham métodos main para testar suas outras classes . -8 capítulo 1 5~ -::. ~
  • 35. dê um Mergulho Rápido;- ., P: Em minha outra linguagem, posso fazer um teste booleano com um tipo inteiro. Em Java, posso dizerr-.. algo como int x = 1; while (x) { } I---- R: Não. Um booleano e um inteiro não são tipos compatíveis em Java. Como o resultado de um teste condicional deve ser um booleano, a única variável que você pode testar diretamente (sem usar um operador de comparação) é um booleano. Por exemplo, você pode dizer: boolean isH o t = true; wh il e ( i sHo t ) { DISCRIMINAÇÃO DOS PONTOS Exemplo de um loop while - As instruções terminam em ponto-e-vírgula; p ublic cl a ss Lo opy { p ub lic static void main (S tri ng [ ] arg s) - Os blocos de código são definidos por um par de chaves i nt x = 1; {} Sy s t em.ou t. pri ntlnl"Antes do Loop"); whil e Ix < 4) ( - Declare uma variável int com um nome e um tipo: int x; Sy s tem . ou t.pr i nt lnl "No l o op" ) ; Sys tem. o u t. pr in t lnl"O va l o r d e x é " + x ); - O operador de atribuição é um sinal de igualdade = x = x + 1; - O operador igual a são dois sinais de igualdade = = Sys t e m. out.pri nt ln l" Es se é o fi m do loop" ) ; - O loop while executará tudo que estiver dentro de seu bloco (definido por chaves), contanto que o teste condicional seja verdadeiro. % java Loopy Antes do Loop - Se o teste condicional for falso, o bloco de código do No loop loop while não será executado, e o processamento passará O valor de x é 1 para baixo até o código imediatamente posterior ao bloco ________ Esta é a saída No loop O valor de x é 2 <: do loop. No loop - Coloque um teste booleano entre parênteses: O valor de x é 3 Esse é o fim do loop while (X === 4) ( ) Ramificação condicional Em Java, um teste if é basicamente o mesmo que o teste booleano de um Ioop while -- só que em vez de dizer "while ainda houver cerveja .. .", você dirá "if (se) ainda houver cerveja ... " c l ass IfTest { p ub li c stati c void mai n (S tri ng[] arg s ) ( int x = 3 ; i f Ix == 3) ( Syst em.ou t .pr i ntlnl"x deve se r i gua l a 3"); System. out . pr i nt ln l" I s s o será exe cu t ado de qualquer f orma "); % java IfTest x deve ser igual a 3 ~ ( ------ saída do códi go Isso será executado de qualquer forma,....I O código anterior executará a linha que exibe "x deve ser igual a 3" somente se a condição (x é igual a 3) for atendida. Independentemente de ser verdadeira. no entanto, a linha que exibe "Isto será executado de qualquer forma" será executada. Portanto, dependendo do valor de x, uma ou duas instruções serão exibidas. Mas podemos adicionar um a instrução e/se à condição, para podermos dizer algo como "If --.a inQ~V€1-G€rv€j a,G0f!.ti.P..u€-a-GodiJ: çar,g!.se Cc Jw-çontcirio.J.-p.eg.ue..Illil.is_ceDl.eja...e então continue ... " 9 - você está aqL-li ...
  • 36. r-... r---. r---. aplicativo Java profissional ( " ~ class IfTest2 { I pü.blic stat.ic vüid iúô...L.ú (--s-t:r--iny[] ct.rgs) C- - int x = 2; if (x == 3) { ~ System . out.println("x deve ser igual a 3" ) ; else { System.out . println("x NÃO é igual a 3"); .-.. System.out.println("Isso será executado de qualquer forma"); " . r" % java IfTest2 ........ (~______ nova seíâ~ x NÃO é igual a 3 Isso será executado de qualquer forma ~ , . Aponte seu lápi s ~ r--. : System.out.PRINTversus .-- ,Systern.,ouLprir:ltLN<., " , Dada a saída: , .. -" > " ., , r- . ~Se võc~"~restou- aten~ão (~ cI~r~ q~e % java DooBee DooBeeDooBeeDo ,-.., " prestou), dele ter notado que n~s :, ~áUérnamos ,ehtre:prlrlte prinln" ~ . Preencha as lacunas do código: "...., ..I -I ! . . . . Você entendeu a diferença? public class DooBee { - -.. J public static void main (String[] args) { - I 1.~~YS~rín·. o,ut..Prrintln i~, s,êr~ ~!1l~}!?Glv,é!. i nt x = 1; while (x < ) { r-- I -I f inha ~ (penSeem prmtln como :" . r--. .:) System.out . _ _ ___ _ ("DOO") ; tprintnewline), . enquanto .. . System. out. ("Bee") ; - j ~ ·Sy~f~m.out.print ,continaa -exibindo Ilà x = x + 1; ~.~ -~ ,~; f mesmaJinlia: Se você qúiser que cada ...--....: ~I ~ois;aque exibir esteja err( sua própria if (x == ) { - ~l System.out . print("Do") ; ~ linha, usé println: Se quiser que tudo fique ]uritoem uma ·Iinha, .ul:;e prjnt . " _ ,~ ;:C.- .~ c,-, ~.,-, . ~ ~ -;, l f . Codificando um aplicativo empresarial real , Coiocaremos todas as suas novas aptidões em Java em uso com algo prático. Precisamos de uma classe com um método main( ), um tipo int e uma variável String , um loop vvhile e um teste if. Mais alguns retoques e você estará construindo esse back-end empresarial sem demora. Mas antes examinará o código dessa página e pensará por um instante em como você codificaria esse grande clássico, "99 gaJ.Tafas de cerveja". public class BeerSong { public static void main (String[J args) { int beerNum 99; String word = "bottles"; whil e (beerNum > O) { if (beerNum = = 1) { word = "bottle"; II no singular, como em UMA garrafa. System . out.println(beerNum + " " + word + " of b eer on the .wall"); System . out.print l n(beerNum + " " + word + " of beer. " ) ; System . out. println ("Take one down.") ; System.out.println("Pass it around."); beerNum = beerNum - 1; if (beerNum > O) { System.out . println(beerNum + " " + word + " of beer on the wall " ); else { System . out .println("No more bottles of beer on the wall"); II fim de else Ainda há uma pequena fa lha em nosso II fim do loop while código. E le selá compilado e executado, } II fim d o método main mas a saída não está 100 % perfeita. Veja II fim da classe se consegue identificar a falha e cOlTija., 10 capitulo 1l
  • 37. dê um Mergulho Rápido Segunda de manhã na casa de Sob Ja~a no o despertador de Bob toca às 8:30 da manhã de segunda, como em todos os outros dias da semana. Mas Bob interior teve um fim de semana cansativo e procura o botão SNOOZE. E é aí que a ação começa e os aparelhos habilitados com Java despertam. Primeiro, o despertador envia uma mensagem para a cafeteira: " "Ei, o espertinho está / r- dom1indo de novo, atrase o café em 12 minutos ," A cafeteira envia uma mensagem para a torradeira Motorola™: "Segure a torrada, Bob está tirando o Java também está a.qui uma soneca." Em seguida, o despertador envia uma mensagem para o celular Nokia NavigatoirM de Bob: "Chame Bob às 9 horas e diga para ele que estamos ficando um pouco atrasados ." / Para concluir, o despertador envia uma mensagem para a coleira sem fio de Sam (Sam é o cachorro), com um sinal bastante familiar que significa: "Pegue o jornal, mas não espere ser levado para um passeio." Alguns minutos depois, o despertador toca novamente. E mais uma vez Bob aperta o botão SNOOZE, e os aparelhos começam a se comunicar. O despertador toca uma terceira vez. Mas, , assim que Bob alcança o botão SNOOZE, o despertador envia o sinal "salte e lata" para a coleira /. de Sam. Trazido à consciência por esse choque, Bob se levanta, grato por suas aptidões em Java e um pequeno passeio à Radio ShackThI terem melhorado a rotina diária de sua vida. Sua torrada está pronta. Manteíga Seu café está quente. Seu jornal está esperando. A coleira de Sain tem Ja.va Apenas mais uma maravilhosa manhã na Casa Habilitada com Java. Você também pode ter um lar habilitado com Java. Adote uma solução sensata que use Java, a Ethernet e a tecnologia Jini. Cuidado com imitações ao usar outras plataformas "plug and play" (que na verdade significa "conecte e perca os próximos três dias tentando fazer funcionar") ou "portáveis". A irmã de Bob, Betty, testou uma dessas outras plataformas e os resultados foram, digamos, não muito atraentes, ou seguros. Também não deu certo com seu cachorro ... Essa história poderia ser verdadeira? Sim e não. Embora haja versões de Java sendo executadas em dispositivos, dentre os quais os PDAs, telefones celuhrres (principalmente nos telefones celulares), pagers, alarmes, cartões inteligentes e outros - talvez você não encontre uma torradeira ou coleira com Java. Mas mesmo se você não conseguir encontrar uma versão habilitada para Java de seus aparelhos favoritos , ainda poderá executá-los como se fossem um dispositivo Java, controlando-os através de alguma outra interface (como seu Iaptop) que esteja executando a Java. Isso é conhecido como arquitetura substituta Jini . Sim, você pode ter essa casa dos sonhos de um nerd .. r * IP multicast se você for sistemático com relação a protocolosr1K ------ você está aqui ~ 11
  • 38. vamos escrever Ln1 programa public class PhraseOMa tic { ·- plibliç - -s-t-a-c-i-e- v·oid luctiIl (String[] args) ~ I I crie trê s conjuntos d e palav ras onde será feita a seleção . Adicione o que qu i ser! String[] wordListOne = {"24/7", " várias camadas" , "30.000 pés", " E- to-E", "todos ganham", ."fron t-end", "baseado na web" , " difundido", "inteligente " , "seis sigma", "caminho crítico", "dinâmi co "}; String[] wordListTwo = { "habilitado", "adesivo", "valor agregado", "orientado", "central", "distribuído", agrupado", "solidificado", "independente da máquina", "posicionado", "em rede", "dedicado", "alavancado", "alinhado ", "destinado", "compartilhado", "cooperativo", acelerado " } ; String[] wordListThree = {"processo", "ponto máx imo", "solução", "arquitetura", "habilitação no núcleo", "estratégia", "mindshare " , "portal", "espaço", ~ " v isão", "paradigma", "missão"}; II descubr a quantas palav ras e x istem em cada lista int oneLength = wo rdList One . length; int twoLength = wordListTwo.length; Certo, quer dizer que a canção da int threeLength = wordListThree.length; cerveja não era na verdade um aplicativo empresarial profissional . Ainda precisa 6) II gere trê s números aleatórios de algo prático para mostrar ao chefe? int randI = (i nt ) (Mat h.random () * oneLength) ; Veja o código da Paráfrase. int rand2 = (int) (Math . random() * twoLength); in t rand3 = (int) (Math .random( ) * threeLength);Nota: quand; você digi tar isso e.ln um e di tor,deixe o código criar sua própria quebra de ~ II agora construa uma frasepalavra/linha! Nunca pressione a tecla String phrase = wordListOne [r andl] + " " +Return quando estiver digitando uma string wordListTwo[rand2] + " " + wordListThree [rand3] ;(algo entre "aspas"), ou ela não serácompilada . Portanto, os hífens vistos nessa II e x iba a frasepágina são reais e você pode digité-Ios, mas System. out. print l n ("Precisamos de " + phrase);não pressiona a tecla Enter antes determinar uma string.Código da paráfraseComo funcionaEm resumo, o programa cria três listas de palavras e, em seguida, seleciona aleatoriamente uma palavra decada uma das três listas e exibe o resultado. Não se preocupe se você não entender exatamente o que estáacontecendo em cada li nha. Ora, temos o li vro inteiro à frente, portanto, relaxe. Isso é apenas um rápidoparadigma alavancado e destinado a exibir 10.000 metros de independência de máqu ina.1. A primeira etapa é criar três matrizes de strings - os contêineres que armazenarão todas as palavras.Declarar e criar uma matriz é fáci l; a segui r temos uma pequena: String[J pets = {"Fido", "Zeus", "Ein"};Todas as palavras estão entre aspas (como toda string precisa estar) e foram separadas por vírgulas.2 . Em cada uma das três li stas (matrizes) , o objetivo é se1ecionar urna palavra aleatória, portanto, temos quesaber quantas palavras existem em cada lista. Se houver 14 palavras em uma lista, precisaremos de um númeroaleatório entre O e 13 (as matrizes Java começam em zero, logo, a primeira palavra estará na posição O, asegunda na posição 1 e a última na posição 13 em uma matriz de 14 elementos). Uma matriz Java não faráobjeções em exiblr seu tamanho imediatamente. Você só precisa perguntar. Na matriz de animais deestimação, diríamos: i nt x = pets . leng th ;e agora x teria o valor 3.12 capítulo í
  • 39. dê um Mergulho Rápido 3. Precisamos ele três números aleatórios. O Java vem empacotada, independente, predefinida e habilitada na memória central com um conjunto de métodos de cálculo (por enquanto, considere-os como funções). O método random( ) retorna um número aleatório o que precisamos aqui é um ... entre O e quase 1, portanto, temos que multiplicá-lo pela quantidade de elementos (o tamanho da matriz) da lista que estivermos usando. Temos que forçar para que o resultado Processo destinado e seja um inteiro (decimais não são permitidos l ) , logo, vamos inserir uma conversão (você difundido I ,-"""" verá os detalhes no Capítulo 4). É o mesmo que se tivéssemos um número de ponto Ponto máximo dinâmico h t1utuante que quiséssemos converter em um inteiro: independente da máquina I int x = (int) 24.6; Habilitação no núcleo I~ 4. Agora construiremos a frase. selecionando uma palavra em cada uma das três listas e distribuída e inteligente I~ unindo-as (além de inserir espaços entre elas). Usaremos o operador "+", que concatenará Mindshare habilitado em 24/7 !~ (preferimos a palavra mais técnica unirá) os objetos String. Para selecionar um elemento Visão de 30.00 pés em que da matriz, você fornecerá o número do índice (posição) do item que quer usar: todos ganhafT1.- I~ String s pets [Ol; 1/ agora s é a string "Fido" Portal em rede seis sigma s = s +" " + "é um cão"; II agora s é "Fido é um cão" 1= 5. Para concluir, exibiremos a frase na linha de comando e ... voila! Somos do marketing. Bate-papo na fogueira I", ~ ~Jj !~ Conversa de hoje: O compilador e a JVM discutem a questão I "Quem é mais importante? 1,.-., i I i: J I i,.-,. I~ A Máquina Virtual Java O que, você está brincando? Olá. Sou o Java. Sou eu quem efetivamente faz um programa ser executado. O compilador apenas lhe fornece um arquivo. É só. Apenas um arquivo. Você pode imprimir e usá-lo como papel de parede, para acender o compilador j i fogo, forrar a gaiola de pássaros ou seja lá o que for, mas o !~ arquivo não fará nada a menos que eu esteja lá para executá-lo. ·1 I" Não aprecio esse tom. 1 " E esse é outro problema, o compilador não tem senso de t: j~ humor. Lógico, se você tivesse que passar o dia inteiro verificando pequenas violações na sintaxe minuciosamente ... Desculpe, mas sem a minha presença, o que exatamente você executaria? Há uma razão para o Java ter sido projetado para .I~ usar um compilador de bytecode, se você não sabe. Se ele fosse j~ uma linguagem puramente interpretada, onde - no tempo de execução - a máquina virtual tivesse que converter código-fonte diretamente de um editor de texto, o programa Java seria executaao a uma velocidade comicamente lenta. O Java já demorou tempo suficiente para convencer as pessoas de que é ,l0 rápido e poderoso o bastante para a maioria dos trabalhos. I~ Não estou falando que você é, digamos, completamente inútil. i~ Mas convenhamos, o que você faz ? Sério. Não faço idéia. Um ! programador poderia ape nas escrever bytecode manualmente, e I~ eu o usaria. Você pode ficar sem trabalho em breve, amigo. l° !0 Desculpe, mas esse é um ponto de vista bem displicente (para não dizer arrogante). Embora seja verdade que- , teoricamente - você possa executar qualquer bytecode-J".--.- 1 tormatado apropriauameme mesTlTo se ele não· vier dê üm I~ compilador Java, na prática isso é um absurdo . Um ~0 você está aqui» 13 -
  • 40. o compilador e a JVM programador escrevendo bytecode manualmente é como se -- --você-executasse-seu processamentb de palavras usando PostScript pura. E eu apreciaria se nào se dirigisse a mim como "amigo".(Vou continuar insistindo na veia irânica.) Mas você ainda nãorespondeu minha pergunta, o que faz realmente? Lembre-se de que o Java é uma linguagem fortemente tipificada, o que significa que não posso permitir que as variáveis armazenem dados com o tipo errado. Esse é um recurso de segurança crucial e posso bloquear a grande maioria das violações antes que elas cheguem até você. Além disso -Mas algumas ainda passam! Posso lançar exceçõesClassCastException e às vezes vejo pessoas tentando ~nserir otipo errado de coisa em uma matriz que foi declarada comocontendo algo diferente e - Desculpe, mas não terminei. E sim, há algumas exceções de tipo de dado que podem surgir no tempo de execução, mas algumas delas têm que ser permitidas, para que outro recurso Java importante tenha suporte - a vinculação dinâmica. No tempo de execução, um programa Java pode incluir novos objetos que não eram conhecidos nem mesmo pelo programador original, portanto, tenho que permitir um certo nível de flexibilidade. Mas meu trabalho é bloquear qualquer coisa que nunca seria - poderia ser - bem sucedida no tempo de execução. Geralmente consigo saber quando algo não vai funcionar, por exemplo, se um programador tentasse acidentalmente usar um objeto Button como uma conexão de " . soquete, eu detectaria isso e evitaria que ele causasse danos no I tempo de execução.OK. Certo. Mas e quanto à segurança? Veja tudo que eu façocom relação à segurança e você fica, digamos, procurandosinais de ponto-e-vírgula? Oooooh, mas que grande risco àsegurança! Muito obrigado! Desculpe, mas sou a primeira linha de defesa, como dizem. As violações de tipo de dado que descrevi anteriormente poderiam danificar um programa se fosse permitido que elas se manifestassem. Também sou eu que impeço as violações de acesso, como, por exemplo, um código que tentasse chamar um método privado, ou alterar um método que - por razões de segurança - não pudesse nunca ser alterado. Impeço as pessoas de mexer em códigos que não tenham permissão para ver, inclusive códigos que tentem acessar dados críticos de outra classe. Demoraria horas , talvez dias, para eu conseguir descrever a importância de meu trabalho.Não importa. Acabo tendo que fazer a mesma coisa só para mecertificar se alguém obteve acesso depois de você e alterou obytecode antes de executá-lo. É claro, mas como descrevi anteriormente, se eu não impedisse o que talvez chegue a 99 % dos problemas potenciais, você acabaria travando. E parece que não temos mais tempo, portanto, teremos que voltar a isso em um bate-papo posterior.Oh, pode contar com isso. Amigo.14 cap ítulo
  • 41. rTi. , dê um Mergulho Rápido r~ rmãs com código Um programa Java funcional está todo misturado sobre a porta da geladeira. Você conseguiria reorgani zar os trechos de código para criar um programa Java funcional que produzisse a saída listada abaixo ? Algumas das chaves caíram no li~~ , ~. .J chão e são muito pequenas para que as recuperemos, portanto, fique a vontade para adicionar quantas delas precisar! ( ----~- I i i -(-~--------- l :x: " 1) -~-------.._ I" SYst em . out . j :x: " . Pr 1. n t ( "d ") . t x-I; , .~~~~ ~ f ( x "= 2) ( S ys tem. o ut.p r int ( "b c" ) ; ~ } r - --f - ( X · ~~~ 1 I l sy s t e m. ou t .prln . t (" a" ) . I 1 int x (x > O) whil e Cada um dos arquivos Java dessa página representa um arquivo-fonte completo. Sua tarefa é person ificar o compilador e determinar se cada um deles pode ser compilado. Se não " ser compilados, como você osconigiria? ,,-. B " public static void main(String [] ,,-. args) in t x = 5; r-- wh i 1e ( x > 1 A x = x - 1; if ( x " c las s Exer cis e 1b < 3) System.out .p rint1n("sma11 x"); r p ublic stat ic v o id main (String [] a r gs ) ( ,,-. in t x 1; while x < 10 ) r if x > 3) ( ( S yste m. out . pr int ln ( " big x") ; c cla ss Ex er cisel b i nt x = 5 ; r" whi1e ( x > 1 x = x - 1; ~ __________________________________ ~f i ( x < . 3) S yst em. out .p rint 1n ("s ma 11 x"); " r-- i você está aqui ~ 15 I ......,.-..-. . " r-L
  • 42. ,--quebra-cabeça: palavra cruzada ~ Cruzadas Java Agora daremos algo para o lado direito de seu cérebro fazer. ~. nr --~ ~ . " É uma palavra cruzada pad rão , mas quase todas as palavras da ~~ solução vêm do Capítulo 1. Apenas para que você fique alerta, também incluímos algumas palavras (não relacionadas à Java) doHorizontais universo tecnológico.4. Código de linha de comando6. Ma is uma vez?8. Não pode seguir dois caminhos9. Acrônimo do tipo de energia de seu laptop .--., I11. Tipo numérico de variável12. Acrônimo de um chip13. Exibir algo17. Um conjunto de caracteres18. Anunciar uma nova classe ou método20. Para que serve um prompt?Verticais1. Não é um inteiro (ou seu barco é um objeto _ _ )2. Voltou de mãos vazias3. As portas estão abertas4. Depto. de manipuladores de LAN5. Contêineres de itens7. Até que as atitudes melhorem10. Consumidor de código-fonte12. Não é possível fixá-Ia14. Modificador inesperado15. É preciso ter um16. Como fazer algo19. Consumidor de bytecode Um programa Java curto é listado a seguir. Um bloco do programa está faltando. Seu desafio é comparar o bloco de código candidato (à esquerda) com a saída que Mensagens você veria se ele fosse inserido. Nem todas as linhas de saída serão usadas e algumas misturadas delas podem ser usadas mais de uma vez. Desenhe linhas conectando os blocos de código candidatos à saída de linha de comando correspondente. (As respostas estão no final do capítulo.) Candidatos : Saídas possíveis: class Test { p ub l ic static void ma i n(String [] args) { y = x - y; i n t x = o; L:;i2~46 int y = o; wh ile ( x < 5 ) { 11 34 59 { ., 02 14 26 38 J 1; -~, ~ 02" 14 36 48 sY",em + ou,.pr~. + Y +" ") ; X ::: X li x x -T 1; - 00 11 21 32 42 } Y = Y + ,_ Xi } 11 21 32 44 53 } , if ( y <5 ) { x = X + 1; 00 11 23 36 410 I if ( Y < 3 { o código candidato entra aqui x = x - 1; 02 14 25 36 47 } } Y = Y + 2; Compare ca(ía candidaio com uma das siJldas pOS.SIVRfS16 capítulo
  • 43. dê um Mergulho Rápido ~QUebra-ca beças na Pisci~.ar-_ I i,..-., I r--. Sua tarefa é pegar trechos de código na pisci na e inseri-los nas linhas em branco do código. Você pode não usar o mesmo trecho mais de uma vez e não terá que empregar todos os 1:- trechos. Seu objetivo é criar uma classe qlle seja compilada e executada produzindo a saída listada. Não se engane - esse I I~ exercício é mais difícil do que parece . .,r-- . cl as s PoolPuzzleOne ( public static vo id mainlString [J args) ( int x O; while ) ( if(x<l){ r--. Saída if I ) ( if I x 1 ) ( if ) ( .,......, System.out . printlnl""); x x + 1; x x + 2;.,.. x < O 1 x x x x - 2; 1· Nota: Cada trecho código da piscina só x > 1 ser usado uma vez ! x > 3 System . out . printl"noys "); x < 4 System. out .print I "oise ");. ,.. ") ; System . out . printl" oyster "); ") ; System. o ut .print I "annoys") ; ") ; ,..~--!·1 0-I !0i~ ____ você está aqui ~ 17
  • 44. Soluções dos Exercícios______ class PoolPuzzleOne ( ímãs com código: public static void main(String [I args) int x = o; class Shuffle1 { while ( X < 4 ) public static void main{String [] args) System.out.print(Ua "); int x == 3; if(x<l) while (x > O) System.out.print(U U); " if (x > 2) "- System . out.print("a ") ; System.out.print(Un"); ,......., if ( X > 1 ) x = x - 1; System.out.print(U oyster"); r--. System . out.print("-"); x x + 2; if (x == 2) ( .--..., System . out.print("b c"); if x == 1 ) System.out.print(Unoys"); -"""" if (x = = 1) System . out . print("d") ; -"""" i f ( X<1 ) x = x - 1; System.out.print(Uoise"); r" System . out . println("") ; r" X = X + 1; ~ r "I A r- class Exercise1b public static void main(Str ing [] args) ----- .. I i nt x = 1; while ( x < 10 " x = x + 1; if ( x > 3) " System.out.println("big x"); Esse código será compilado e e x ecutado (sem saida), mas sem uma linha adicionada ao programa , ele seria processado indefinidamente em um loop while infinito! B clas s foo public static void main(String [ ] args) int x = 5; while ( x > 1 x = x - 1; if ( x < 3) Candidatos: Saídas possíveis: System . out . println( "small x " ) ; y x - y; Esse arquivo não será compilado sem 22 46 y y + x; uma declaração de classe, e não se esqueç a da chave correspondente! 11 34 59 y y + 2; if( y > 02 14 26 38 c 02 14 36 48 class Exerciselb publi c static void main(String[]args) x x + 1; int x = 5 ; 00 11 21 32 42 y Y + X; while ( x ·> 1 ) x = x- I; 21 32 42 53 if ( y < 5 if ( x < 3) x =x + System . out . println("small x"); 11 23 36 410 if y 02 14 25 36 47 o código do loop while deve ficar dentro de um método. Não pode ficar s implesmente isolado fora da classe . y = y + 2;j. 18 c~p;tu!o 1
  • 45. ~~.- ~ ~ 2 classes 8 objetos Uma Viagem até Objetópolis ~ i~ l,·1 Ouvi dizer que haveria objetos. No Capítulo 1, coloca mos todo ,~ o código no método main( ). Essa não é exatamente uma abordagem l~ orientada a objetos. Na verdade ela definitivamente não é orientada a I~ objetos. Bem, usamos alguns objetos, como as matrizes de strings no·1 ~ I~ código da paráfrase, mas não desenvolvemos nenhum tipo de objeto I~ por nossa própria conta. Portanto, agora temos que deixar esse ~ universo procedimental para trás, sair de main( ) e começar a criar ~ alguns objetos por nossa própria conta . Examinaremos o que torna o desenvolvimento orientado, a objetos (00, object-oriented) em Java !~ tão divertido. Discutiremos a diferença entre uma classe e um objeto. i ,~ Examinaremos como os objetos podem melhorar sua vida (pelo I~ menos a parte dela dedicada à programação. Não podemos fazer ~ muito com relação à moda). Uma vez chegando em Objetópolis, você Ir- i pode não voltar mais. Envie-nos um cartão-postal. 1..-. i /,....... if- I~.J.. ______ I este é um novo capítulo 19 ~
  • 46. Guerra nas Cadeiras As especificações (ou como os objetos podem mudar sua vida)Era uma vez em uma loja de softwares, dois programadores quereceberam as mesmas especificações e a ordem "construam". O Gerente tde Projetos Muito Chato forçou os dois codificadores a competirem,prometendo que quem acabasse primeiro ganharia uma daquelasmodernas cadeiras Aeron™ que todo mundo no Vale de Santa C lara tem.Tanto Larry, o programador de procedimeritos, quanto Brad, o adepto da00, sabiam que isso seria fácil.Sentado em sua baia, LaITy pensou: "O que esse pro§rama precisa fazer?de que procedimentos precisamos?". E respondeu "girar e emitir som".Portanto, ele começou a construir os procedimentos . Afinal, o que é umprograma além de uma pilha de procedimentos?Enquanto isso, Brad voltou ao restaurante e pensou: "Que itensexistiriam nesse programa ... Quem são os principais envolvidos?"Primeiro ele pensou nas Formas Geométricas. É claro que eleconsiderou outros objetos como o Usuário, o Som e o evento de Clicar.Mas já tinha uma biblioteca de códigos para esses itens, portanto, sededicou à construção das Formas . Continue a ler para saber como Brad eLarry construíram seus programas e para conhecer a resposta à A cadeirainquietante pergunta "Mas quem ganhou aAeron?"Na baia de Larry r I No laptop de Brad dentro do restaurante r-- ~Como já tinha feito milhares de vezes, Larry começou aescrever seus Procedimentos Importantes. Ele criou rotate eplaySound sem demora. Brad criou uma classe para cada uma das três formas Square 1 1 ;1 . J rotate(shapeNum) ( II faz a forma girar 360 ro·ta t e II có Circle 1 1 ~ -1 } I; "-I rotate ( ~ I playSound(shapeNum) playSo1.; /I có Triangle IJ II u sa shapeNum para p esquis a r II có } II que som AIF reproduzir e executá-lo II de r ota te () { . } } playSou II código pa ra gira r um triângul o /I có } II de p laySound () { li } fi código pa ra rep ro duzi r o arquivo AIF !I ~-"""-,,.~~l;;Ji< I / de um triângulo } _ . _JLarry achou que tinha conseguido. Podia quase eba na d U:n a amsentir as rodas de aço da Aeron rolando embaixo , formatO e f :nas. Havera o as outras on · ba elade seu ... . to CO:n , . tela, .lun uáro ClICar n a ame _eMas espere! Houve uma alteração nas especificações. Quando o us s outras formas bif , O:nO a . de SO:n . <Tirara c , .,... arquIVO "Certo, tecnicamente você venceu. Larry", disse o Gerente, "mas temos t;> repro drz.i.ra UI"que adicionar apenas mais um pequeno item ao programa. Não seráproblema para programadores avançados como vocês doi s.""Se eu ganhasse uma moeda sempre que ouvisse isso ", pensou Larry,sabendo que alterações nas especificações sem problemas era ilusão. "Emesmo assim Brad parece estranhamento tranqüilo. O que estaráacontecendo?" Larry continuou mantendo sua crença de que fazer daman"eira orientada a objetos, embora avançado, era lento. E que, sealguém qui sesse fazê-lo mudar de idéia, teria que fazer isso à fo rça. o que foi adicionado às especificações20 capítulo 2
  • 47. classes e objetos Oe volta à baia de Larry Usando o laptop de Brad na praia o procedimento de rotação ainda funcionaria; o código usava Brad sorriu, tomou um gole de sua marguerita e criou uma uma tabela de pesquisa para comparar o argumento shapeNum nova classe . Às vezes o que ele mai s adorava na 00 era não com a fi gura de uma{orma real. Mas playSound teria que ser preciso mexer em código que já tivesse sido testado e mudar. E o que diabos é um arqui vo .hif? distribuído. "Flexibilidade, extensibilidade ... " ele pensou, refletindo sobre os benefícios da 00. playSound(shapeNum) ( I I se a forma n ão for urna a meba, II u se shapeNurn para pesqu isar que II som AIF reproduzir e e xecu te- o Amoeba II II ou ~--------------------~I rotate () I I repr oduza o s om .h if da a meba II c ó digo pa ra girar a ameba I; Não pareceu ser uma grande idéia, mas ele se sentia playSound ( ) desconfortável em alterar código já testado. Entre todas as 1/ código para repr odu z ir o n ovo I I a rqui vo .hif de uma a me ba pessoas, ele sabia que, independentemente do que o gerente de h projetos dissesse, as especificações sempre seriam alteradas. ~ Larry acabou alguns minutos na frente de Brad. ~ (Ah! Tanto barulho por aquela besteira de 00.) Mas o sorriso de Larry desapareceu quando o Gerente de Projetos h, Muito Chato disse (com esse tom de desapontamento): "Oh. não, não é assim que a ameba deve girar...!" k Os dois programadores acabaram escrevendo seu código de rotação dessa forma: h, 1) determine o retângulo que circula a forma -..., 2) calcule o centro desse retângulo e gire a forma ao redor desse ponto . .. ~ Mas a forma de ameba devia girar ao redor de um ponto em uma extremidade, como um ponteiro de relógio . -:1 ! "Estou frito" pensou Larry, visualizando um Wonderbread™ chamuscado. "Porém, hmmm. Eu poderia apenas i f~ adicionar outra instrução if/else ao procedimento de rotação e, em seguida, embutir o código do ponto de I 1 _____ rotação da ameba. Provavelmente isso não atrapalhará nada." Mas uma voz longínqua em sua mente dizia: "É um grande erro. Você acha honestamente que as especificações não mudarão novamente?" ~o ba na versa ~ da ame de rotaçao.." ponto d de Larry e Bra . ~ da ameba de rotaçao o que as Onde o pont~ O especificações a estar. esqueceram de deve(1 mencionar adequadamente I: J-:1/""~ 11" Il"_1 você está aqui ~ 21~~m _______________ _______~_ _~ r--.
  • 48. era uma vez e-n O;:jt=lópo:is De volta à baia de Larry ____Usando o laptop de Brad em Bl1B Ele achou que seria melhor adicionar os pontos de rotação como espreguiçadeira no Festival de B!uegrass de argumentos do procedimento de rotação. Grande parte do Telluride código foi afetada. Teste, compilação, todo o trabalho teve que Sem perder nada, Brad modificou o método de rotação, mas ser feito novamente. O que funcionava deixou de funci onar. só na classe Amoeba. Ele não tocou no código funcionaljá testado e compilado das outras partes do programa. Para rotate(shapeNum, xPt, yPt) { fornecer à classe Amoeba um ponto de rotação, ele adicionou II se a forma não for urna ameba, um atributo que todos os objetos Amoeba teriam. Ele II calcule o ponto central II baseado em um retângulo, modificou, testou e di stribuiu (com tecnologia sem fio) o II e, em seguida, gire programa revisto apen as durante o show de Bela Fleck. II ou II use xPt e ypt corno Amoeba II o deslocamento do ponto de rotação II e, em seguida, gire r---------------------~I ! in t x point; int y point; rotate() ( iJ II c ó dig o para girar a ameba / 1 usa n do os pontos x e y playSound() II código para reproduzir o novo 1/ a rqui vo .hi f d e uma ameba Então, Brad, o adepto da 00 ganhou a cadeira, certo?Não tão rápido. Larry encontrou uma falha na abordagem de Brad. E, j á que tinha certezade que, se ganhasse a cadeira, também se daria bem com a Lucy da contabilidade, tinha quereverter a situação.Larry: Você tem código duplicado! O procedimento de rotação aparece em todos os quatroitens Shape.Brad: Trata-se de um método e não um procedimento. E essas são classes e não itens.Larry: Não importa, É um projeto estúpido. Você tem que manter quaTro "métodos" derotação diferentes. Em que isso poderia ser bom? o que Larry queria (eleBrad: Oh, acho que você não viu o projeto final. Deixe que eu lhe mostre como a herança achava que a cadeira ada 00 funciona, Larry. impressionaria) o Procurei o que as quatro classes tinham Square Circle Triangle Amoeba em comum . rotate () i.j rotate() .1 rotate () r otate () playSound () j playSound ( ) i playSound () i1 playSound ( ) ~~-,._ ~ --~ .! - ~ -~ -~ • Elas são formas e todas giram e reproduzem som. Shape Shape o Em seguida, vincul e i as outras quatro classes Portanto, extrai os rotate () Superclasse de formas à nova classe recursos comuns e os Shape , em um i~seri em uma nova ~ playSound ( ) relacionamento chamado classe chamada Shape. ~~~~____~ herança.Você pode ler isso como "Square herda deShape", "Circle herda de Shape" e assimpor dian te. Removi rotate( ) e playSoLlnd( )das outras formas. portanto, agora há apenas Square Amoebaum a cópia a manter. Diz-se que a classe Shape é a supelClasse das outras quatro classes. As outras qu atro são as subclasses de Shape. As subclasses herdam os métodos da superclasse. Em outras palav ras, se ({ c/asse Shape Tipa umafún.c ionalidade, emão, automalic(l/11el1le, as suhclasses terüo essa /TI.esma fúnc ion.alidade .22 capítuio 2
  • 49. classes _ objetos E quanto ao método rotate( ) de Amoeba? Larry: Não é esse o problema aqui - que a forma de ameba tinha um procedimento de rotação e reprodução de som totalmente diferentes? Brad: Método. Larry: Não importa. Como a ameba pode fazer algo diferente se ela "herda" sua funcionalidade da classe Shape? Brad: Essa é a última etapa. A classe Amoeba sobrepõe os métodos da classe Shape. Portanto, no tempo de execução, a JVM saberá exatamente que método rotate( ) exec utar quando alguém solicitar que o objeto Amoeba gire. ~ Fiz com que a classe Amoeba sobrepusesse os métodos rotate( ) e playSound( ) da superclasse Shape Shape. Sobrepor significa apenas que uma subclasse redefinirá um de seus métodos herdados ro ta te () quando precisar alterar ou estender o comportamento desse método. Superclasse (mais abstrata) Square.___1"J Métodos de---I sobreposição da ameba Subclasses playSound ( ) (mais específicas) Il código de reprodução de som- I Ilespecífico • da ameba I Larry: Como você "diria" a um objeto Amoeba para fazer algo? Não é preciso chamar o procedimento,..-1 desculpe - método, e, em seguida, lhe informar que item girar? Brad: Isso é o que há de mais interessante na 00. Quando for hora. digamos, de o triângulo girar, o código do programa referenciará (chamará) o método rotate( ) no objeto Triangle. O resto do programa não saberá ou se importará realmente em como o tliângulo o fará. E quando você precisar adicionar algo novo ao programa, apenas criará uma nova classe para o novo tipo de objeto, para que os novos objetos tenham seu próprio comportamento. Sei como um objeto Shape deve se comportar. Sua tarefa é me informar o que fazer e a minha é fazer acontecer. Não o Or" 1 o você está aqui !lo-- 23
  • 50. pensando .- o suspense está me matando. Quem ganhou a cadeira? Amy, que trabalha no segundo andar. (Sem qu e ninguém so ubesse. o Gerente de Projetos tinha dado as especificações para três programadores.) .-.. poder do I cérebro .1 . o que você gosta na OO? Hora de ativar alguns neurônios Você acabou de ler uma hi stória sobre um programador de "Ajuda a projetar de um modo mais natural. As procedimentos competindo com um programador orientado a coisas têm uma maneira de evoluir." objetos. Tivemos uma breve visão geral de alguns conceitos-chave - Joy, 27, engenheir:a de software da 00, que incluiu as classes, métodos e atributos. Passaremos o resto do capítulo examinando as classes e objetos (retornaremos à "Não preciso mexer em código que já testei, só herança e à sobreposição em capítulos posteriores). ~!I para- adicionar um - novo recurso." - Baseado no que você viu até agora Ce no que deve s~lber de ri - Brad, 32, programador ;" alguma linguagem orientada a objetos com a qual já trabalhou), r "Gosto do fato de quê os dados eos métodos que faça uma pausa para pensar nestas perguntas: os ~t)liz~ ficam Juritos ~m uma cl~sse." . . Quais são os itens fundamentais que você terá que considerar - Josh, 22, bebedor de cerveja quando projetar uma classe Java? Que perguntas terá que fazer para A reutilização do código eni outros aplicativos. você mesmo? Se pudesse projetar uma lista de conferência para Quando crio uma nova classe, posso torná-la . usar quando estiver projetando uma classe, o que incluiria nela? flexíyel o suficiente para que seja usada em algo novo pQsteriormente." dica metacognitiva - Chris, 39, gerente de projetos Se você empacou em um exercício, tente falar sobre ele em voz alta. Falar Ce ouvir) "Não. posso acreditar que Chris .disseisso. Ele não . ativará uma parte diferente de seu cérebro. ,-."escreve uma linha de éódigo há 5 .anos." Embora isso funcione melhor quando , :Daryl, 44, trabalha para qlr!s__ temos outra pessoa com quem discutir, também funciona com "Além da cadeira?" animais de estimação. Foi assim que ·Amy, 34, programadora deu imorfismo. "Quando você projetar uma classe, pense nos objetos que serão criadoscom esse tipo de classe. Considere:- as coisas que ü objeto conhece- as coisas que () obj eto faz Despertador carrinhoCompras Botão h o r a Alarme con t e údoCarrinho conhece rótul o conhece conhece modoAl arme cor ad i c i onarAoCarrinho( configurarHoraAlarme ( remove rDoCa r r i nho( ) con fi g u r arCor ( ) carJtur a1. Ho [CtAlarme ( ) passarCai x a ( ) faz conf i gu rarRó t u l o( ) faz a l a rmeEs!:..iC:1n f i g u rado( faz soltar( ) s o n e ca ( ) pressionarNovarnente ( )
  • 51. classes ? objetos As coisas que um objeto conhece sobre si mesmo se chamam - variáve is de instância h As coisas que um objeto pode fazer se chamam Canção - métodos variáveis de título instância (estado) conhece artista configurarTítulo( ) métodos co nfigurarArtista( ) faz (comportamento) rep rodu zir ( ) - _._~. As coisas que um objeto conhece sobre ele são chamadas dê variáveis de instância. Elas representam o estado de um objeto (os dados) e podem ter valores exclusivos para cada objeto desse tipo. , Aponte seu lápis Considere instância como outra maneira de dizer objeto. As coisas que um objeto faz são chamadas de métodos. Quando projetar Preencha com o que um objeto televisão I ,----- pode ter que saber e fazer. uma classe, você pensará nos dados que um objeto terá que conhecer sobre si mesmo e também projetará os métodos que operarão sobre esses Televisão dados. É comum um objeto ter métodos que leiam ou gravem os valores das variáveis de instância. Por exemplo, os objetos Despertador têm uma li variáveis de variável de instância que armazena a hora de despertar e dois métodos que capturam e configuram essa hora. li instância (estado) métodos Portanto, os objetos têm variáveis de instância e métodos, mas essas (comportamento) variáveis de instância e métodos são projetadas como parte da classe. I! r Qual é a diferença entre uma classe e um objeto? , ~l . "" Cão uma classe Uma classe não é um objeto. 1 : ~1"-"" tamanho (Mas é usada para construí-los.) , r aça ::1...,..-. Uma classe é o projeto de um objeto. Ela informa à ~1~ máquina virtual como criar um objeto desse tipo l~I específico. Cada objeto criado a partir dessa classe terá -·1 seus próprios valores para as variáveis de instância daJ~ classe. Por exemplo, você pode usar a classe Button para "1 -., muitos criar vários botões diferentes, e cada botão poderá ter sua .,. . ;1 objetos própria cor, tamanho, forma, rótulo e assim por diante. ;:,J---- ··1 I~,IçI ~i I --~ 1- Jr" Olhe dessa forma ... Um objeto seria como um registro de sua agenda de endereços. Uma analogia que poderíamos usar para os objetos seria um conjunto de fichas Rolodex™ não utilizadas. Todas as fichas tem os mesmos campos em branco (as variáveis de instância). Quando você preencher uma ficha , estará criando uma instância (objeto), e as entro.das que criar nessa ficha representarão seu estado. E T Os métodos da classe são as coisas que você pode fazer com uma fich a específica; E Nome polimorfismo obterNome( ), alterarNome( ), configurarNome( ), todos poderiam ser métodos da Telefone 555-0343 classe Rolodex. Portanto, todas as fichasfúzem. as mesmas coisas (obterNome( ). alterarNome( ), etc.) , mas cada uma conhece coisas exclusi vas sobre si mesma .-0J--~r--. _-------- .. 25
  • 52. 0~;~V""Iorl,..... __ " ........... ___ ..... _ _ h:_"- _-JI lal IU V ;:I:JU t-J I IIIII:JII V VUJC lUMas o que é necessário para a criação e uso de um objeto? Você prec isa de duas classes. o operador ponto (.) lhe dará acesso ao estado eUma para o tipo de obj eto que deseja usar (Dog, Alarm Clock, Television , etc. ) e outra comportamento (variáveispara testar sua nova classe. É ria classe testadora que você inserirá o método principal e de instância e métodos) denesse método main ( ) cri ará e acessará obj etos de seu novo tipo de classe. A classe um objeto.testadora terá apen as um a tarefa: lestar os método e variáveis de seu novo tipo de Il cri a um novo o bjeto Dog d = new Dog( );classe de objetos.Desse ponto do livro em di ante, você verá duas classes em muitos de nossos exemplos. I I solicita que e l e lata usando oUma será a classe real - a classe cujos obj etos realmente queremos usar, e a outra será a II operador ponto naclasse testadora, que chamaremos de <qualquerQueSejaNomeSuaC/asse>TestDrive. Por II variável d para chamarexemplo , se criarmos uma classe Bungee, também pieci saremos de uma classe bark( ) d.bark( );BungeeTestDrive. Só a classe <nomeA lgumaClasse> TestDrive terá um método main ( ),e sua única finalidade será criar objetos de seu novo tipo (a classe que não for a de teste) II configure seu tamanh o rpara em seguida usar o operador ponto (.) para acessar os métodos e variáveis dos novos usandoobjetos. Faremos tudo isso muito claramente nos exemplos a seguir. II o operador pon to d.size=40; ~ Crie sua classe c lass Dog { Cão in t si zei String b reed; tamanho i String n ame ; raça -1 .......,i nome void bark() { i System . out . println("Ruff Ruff!O); latir( ---- -I; ,.-. ! / I . /" I ~ Crie uma classe testadora (TestDrive) /,1 cl ass DogTes t Drive { i, public static void main (String[] args ) { II o código de t es te de Dog entra aqui j I ---- . j I I ~i ~ Em sua classe testadora, crie um objeto e acesse suas variáveis e métodos ~j ,. 1 --..: ! class DogTestDrive { ,,1 publ ic static voicl main (String[] args) { " ~I i i Dog d = new Dog (); -"I d .si ze 40 ; :1...i),:",·n;,ôc ,:, ___" -1 ~ d . bark() ; ~(------------------------------------- =1Se você já tem algum código 00 pronto, sabe que não esta mos usand o encapsulamento.Abordaremos esse assunto no Capítul o 4. ~ 3 1~ : I
  • 53. ,f-.;.-- --~ classes objetos Criando e testando objetos Movie class Movie ( String title; String genre; int rating; void playlt () System.out.println("Playing the movie"); public class MovieTestDrive ( public static void main(String[] args) Movie one new Movie(); one.title = "Gone with the Stock"; one . genre = "Tragic"; one .rating = -2; Movie two new Movie(); tAlo.title = "Lost in Cubicle Space"; two . genre = "Comedy"; two .rating = 5; two . playlt() ; Movie three new Movie(); three . title = "Byte Club"; three.genre = "Tragic but ultimately uplifting"; three . rating = 127; Aponte seu lápis MOVI E title title Objeto 1 genre genre rating rating playlt( ) i 11 r title A classe MovieTestDrive cria Objeto 2 objetos (instâncias) da classe Movie e usa o operador ponto (.) rating para configurar as variáveis de instância com um valor específico. Ela também referencia (chama) um title método em um dos objetos . Preencha a figura à direita com os Objeto 3 valores que os três objetos rating apresentam no fim de main( ). Rápido! Saia de main! Se você estiver em main( ), não estará realmente em Objetópo!is. É adequado um programa de teste ser executado dentro do método main, mas, em um aplicativo 00 real, você precisará de objetos que se comuniquem com outros objetos e não de um método mail1 () estático criando e testando objetos. As duas finalidades de main: h - testar sua classe real h - acionarliniciar seu aplicativo Java I- Y" - --_ .~ ._- Um aplicativo Java rcal nada mais é do que-objetos se comunicando com o-;ltroS objetos. Nesse-caso, comunicar-se significa os objetos chamando os métodos uns dos outros . Na página anterior, e no Capítulo 4, 27}; ------------------------------------
  • 54. saia logo ciG" ,,?lnexaminamos o uso de um método main( ) em uma classe TestDrive separadapara c,ia, e testEI]" os iihSiOuo, e variáveis àe omraTlas; -: No CapltTfÍOt -- -examinaremos o uso de uma classe com um método main( ) para iniciar umaplicativo Java real (criando objetos e, em seguida, deixando-os livres parainteragir com outros objetos, etc.)No entanto, como um a prévia de como um aplicativo Java real pode secomportar, aqui está um pequeno exemplo. Já que ainda estamos nos estágiosiniciais do aprendizado de Java, trabalharemos com um pequeno kit deferramentas, portanto, você achará esse programa um pouco complicado e -ineficiente. Talvez pense no que poderia fazer para aperfeiçoá-lo, e emcapítulos posteriores é exatamente isso que faremos . Não Se preocupe separte do código for confusa; o ponto-chave desse exemplo é que os objetos secomunicam entre si.o jogo de adivinhação ~ ____________ GameLauncher ~ ,0 ~ cria 71.J?1 obje t oResumo:o jogo de adivinhação envolve um objeto game e três objetos player. Ojogo gera um número aleatório entre O e 9 e os três objetos player tentamadivinhá-lo. (Não dissemos que seria umjogo divertido.)Classes: GuessGame ílGuessGame.class Player.class GameLauncher.class pI 1 p2 # "- in sté.ncia :ios t.:,.:?E AA lógica: p3 i I I ~1) É na classe GameLauncher que o aplicativo é iniciado; ela tem o startGame( )método main( ). .,._.[12) No método main( ), um objeto GLiessGame é criado e seu métodostartGame() é chamado.3) É no método startGame() do objeto GuessGame que o jogo i.nteiro se Player ldesenrola. Ele cria três j ogadores e, em seguida, "pensa" em um número número 1 o palpi te óess:;:aleatório (aquele que os jogadores têm que adivinhar). Depois solicita a j O!:?BÓ:"T l-!él.z. ê. c J"HlmeTO r ~cada jogador que adivinhe, verifica o resultado e exibe informações sobreo(s) jogador(es) vencedor(es) ou pede que adivinhem novamente. guess( ) 1 pa]pí t e ;[ public class GuessGame ---- , Player pI; A Player p 2 ; Player p3; public void startGame ( ) pI new Player(); p2 new Player(); aLIibuí E1 eles as três p3 new Player(); int guesspl O; int guessp2 O; . .":;uTid;:.en~2.;· CS tl" t?s T::l. J ~)i t es int guessp3 O; qU<2 os jOÇiadOIê-B fornecerãc: -:1 - .~ boolean plisRight false ; boolean p2isRight false ; boolean p3isRight false; in t targetNumber = (int) (Math . random() * 10); ~__----------__----__- System . o ut.println("Estou pensaIldu e lll u ln número entre ü e 9 ... ") i while(true) { System . out . println("O número a ad iv inhar é " + targetNumber); pI. gU8 sS ( ) ; ,:,> " . -:;: ,: p2 . guess ( ) ; L- - - - - - - - - - - - - - - - - - - - -- - - - - - - - -- - - - - - - p3 . guess{) i28 -~_ .. ~ - 2 .~~ - ~i
  • 55. c lasses e objetos guesspl = pl . number ; System. o u t .pr intln("O j ogador um forn e ceu o palpite" + guesspl); I guessp2 = p2.number ; " System . out.print·ln("O jogador dois forneceu o palpite" + guessp2) guessp3 = p3 . number; System.out.println("O jogador tr ês forneceu o palpite " + guessp3); if (guesspl == targetNumber) plisRight = true; " .. 1 if (guessp2 -- targetNumber) I p2isRight = true; r- if (guessp3 -- targetNumber) p3isRight = true; if (plisRight II p2isRight II p3isRight) System.out.println("Temos um vencedor!"); I~ System.out.println("O jogador um acertou? " + plisRight); System.out.println("O jogador dois acertou? " + p2isRight); System.out . println("O jogador três acertou? " + p3isRight); System.out . println("Fim do jogo . "); break; II fim do jogo, portanto saia do loop else ( h II devemos continuar porque ninguém acertou! Lu r.n: pa;p.i~e. ~ System.out.println("Os jogadores terão que tentar novamente . " ) ; II fim de if /e lse h II fim do loop II fim do método Saída (será diferente a cada vez que você executar) I~ II fim da classe ~ Executando o jogo de adivinhação -~-< public c lass Player I int number = o; II onde entra o palpite i- I h public void guess() number = (int) (Math . random() * 10); l -- System.out . print l n("Estou pensando em " + number); ~~ ~ public class GameLauncher { h I public static void main (String(] args) GuessGame game = new GuessGame() ; ""j,., game.startGame() ; j l~ ~ O Java coleta o lixo . Sempre que um objeto é criado em Java, ele vai para 1 = -I,"", uma área da memória conhecida como Heap. Todos os objetos - independentemente de quando, onde ou como sejam criados - residem no heap . Mas não se trat a ir-- simplesmente de qualquer memória heap como as antigas; na verdade a memória heap Java se chama Pilha de I .r Lixo Coletável. Quando você criar um ob jeto, a Java alocará espaço na memória heap de acordo com quant o ess e objeto Ir-- específico vai precisar. Um obje t o com, digamos , 15 variáveis de instância, provavelmente preci sará de mais / r espaço do que um objeto com apenas duas variáveis de instância. Mas o que acontecerá quando você precisar l~ reclamar esse espaç o ? Como você tirará um objeto do heap quando não precisar mais dele? A Java gerenciará essa l~ memória para vo cê! Quando a JVM perceber que um objeto Ir-- pode nunca mais ser usado, ele se tornará qualifi ca do pa ra a coleta de lixo . E se você estiver ficando com pouco espa çoJ ,. -- na memó ria. ,. Q c9--1. I?tQr de. Lixo será executado el imin ar.ª-..o3L~. objetos inalcançávei s e liberará espaço, para que esse possair-- ser reutilizado. Em cap ítul os posteriores vo cê aprenderá1r-- I ma is sobre como isso funciona ..J: ..:______ -( 29
  • 56. não existem í"c, ~", "" ~ . Não existem Perguntas Idiotas P·. E se eu precisar de variáveis e métodos P: O que é um programa Java? O que é realmenteglobais? Como conseguirei isso, se tudo precisa distribuído?estar em uma classe? R: Não há um conceito de variáveis e métodos R: Um programa Java consiste em uma pilha de classes (ou, pelo menos, uma classe), Em um aplicativoglobais em um programa Java orientado a objetos, Na Java, uma das classes deve ter um método main , usadoprática, entretanto, haverá situações em que você pode para iniciar o programa, Portanto, como programador,querer que um método (ou uma constante) esteja você escreve uma ou mais classes, E essas classes sãodisponível para qualquer código que for executado em que você distribuirá, Se o usuário final não tiver umaqualquer parte de seu programa, Considere o método JVM, você também precisará incluir nas classes de seurandom( ) do aplicativo da paráfrase; é um método que aplicativo, para que eles possam executar seutem que poder ser chamado de qualquer local. E quanto programa, Há vários programas de instalação quea uma constante como pi? Você aprenderá no Capítulo permitem incluir nas classes diversos JVMs (digamos,10 que marcar um método como public e static faz com para diferentes plataformas) e inserir tudo em um CD-que ele se comporte de maneira semelhante a um ROM, Assim o usuário final poderá instalar a versãométodo global, Qualquer código, de qualquer classe de correta da JVM (supondo que eles já não a tenham emseu aplicativo, poderá acessar um método estático suas máquinas),público, E se você marcar uma variável como public,static e final - terá essencialmente criado umaconstante disponível globalmente , P: E se eu tiver uma centena de classes? Ou mil? Não seria complicado distribuir todos essesP: Mas como poderia chamar isso de orientado aobjetos se ainda é possível tornar globais as arquivos? Posso empacotá-los em um Kit Aplicativo?funções e dados? R: Sim , seria complicado distribuir uma grande quantidade de arquivos para seus usuários finais, masR: Em primeiro lugar, tudo em Java reside em umaclasse, Portanto, a constante pi e o método random( ), você não precisa fazer isso, você pode inserir todos os arquivos de seu aplicativo em um Java Archive - umembora públicos e estáticos, são definidos dentro da arquivo .jar- que usa o formato pkzip, No arquivo jar,classe Math, E você deve se lembrar que esses itens você poderá incluir um arquivo de texto simplesestáticos (semelhantes aos globais) são a exceção em formatado como algo chamado mainfesto, que definirávez da regra em Java , Eles representam um caso muito que classe desse arquivo contém o método mainO queespecial, em que não se tem várias instâncias/objetos, deve ser executado, DISCRIMINAÇÃO DOS PONTOS -------------m - A programação orientada a objetos lhe permitiú estender um programa sem ser preci so mexer em código fu nci onal já testado. - Todo código Java é definido em uma classe. - Uma classe descreve como criar um objeto desse tipo de classe. Uma classe é como um projeto. - Um objeto pode cuidar de si próprio; você não preci sa conh ecer ou se importar com a malleiru de ele agir. - Um objeto conhece coisas e faz coisas. - As coi sas que um objeto con hece sobre si próprio se chamam variáveis de instância, Elas representam o estado de um objeto, - As coisas que um objeto faz são chamadas de métodos , Eles representam o comportamento de um objeto , - Quando você criar um a classe, tal vez queira criar ullla classe de teste separada, que usará para gerar objetos de seu novo tipo de classe. - Ullla classe pode herdar variáveis de in stâ ncia e métodos de uma supen:lasse mai s abstra,a. - No tempo de exec ução, um programa Java nada mai s é do qüe objetos co liluni ca ndo-se COI11 outros ohjelos .30 c80ituln :2
  • 57. classes e objetos U17]él cri eSSe - eCO OS 06· 17]0 u leto s S - 17]él rece élO Co lta. 17]0 Os 6· . IScoú Os. Seja o compilador Cada um dos arquivos Java dessa página representa um arquivo-fonte completo. Sua taTefa é personificar o compilador e determinar se cada um deles pode ser compilado. Se não puderem ser compilados, como você os corrigiria, e se eles foremI compilados, qual seria sua saida?h A B class TapeDeck { class DVDPlayer ( boolean canRecord false; boolean canRecord false; void playTape () ( void rec ordDVD() ( System.out.println("tape playing U ); System . out.println("DVD recording U ); void recordTape() ( System.out . println("tape recording U ) ; class DVDPl ayerTes tDrive { public static void main(String [] args) ( DVDPlayer d = new DVDPlayer (); class TapeDeckTestDrive ( d.canRecord = true; public static void main(String [J args) ( d.playDVD(); t.canRecord = true; if (d . canRecord true) ( t.playTape() ; d.recordDVD(); i f (t . canRecord true) { t . racQr_dTap_ ( ) ; eIr--,l~_nz _ __ _. você está aqui .. 31
  • 58. exercício: ímãs com código fmãs com código Um programa Java está todo misturado sobre a geladeira. Você conseguiria reconstruir os trechos de código para criar um programa Java funcional que produzisse a saída listada a seguir? Algumas das chaves caíram no chão e são muito pequenas para que as recuperemos, portanto, fiq ue à vontade para adicionar quantas delas precisar! J d.pla y snare () ; I, DrumKi t )II@. R ,t d lA = new ~4ji4!~& DrumKi t () " 4. % $ i, ._ f ·,~ " ..--.." boolean topHat = true; boolean snare = true; "- --.. I void playSnare ( ) " :[ System. out. println ("bang bang ba- 1 bang") ; " ~, ",.J, public static void main ( String [) args ,---.. .J 1 ,J ., :1 I~~ I d (d, snare __ 1 -- true ) r : } ·PlaYS n a r e () . b ! d. snare = class DrumKitTestDrive {, DrumKit FI Ed! W d H I D ~ ~".r ~T~ Dru~i tTé~iDri V~ ; %j ava :!::~T":l-.:;:t;~t- . ti.",;;,. -< : ~;-d i ~~~a~ ~ H~a~t~~(~ ~{~-------------------_____ y~T o:p~ ) bang .bang , ba-bang .. : ~ , s y stem. o ut.println (" ding < "<f, - • ding da - ding", d~ng ding da- ~inl:L , ", :.:/ " Quem sou eu? ~. "" :", Um grupo de componentes Java, vestido a rigor, está participado do jogo, "Quem sou eu?" ~~ em uma festa. Eles lhe darão uma pista e você tentará adivinhar quem são, baseado no que disserem. Se por acaso disserem algo que possa ser verdadeiro para mais de um deles, ~. selecione todos aos quais a frase possa ser aplicada. Preencha as linhas em branco próximas à frase com os nomes de um ou mais candidatos. A primeira é por nossa conta. Candidatos desta noite: Classe Método Objeto Variável de instância Sou compilado em um arquivo .java. classe _____________________________________________________ Os valores de minha variável de instância podem ser diferentes dos de meu colega. ______________________________ Comporto-me como um modclo. _________________________________ _~_____________________________~ Gosto de fazer coisas. Posso ter muitos métodos. Represento o estado" ___ _____________________________________________ _____ ___-,-_ _ ~ ~ Odeio comportamentos. 4 Estou situado nos objetos. ~~ Vivo no heap . ________________________________________________________________________~ Coswmocriarins~nc i ~deo~cto. -----------------------------------_______ ______ Meu estado pode se alterar. ;ii ~ Declaro métodos. Posso mudar no tempo de execução.32 capitulo . 2 :i." h..
  • 59. ~. c. . classes e objetos ~Quebra-cabeças na Pisci~.a~~", Sua tarefa é pegar os trechos de código da piscina e inseri-los nas linhas em branco do códi go. Você pode usar o mesmo trecho mai s de uma vez e não terá que empregar todos os trechos. Seu objetivo é criar classes que sejam compiladas e exec utadas produzindo a saída l.i stada. public class EchoTestDrive ( public static void main (String [ ] args ) { Echo e1 .= new Echo ( ) ; int x = O; while ( ) ( e1 . hello () ; Saída if ) ( e2.count e 2 .c ount + 1; if ) ( , I e2 .count e2 . count + e1 . count; r I~ x = x + 1; .1 ht System.out . println( e2.c ount) ; Pergunta adicional! ,~ Se a última linha da saída fosse 24 eml~ vez de 10, como você concluiria o class I v--. quebra-cabeça? int O; void System_out . println("helloooo . . _ O); Nota: Cada trecho de código da piscina x < 4 x < 5 x > O x x > 1 y I~ e2 x 3 Echo x 4 count Teste r I" I echo( ) count ( ) e2 = e1; I~ 1 - hello ( ) Echo e2; count + 1 ; I, e 1_count + e2 e1; e2 = new Echo( ) ; !-, Ir>..L,,_ I I l~ --I" t, voce está aqui p. .33...... ------ .";". r>
  • 60. soluções Cios é (~ -. Soluções dos ExercícioS____ _ ..1 ~Oluções dos quebra-cabeçasImas co:d190: - com I Quem sou eu? clas s DrumKit ( ~ Sou compilado em um arquivo .java. classe boolean topHat = true ; boolean snare = true; Os valores de minha variável de instância podem ser diferentes void playTopHat() ( dos de meu colega. objeto System . out.println("ding ding da-ding"); Comporto-me como um modelo. classe void playSnare() ( System . out . println("bang bang ba-ban~"); Gosto de fazer coisas. objeto, método Posso ter muitos métodos. classe, objeto class DrumKitTestDrive ( Represento o estado . variável de instância public static void main(String [] args) ( Odeio comportamentos. objeto, classe DrumKit d = n ew DrumKi t(); d.playSnare() ; Estou situad o nos objetos. método, variável de instância d . snare = false; d.playTopHat(); Vivo no heap. objeto if (d . snare == true) d.playSnare() ; Costumo criar instânci as de objeto. classe Meu estado pode se alterar. objeto, variável de instância Declaro métodos. classeSeja o compilador: Posso mudar no tempo de execução. objeto, variável de class TapeDeck { ~ instância boolean canRecord = fal se; void playTape() ( Nota: di z-se que tanto as classes quanto os objetos possuen estado e System . out . println("tape playing"); comportamento. Eles são definidos na classe, mas também são consideradosA parte do objeto. Por enquanto, não vamos nos preocupar com a questão técnica void recordTape() ( de ond e eles residem. System . out . println("tape recording"); clas s TapeDeckTestDrive ( Quebra-cabeça da piscina public static void main(String [] args) { TapeDeck t = new TapeDeck( ); public class EchoTestDrive t.canRecord = true; Temos o modelo, public static void main(String [] args) { t . pl ayTape () ; agora t emos que Echo e 1 new Ech o() ; if (t .c anRecord == true) criar um Echo e2 new Echo(); II a resposta correta t .recordTape() ; objeto! - ou - Echo e2 el; II a da pergunta adicional! int x = O; while (x < 4 ) e1. helI o ( ) ; class DVDPlayer { el.count = el.count + 1; boolean canRecord = false; if (x == 3 ) void recordDVD() { e2 . count = e2.count + 1; System. out .pr intln ("DVD recording");B if (x > O) { void playDVD ( ) { e2 . count e2 .count + e1 . count ; System.out .println("DVD playing"); l~o!!~~:~ad~~!a~~~lt~~o7ão seria I x = x + l i ~--------------~ [f System . out.println(e2 . count); class DVDPlayerTestDrive { public s ta tic void main (St ri ng [J args) ( ~ DVDPlayer d = new DVDPlayer(); ~ d . canRecord = true; d . playDVD() ; if (d . canRecord == true) I class Echo { d .recordDVD( ) ; t int count = O; v.oid helIo ( ) ( i , System . out . println("helloooo ... "); i ~34 capítulo 2
  • 61. .(~: ::=.-F ,- 3 variáveis primitivas e referência Conheça suas Variáveis /"" ) A Existem duas versões de variáveis: primitivas e de referência. Até agora você usou variáveis em duas situações- como estado do objeto (variáveis de instância) e como variáveis locais (variáveis declaradas dentro de um método). Posteriormente, usaremos variáveis como argumentos (valores enviados para um método pelo código que o chamou) e como tipos de retorno (valores retornados ao código que chamou o método). Você viu variáveis declaradas como valores inteiros primitivos simples (tipo int). Examinou variáveis declaradas como algo mais complexo do tipo string ou matriz. Porém há mais coisas na vida além de inteiros, strings e matrizes. E se você tiver um objeto DonodeAnimal com uma variável de instância Cão? Ou um Carro com um Motor? Neste capítulo desvelaremos os mistérios dos tipos Java e examinaremos o que você pode declarar como uma variável, o que pode inserir em uma variável e o que pode fazer com ela. E, para concluir, discutiremos o que acontece realmente na pilha de lixo coletável. ~ ·7~- e~:ilê é um novo capitulo 35 ~ ._-------------------------------------- = - " " - - --
  • 62. declarando uma variável Declarando uma variável o Java considera o tipo importante. Ele não permitirá que você faça algo bizarro e perigoso como in serir a referência de uma girafa em uma variável " Coelho - o que aconteceria quando alguém tentasse pedir ao suposto coelho para saltar( )? E não permitirá que insira um número de ponto " flutuante em uma variável de tipo inteiro, a menos que você informe ao " compilador que sabe que pode perder a precisão (o que se encontra após a ~ vírgula decimal). A Java considera i tipo ilnportante . O compilador consegue identificar a maioria dos problemas: " o, não pode inserir girafa em tuna Coelho saltador = new Girafa ( }; " ! variável Coel ho . r.... Não espere que isso seja compilado. Ainda bem que não será. r- Para que toda essa segurança dos tipos funcione, você deve declarar o tipo de sua variável. Ela é um inteiro? Um Cão? Um único caractere? As variáveis vêm em duas versões: primitivas e de referência de objeto. As primitivas contêm valores básicos (pense em padrões de bits simples) que incluem inteiros, booleanos e números de ponto flutuante . As referências de objeto contêm, bem, referências a objetos. (Puxa! Isso não :1 "· 1 I esclareceu tudo?) ~1 Examinaremos primeiro as variáveis primitivas e, em seguida, passaremos ~ II para o que uma referência de objeto significa realmente. Mas independentemente do tipo, você deve seguir duas regras de declaração: " I " o; 1 As variáveis devem ter um tipo - 1 "-1 Além de um tipo, uma variável precisa de um nome, para que você possa - i ~I usar esse nome no código. ! As variáveis devem ter um nome ":1 ~1 int counti ~1 I tipo nome r- 1 j Nota: quando você se deparar com uma instrução como " um objeto de tipo X", pense em ripo "" :1 e classe como sinônimos. (Detal haremos isso um pouco mais em capítulos posteriores.) "Gostaria de um café duplo, não traga um do tipo inteiro." Quando você pensar em variáveis Jav a, pense em xícaras. Xícaras de café, xícaras de chá, canecas gigantes onde cabe muita r-- jo cerveja, esses grandes copos em que as pipocas são vendidas no cinema, xícaras com alças curvilíneas e sexy e canecas com -- ---.oacabamento metálico que lhe disseram para nunca colocar em um microondas.Uma variável é apenas uma xícara. Um contêiner. Ela contém algo oEla tem um tamanho e um tipo. Neste capítulo, examinaremos primeiro as vario áveis (xícaras) que contêm tipos primitivos e, um =1pouco mais adiante, discutiremos as xícaras que contêm referências a objefos. Não deixe de acompanhar toda a nossa analogiacom as xícaras - tão simples como está sendo agora, ela nos fornecerá uma maneira comum de examinar as coisas quando a ~,l ~1~discussão ficar mais complexa. E isso ocorrerá em breve.As variáveis primitivas são como as xícaras que vemos nos cafés. Se você já foi a um Starbucks nos Estados Unidos, sabe sobre o r-::,0que estamos falando aquio Elas têm tamanhos diferentes e cada uma tem um nome como pequena, grande ou "Gostaria de um ~, moca grande com pouca cafeína e chantilly".oPodemos ver as xícaras dispostas no balcão, portanto, é possível ordená-Ias corretamente: ~~ ~t: -~ r, pequena média grande gigante J ~l __.J:36 capítulo 3 ~
  • 63. variáveis primitivas e de referência , ).-, h E, em Java, existem tamanhos diferentes para as variáveis primitivas e esses tamanhos têm nomes. Quando você declarar uma variável em Java, h - deve declará-la com um tipo específico. Os quatro contêineres mostrados h aqui são para os quatro tipos primitivos inteiros em Ja va. l ongo int curto byte Cada xícara contém uma quantidade, o mesmo ocorrendo com as variáveis primitivas Java, de modo que, em vez de dizer "Quero uma xícara grande de café francês torrado", você diria ao compilador "Quero uma variável int com o número 90, por favor" . Exceto por uma pequena diferença ... Em Java, você também terá que fornecer um nome para sua xícara. Portanto, na verdade diríamos "Quero um int, por favor, com o valor 2.486 e chame a variável de tamanho". Cada variável primitiva possui uma quantidade fixa de bits (tamanho da xícara) . Os tamanhos das seis variáveis primitivas numéricas em Java são mostrados a seguir: M - b yte 8 curto 16 int 32 longo 64 ~ float - 1 d ouble 32 64 Tipos primitivos Declarações primitivas com atribuições: Tipo Quantidade de bits Intervalo de valores int x; x = 234; Bolleano e char byte b = 89; Booleano (específica da JVM) verdadeiro oufalso boo1ean isFun = true; double d = 3456.98; char 16 bits o a 65535 char c = f; numéricos (todos têm sinal) int z = x; boo1ean isPunkRock; inteiro ispunkRock = false; byte 8 b i ts - 128 a 127 boolean powerOn; curto 16 bits Observe o r. É preciso -32768 a 32767 powerOn = isFun; int inseri-lo em um tipo 32 bits -214748364 8 a 2147483647 longo long big = 3456789; float, porque o J ava 64 bits -enorme a e norme float f = 32.5f; ( _______ c onsidera tudo que encontra com um ponto ponto flutuante flutuan t e como um tipo ãouble, a menos que f fl o at 32 bits varia seja usado. double 64 bits varia Você não queria derramar isso realmente ... Certifique-se de que o valor cabe na variável. Você não pode desejar uma quantidade grande em uma xícara pequena. 1~ Bem, certo, você pode, mas vai perder uma parte. Você terá o que chamamos de derramamento. O compilador tentará ajudar a impedir isso se conseguir perceber que algo em seu código não caberá no contêiner . ~ (variável/xícara) que você está usando . Por exemplo, você não pode despejar muitos inteiros em um contêiner de tamanho byte, como descrito a seguir: in t x = 24; byte b - x ; .~ l/não funci onará!! .J ;1", 37 - você está aqui>~-~~-----------------------------------------------------------------
  • 64. atribuiçãoPor que isso não funcionou, você poderia]Je!g~l~t~r~ Afinéd, _ val~: 9~ é~~2_e 24~~!initivamente é _L1~n valor o.suficientemente baixo para caber em um tipo byte. Você sabe disso, e nós também , mas tudo que importa aocompilador é que houve a tentativa de se inserir algo grande em um recipiente pequeno, e há a possibilidade dederramamento. Não espere que o compilador saiba qual é o valor de x, mesmo se por acaso você puder vê-loliteralmente em seu código.Você pode atribuir um valor a uma variável de várias maneiras dentre elas: - digitar um valor literal depois do sinal de igualdade (x = 12, isGod = true, etc). - atribuir o valor de uma variável a outra (x = y) - usar uma expressão combinando os dois (x = Y+ 43)Nos exemplos a seguir, os valores literais estão em itálico e negrito: int size = 32; declara um int chamado size e atribui a ele o valor 32 char initial = j; declara um char chamado initial e atribui a ele o valor j double d = 456,709; declara um double chamado d e atribui a ele o valor 456,709 boolean isCrazy; declara um booleano chamado isCrazy (sem atribuição) int y = x + 456; declara um int chamado y e atribui a ele um valor que é igual à somado valor atual de x mais 456 Aponte seu lápis Afaste-se dessa palavra-chave! o compilador não deixará que você insira a Você sabe que precisa de um nome e de um tipo para suas variáveis. quantidade de uma xícara grande em uma pequena. Você já conhece os tipos primitivos. Mas e quanto à operação inversa - despejar o Mas o que pode usar como nomes? As regras são simples. Você pode conteúdo de uma xícara pequena em uma grande? nomear uma classe, método ou variável de acordo com as regras a Sem problemas- seguir (as regras reais são um pouco mais flexíveis, mas estas o Baseado no que você sabe sobre o tamanho e o manterão em segurança): tipo das variáveis primitivas, veja se consegue - Ele deve começar com uma letra. um sublinhado C) ou o cifrão ($). descobrir quais dessas linhas são válidas e quais Você não pode iniciar um nome com um número. não são. Não abordamos todas as regras ainda, portanto, em algumas das opções, você terá que - Depois do primeiro caractere, você também pode usar números. Só não usar o seu melhor palpite. Dica: sempre qúe o comece com um número. compilador erra, é em nome da segurança. - O nome pode ser o que você quiser, se obedecer as regras, contanto Na lista a seguir, circule as instruções que que não seja uma das palavras reservadas do Java. seriam válidas se essas linhas estivessem em um As palavras reservadas são palavras-chave (e outras coisas) que o único método: compilador reconhece. Mas se você quiser realmente brincar de confundir o compilador, simplesmente tente usar uma palavra reservada 1- int x = 34.5; como um nome. 2. boolean boo x; Você já viu algumas palavras reservadas quando examinamos a criação 3. int g 17; de nossa primeira classe principal: não use nenhu:ma 4. int y g; public static void ( - - - - - - dessas palavras nos nomes que criar~ 5. y = y + 10; E os tipos primitivos também são reservados: 6. 7. short s; s = y; boolean char byte short int long I float double 8. byte b 3; Mas há muitas outras que ainda não discutimos. Mesmo se você não 9. byte v b; precisar saber o que elas significam, terá que saber que não pode usá-las em suas criações. Não tente - deforma alguma - memorizá-las 10. short n = 12; agora. Para reservar espaço em sua mente, provavelmente você teria que 11. v = n; perder alguma outra coisa. Como onde seu carro está estacionado. Não 1 2 . byte k 12 8 ; se preocupe, até o fim do livro você terá a maioria delas memorizada.38
  • 65. variáveis p-rimitivas e de referência o Essa tabela está reservada byte char double float int long sho rt prot€cted abstract final native static stri c f p synchronized transient vo l atile if ---- el s e do wh il e switch case default for bre ak continue assert r--.. class e x tends implements import instanceo f interfac e n ew package super t h is ,-., catch finally try throw th r ows r eturn voi d const goto enum r-.. As palavras-chave Java e outras palavras reservadas (em ordem aleatória). Se você usá-las como nomes, o compilador ficará muito confuso. Controlando seu objeto Oog Você sabe como declarar uma variável primitiva e atribuir a ela um valor. Mas e quanto às variáveis não primitivas? Em outras palavras, e quanto aos objetos? - Na verdade não há uma variável de OBJETO. - Há apenas uma variável de REFERÊNCIA de objeto. - Uma variável de referência de objeto contém bits que representam uma maneira de acessar um objeto. - Ela não contém o objeto propliamente dito, mas algo como um ponteir~. Ou um endereço. Em Java, não sabemos realmente o que se encontra dentro de uma variável de referência. Sabemos que, o que quer que seja, representará um e somente um objeto. E a JVM sabe como usar a referência para chegar ao objeto. Você não pode inserir um objeto em uma variável. Geralmente consideramos isso dessa forma ... Dizemos coisas como "passei a string para o método System.out.println( )". Ou "o método retorna um objeto Dog" ou ainda "inseri um novo objeto Foo na variável chamada myFoo". Mas não é isso o que acontece. Não existem xícaras gigantes expansíveis que possam crescer até o tamanho de qualquer objeto. Os objetos residem em um e apenas um local- a pilha de lixo coletável! (Você aprenderáI mais sobre i~so pos~<:~:i~I~m ~ nte neste capítu lo.)~ ----- Enquanto uma variável primitiva fica cheia de bits que representam o valor recJ-d; -~ariável, uma variável de referência de objeto fica cheia de bits que representam uma maneira de chegar ao objeto. você está aqui ~ 39
  • 66. referências d3 obj etoVocê usará o operador ponto (.) em uma variável de referência para dizer "use o que está antes do ponto parame lfaZer U ljue está depoIs ào pomo". Purexemplo: myDog . bark( );significa "use o objeto referenciado pela variável myDog para chamar o método bark( )". Quando você usar ooperador ponto em uma variável de referência de objeto, considere isso como se estivesse pressionando umbotão do controle remoto desse objeto. Dog d - new Dog( ) , • d.bark( ) , • ...... ~ considere isso- "" como s e rosse isso Pense na variável de referência de Dog como o controle remoto de um objeto Vog o Voc ê a usará para acessar o objeto e razer algo (chamar métodos). Uma referência de objeto é apenas outro valor da variável. Algo que é despejado em uma xícara. Só que dessa vez é um .,. controle remoto. Variável primitva byte x = 7; os bits que repres entam 7 es tão na variável . (00000111) . byte curto int longo referência 8 16 32 64 (quantidade de bits não é relevante) pri mitivo Nas variáveis primitivas, o valor da variável é ... O valor literal (5, -26,7, a). byte Nas variáyeis de referência,o valor da variável são ...f Bits, que represent/[m umanianeira de chegar uma Variável de referênciaI: . i objeto específico. . Dog myDog = new Dog( }; os bits que repres en tam uma maneira de acessar o Não sabemos (ou nos importamos) como uma JVM objeto Dog fícam dentro da variável. específica implementa as referências de objeto. Certo, elas O objeto Dog propriamente dito não fica na podem ser um ponteiro que aponte para um ponteiro que variável! aponte para ... Mas. mesmo Sé você souber, não poderá usar os bits para nenhuma outra finalidade que não seja acessar um objeto. Não nos importamos co m quantos algarismos I e O ex istem em um a variá vel de referência. Isso é responsa bi lidade de cada .JVM e da fa se da Lua.40 c8píruio 3
  • 67. variáveis primitivas e de referência"", As 3 etapas de declaração, criação e atribu ição N ão existem de objetos Perguntas Idiotas 1 _/- 3 2 P: Qual o tamanho de uma variável de Dog myDog = new Dog( ); referência? ~ Declare uma variável de referência R: Você não saberá. A menos que tenha intimidade com alguém da equipe de Dog myDog = new Dog ( ); desenvolvimento da JVM, não saberá como uma Dog referência é representada. Haverá ponteiros em Solic i ta à JVM para alocar espaço para uma algum local , mas você não poderá acessá-Ios. Não variável de referência e nomeia essa variável como myDog . A variável de referênc i a será sempre precisará disso. (Certo, se insistir, não há por que do tipo Dog . Em outras palavras, um controle não imaginá-Ia com um valor de 64 bits.) Mas remoto que tenha botões que controlem um objeto quando estiver pensando em questões de Dog, mas não um objeto Car, Buttton ou Socket. alocação de memória, sua Grande Preocupação • Crie um objeto deverá ser com quantos objetos (e não referências de objeto) está criando e com qual seu (dos Dog myDog = new Dog ( ); objetos) verdadeiro tamanho. Solic i ta à JVM para alocar espaço para um novo objeto Dog no heap (aprenderemos muito mais sobre esse processo, principalmente no Capítulo 9). P: Mas isso significa que todas as referências de objeto têm o mesmo tamanho, objeto Dog . independentemente do tamanho dos objetos reais aos quais elas se referem? ~ Vincule o objeto e a referência Dog myDog = new Dog( ) ; R: Sim . Todas as referências de uma determinada JVM terão o mesmo tamanho, Atribui o novo objeto Dog à variável de referência myDog. Em outras palavras, programa o independentemente dos objetos que elas cOlltrole remoto. referenciarem , mas cada JVM pode ter uma maneira diferente de representar referências , portanto, as referências de uma JVM podem ser menores ou maiores do que as de outra JVM. P: Posso fazer cálculos em uma variável de referência, aumentá-Ia, você sabe - operações próprias da linguagem C? R: Não. Repita comigo: "O Java não é o C". Tudo sobre o Java Entrevista desta semana : A referência de objeto Use a Cabeça!: Então, diga .. nos, como é vida de uma Use a Cabeça!: Isso significa que você pode referenciar referência de objeto? apenas úm cão? Referência: Bem simples, na verdade. Sou um controle Referência: Não, posso referenciar um cão e, em seguida, remoto e posso ser programada para controlar diferentes cinco minutos após referenciar algum outro cão. Contanto que objetos. seja um cão, posso ser redirecionada (como na reprogramação de seu controle remoto para uma TV diferente) para ele. A Use a Cabeça!: Você quer di zer objetos diferentes mesmo menos que ... Deixa pra lá, esquece. enquanto está sendo executada? Tipo, você pode referenciar um cão e, em seguida, cinco minutos após Use a Cabeça!: Não, diga. O que você ia dizer? referenciar um carro ? Referência: Não acho que você queira entrar nesse assunto Referência: É claro que não. Uma vez tendo sido declarada, é agora, mas darei apenas uma expli cação rápida - se eu for iSsQque-&9 LL S@-@-u fO!" 0-G9Htre!e rgmet9..de L!!1l cão, entfio, _._ .... _mar:=d.a..c.muo..finaLe.ntão. quundome atribuírem um Cão. nãoI: nunca poderei apontar (opa - descu lpe. não devemos di ze r apontar), digo, referenciar algo que não seja um cão. poderei ser reprogramada para nada mais exceto esse e somente esse cão. Em outras palavras, nenhum outro objetol= _______-~ voce est<?i aqui !>- 41 ..-_
  • 68. referências de objetopoderá ser atribuído a mim. meus botões o dia inteiro, mas nada de interessante ,U A , - -- - ----f -I- - b· · -- ·--acontecerIa. Eu me se- - - -Use a C a b eça.: voce esta certa, nao queremos a ar so re ISSO - - - ", i1tit-ía tão...-rrÚíül.- Oill desperdício de " " " , " , ItT - f I d f . bits. Na verdade, nem tantos bIts, mas mesmo assim a "uns. Eagora. OK , entao a menos que voce seja ma , po e re erenClar A • -,. S f ,. t A d _ • • _ . A essa nao e a pior parte. e eu or a Ul1lca reerenCIa e umum cao e, em segUIda, referenciar um cao diferente. Voce pode b f d f f d II _ . ? ,_ o ~eto especI lCO e, em segUI a, or con Igura a com nunao referenciar absolutamente nada. E posslvel nao ser (d d ) T ., d ro ramada ara nada? esprograma a ,.ISSO slgm Ica que agora nl:1 guem po erap g p acessar aquele obJeto que eu estava referenciando.Referência: Sim, mas me incomoda falar sobre isso. Use a Cabeça!: E isso não é bom porque .. .Use a Cabeça!: Por quê? Referência: Precisa perguntar? Desenvolvi um relacionamentoReferência: Porque significa que eu seria nula e isso me com esse objeto, uma conexão íntima e, em seguida, o vínculoincomoda. é repentina e cruelmente rompido. E eu nunca verei esse objetoUse a Cabeça!: Você quer dizer que então não teria valor? novamente, porque agora ele estará qualificado para [produtor, deixa para a música trágica] a coleta de lixo. Sniff. Mas vocêReferência: Oh, nulo é um valor. Eu ainda seria um controle acha que os programadores consideram isso? Snif. Por que,remoto, mas é como se você trouxesse para casa um novo por que não posso ser uma variável primitiva? Odeio ser umacontrole remoto universal e não tivesse uma TV. Não estarei referência . A responsabilidade, todos os relacionamentosprogramada para controlar nada. Vocês poderiam pressionar rompidos ...A vida na pilha de lixo coletável Book b = new Book() i Book c = new Book()i Declare duas variáveis de referência Book. Crie dois novos objetos Book. Atribua os objetos Book às variáveis de referência. Agora os dois objetos Book estão residindo na pilha . Referências; 2 Objetos; 2 B00k Book d = Ci Declare uma nova variável de referência Book. Em vez de criar um terceiro objeto Book, atribua o va l or da variável a à variável d. Mas o que isso significa? É como dizer "pegue os bits de a, faça uma cópia deles e insira essa cópia em do. Tanto c quanto d referenciam o mesmo objeto. As variáveis c e d contêm duas cópias diferentes com o mesmo valor . Dois controles remotos programados para uma TV. Referências; 3 Objetos; 2 Book c = bi Atr,ibua o valor da variável b à variável c . Agora você já sabe o que isso significa. Os bits da variável b serão copiados e essa nova cópia será inserida na variável c. Tanto b quanto c referenciam o mesmo objeto . Referências; 3 Objetos: 242 capítulo 3
  • 69. variáveis primitivas e de referênciaVida e morte na pilha Book b = new Book( ); Book c = new Book( ); Declare duas variáveis de referência. Crie dois novos objetos Book. Atribua os ob jetos Book às variáveis de referência. Agora os dois objetos Book estão residindo na pilha. Ref erências at ivas: 2 Obje t os alcançáveis : 2 Book b = c; Esse objeto foi .",abandonado. É isca do Atribua o va l or da variável c à variável b . Os bits da Ik::. coletor de lixo. var iável c serão copi ados, e e ssa nova cópia será ins e rida na variável b. As duas var i áveis contêm 1 valores idênticos . Tanto b quanto c referenciam o mesmo objeto. O objeto 1 será abandonado e estará qualificado para a Coleta de Lixo (GC, Garbage Co l lect i on) . Ref erências a tivas : 2 Objetos alcançáveis : I Objetos abandonados: I O p r imeiro objeto que b refer e nciava, o objeto 1, não tem mais referências, se tornou inalcançável. Book Ainda não foi c = null; Ainda abandonado abandonado ( esta·r áseguro Atr i bua o valor null à var i ável c. Isso a tornará urna enquant·o b referência nula , o que significa que ela não está 1. referenciá - lO) referenc i ando nada . Mas continua a ser urna variável de ~ referência e outro objeto Book pode se r atribuído a ela. O ob jeto 2 ainda t em urna referênc i a ativa (b) e , enquanto a tiver, nã o e stará qua l i fi cad o para a GC . Refer ências ativas: I Refe r ências nulas : 1 Objetos alcançáveis: I Objetos abandonados : I Book ~ referência nula (não está programada para nada)Uma matriz é como uma bandeja com xícaras • Declare urna variável de matriz int . Uma variável de matriz é o controle r e moto de urn objeto de matriz. int [ nurns; Cri e uma nova matriz int d e tamanho 7 e a a t ribua à variável int[ 1 nurns já declarada n urns new int [71; você está aqui ~ 43
  • 70. uma matnz de objetos Q Forneca ~ara cada elt;:!..IDp.nto da mnr.r;7. 11m v3~lor _iT"l.-r_ _ __ Lembre - se de que os elementos de uma matriz int são apenas variáveis int. nums[O] = 6; 7 variáveis int -O 1:1 nums[l] 19; "!i " ; nums[2] - 44; ~ nums[3] = 42; <II o ~ ~. ; 1 2 3 456 4 nums[4] = 10; int int int int int int int ~ .. . . . !-. nums[5] 20; . ::l .. o" " .... objeto de matriz int (int[ ]l nums[6] 1; . j ~. int [] Note que a matr iz será um objeto r mesmo se tiver os 7 elementos primitivos.As matrizes também são objetosA biblioteca padrão Java inclui várias estruturas de dados sofisticadas incluindo mapas, árvores e conjuntos(consulte o Apêndice B), mas as matrizes servirão bem quando você quiser apenas obter uma lista de coisas demaneira rápida, ordenada e eficiente. As ma1:J.izes lhe concederão acesso aleatório rápido, permitindo que vocêuse a posição de um índice para acessar qualquer elemento existente nelas.Todo elemento de uma ma1:J.·iz é apenas uma variável. Em outras pahivras, um dos oito tipos primitivos de -ivariável (lembré-se: Large Furry Dog) ou uma variável de referência. Qualquer coisa que você inserir em umavariável desse tipo poderá ser a1:J.-ibuída a um elemento de m.atriz do mesmo tipo. Portanto, em uma matriz detipo int (int[ ]), cada elemento pode conter um inteiro. Em uma matriz Dog (Dog[ ]) cada elemento podeconter... Um objeto Dog? Não, lembre-se de que uma variável de referência só armazena uma referência (umcontrole remoto) e não o próprio objeto. Logo, em uma matriz Dog, cada elemento pode conter o controleremoto de um objeto Dog. É claro que ainda teremos que criar os objetos Dog .. . E você verá tudo isso napróxima página.Não deixe de observar um item-chave no cenário acima - a matriz será um objeto, mesmo se tivervariáveis primitivas.As matrizes são sempre objetos, não importando se foram declaradas para conter tipos primitivos oureferências de objeío. Mas você pode ter um objeto de matriz que tenha sido declarado para conter valoresprimitivos. Em outras palavras, o objeto de matriz pode ter elementos que sejam primitivos, mas a matrizpropriamente dita nunca é de um tipo primitivo. Independentemente do que a matriz armazenar, ela sempreserá um objeto!Crie uma matriz de objetos 009 ~ Decl are uma variável de matriz Dog Dog[] pets; Crie uma nova matriz Dog com taman ho igual a 7 e a a tribua à variável Dog[] o 1 2 3 4 6 pe t s já declarada Dog Dog Dog Dog Dog Dog Dog pets = new Dog[7]; objeto de matriz Dog (Dog[ ]lo que está faltando? Dog[]Objetos Dog Temos um a matriz de referências Dog,mas nenh um objeto Dog real!44 ca Dítuin 3
  • 71. variáveis primitivas e de referência ~ crie novos objetos Dog e atribua - os aos elementos da matriz. Lembre-se de que os e lementos de uma matriz Dog são apenas variáveis de referênc ia Dog. Ai nda precis amos de ob je tos Dog pets[Q[ new DogiI~ pets[l] = new DogiI"I~,"""", Aponte seu lápis!" ~ .~ ~. .::... 0123456 .. .I Dog Dog Dog Dog Dog Dog Dog " i ::: ... . -1 Qual é o valor atual de pets[2]? Pet ..I""""i,..---,. Que código faria pets[3] referenciar um dos dois objetos Dog existentes? L . Dog[] objeto de matriz Dog (Dog[ ])I" Controle seu objeto 0091j~ (com uma variável de referência) Dog fido = new Dog () ;I~ fi do . name = "Fido"; Criamos um objeto Dog e usamos o operador ponto na , variável de referênciajido para acessar a variável name*. Podemos usar a referênciajido para fazer o cão latire ), comere ) ou perseguirGatos( ). Dog fido . bark() ; fido.chaseCat () ; Dog o que aconteceria se o objeto D09 estivesse em uma matriz Dog? Sabemos que podemos acessar as variáveis de instância e métodos de Dog usando o name operador ponto, mas onde usá-lo ? bark( ) eat( ) 1 Quando o objeto Dog estiver em uma matriz, não teremos uma variável name real (como jido). Em vez disso usaremos a notação de matriz e apertaremos o botão do controle chaseCat( ) I remoto (operador ponto) do objeto de um índi.ce (posição) específico da matriz: Dog [] myDogs = new Dog[ 3]; myDogs[O] = new Dog() ; myDog s [O] .name = "Fido"; myDogs[O] . bark(); *Sim. sabemos que não estamos demonstrando o encapsulamento aqui, mas estamos tentando manter o código simples. Por enquanto. Veremos o encapsulamento no Capítulo 4." o Java acha o tipo importante. Quando você tiver declarado uma matriz, não poderá inserir nada que não seja do tipo declarado para ela. Por exemplo, você não pode inserir um objeto Cat em uma matriz Dog (seria muito frustrante se alguém achasse que só há cães na matriz e pedisse a cada um deles que latisse para então.com espanto descobrir que há um gato à espreita). E você não pode inserir um tipo double em uma matriz int (derramamento, lembra-se?). No entanto,l ------J~ pode inseri um byte em uma matriz int, porque o tipo byte sempre caberá em uma xícara de tamanho int. Isso é -coü1iecld.O como alargamento ImplÍcllo. l!,mraremos em deraihes pusLerÍurmeule; por enquant9 ape~J<ts Iemti:e"s~rl€ que o compilador não permitirá que você insira algo errado ,e m uma matriz, com b.~seno tipo declárado para ela., você está aqui!> 45
  • 72. - usando referências Um exemplo de 009 class Dog St ring name; Dog name public static void main (String[] args ) II cria um objeto Dog e o acessa bark( "" eat ( ) ,.-.,. Dog dogl = new Dog(); chaseCat ( ) . dogl.bark() ; ~ dogl . name = "Bart"; ~ II ago ra cria uma matriz Dog Dog[] myDogs = new Dog[3]; r-... Saída II and put some dogs in it r-... myDogs[Q} new Dog(); r-... myDogs[l} new Dog(); myDogs[2] dogl; II agora acessa os objetos Dog """ - II usando as referências da matriz myDogs [ Q] . name "Fred" ; "" . myDogs[l] . name "Marge" ; II Hrnmmm ... qual é o nemo de myDogs[2]? .-. System.out . print("o nome do último cão é "}; ".t System . out.println(myDogs[2] .name ) ; II agora execu ta um loop pela matriz .k .~ II e pede a todos os cães para latirem ......., ,; int x ::: O; as ma.trizes têm t.una variá,,:rel -"i while(x < myDogs.length) { ~(~-------- length que lhe fornecerá a myDogs[x] . bark(); ~Jantidade de elementos """ ] " """ ,# c<i x = x + 1; r-- -1 r-... .~~ public void bark() { r . System . out . println(name + " diz Ruff!"); "" ,.... .i" public void eat() { I" public void chaseCat ( } , " ·fl " ..-.., DISCRIMINAÇÃO DOS PONTOS - - - - - - - - - - , ..-.... - As variáveis vêm em duas versões: primitivas e de referência. ......., - As variáveis devem sempre ser declaradas com um nome e um tipo. I" - O valor de uma variável primitiva são os bits que o representam (5, a, verdadeiro, 3. 1416, etc.). - O valor de uma variável de referência são os bits que representam uma maneira de acessar um objeto da pilha. """ / " J - A variável de referência é como um controle remoto. Usar o operador ponto (.) em uma variável de referênci a é como pressionar um botão no controle remoto para acessar um método ou valiável de in stânci a. r-... "" - Uma variável de referência tem valor nulo quando não está referenciando nenhum objeto. - Uma matriz é sempre um objeto, mesmo quando é declarada para conter tipos primitivos. Não existe algo """ como uma matriz primitiva, somente uma matriz que contenha tipos primitivos. 46 capítulo 3iL
  • 73. variáveis primitivas e de referência Seja o compilador Cada um dos arquivos Java dessa página representa um arquivo-fonte completo. Sua I" é personificar o compilador e determinar se cada um deles pode ser compilado. Se não puderem ser compilados, como você os corrigiria? A B class Books { class Hobbits { String title; String author; String name; public static void main(String (] args) ( class BooksTestDrive ( public static void main(String (] args) Hobbits (] h = new Hobbits(3]; int z O; Books (] myBooks new Books(3]; int x = O; while (z < 4) myBooks(Ol .tit le "The Grapes of Java"; z = z + 1; myBooks(l] .title "The Java Gatsby" ; h(z] = new Hobbits (); myBooks(2] .title "The Jav a Cookbook"; h(z] . name = "bi l bo"; myBooks (O ] .author "bob" ; if (z == 1) ( myBooks(ll.author s ue" ; h (z] .name = "frodo"; myBooks (2 ] .author "ian" ;I" if (z == 2) ( wh ile (x < 3) ( h(z ] . name = "sam"; System.out.pr i nt (myBooks (x] . title); System . out .print(" by "); System.ou t. p ri n t (h(z] .name + " is a "); System . out . println(myBooks(x] .author); System .out.print ln("good Hobbit name"); x = x + 1;: " Imãs com código Um programa Java está todo misturado sobre a geladeira. Você conseguiria reconstruir os trechos de código para in Y . 01 criar um programa Java funcional que produzisse a saída listada a seguir? Algumas das chaves caíram no chão e são muito pequenas para que as recuperemos , portanto, fique à vontade para adicionar int ref; quantas delas precisar! while (y < 4) { 1~~0 ] 1; Ij index(l] 3; index( 2] o; 1 index(3] 2; l String (] p;;;ss:.4LM4t.Aii44ii ,, islands = new String(4]; . "-I!! iJ!! _n tIl , 14· . Qi854?iiWtlAMIW$4t4# Mi4iiWiJ94ij!!!nh J , System.out.print("island = "); ,. :>" J:~, «"S -*; ~4il ,:;;<t;; {! HG#4&""4 - , . _ -9 r----~ _4~ , _ < , %Q 1 lnt [] ind _ -------:-----, - ex - new lnt [4]; . class TestArrays você está aqui.. 47
  • 74. " .--." ,.--,.,quebra-cabeças: quebréH.:ab.sçós na p:scíns ,.--,., Quebra-cabeças na Piscina Sua tarefa é pegar os trech os de códi go da pi scin a e in seri-l os .--." ... -----rms--rhrtTa~nim!nc·ocioc ód i go . Você pode usaJl5 mesmo trecho mais de um a vez e não precisa empregar todos os " ,.-..,. trechos. Seu objetivo é criar uma classe que seja compilada e executada, produzindo a saída listada. ..-., r-. r-. (poãemos não usar uma classe ,.--,., de teste separada, por c lass Triangle ( estarmos tentando economizar ..-., d oub le area ; espa ço na pági na ~ ) in t hei g ht; "Saída i nt length; ~ public s t atic void main(String [) a r gs) { ,.--,., ...--.,. while ( ) { ,.--,., ,.--,., _ __ _ .heigh t (x + 1) * 2; _ _ _ _ . leng t h x + 4; " " System.out . p rint("triangl e "+x+" , area "); System . ou t. pr i nt l n(" = " + _ _ _ _ o a re al ; r-.Pergunta adicional! " ,Para tentar ganhar mais pontos, useos trechos da piscina para preencher x = 27; " Tr iangle t5 = ta(2); -"o que falta na saída (acima). ta( 2) . area = 343; .~ Sys t e m . out .print ("y " + y) ; System. ou t . pri n tl n (", t5 a rea " + t5. a r ea ); r-- J .~ ,.-- . vo i d s etAr e a ( ) ~ ...--.,. (he i gh t * length) / 2; : ~ " " Nota: Cada trecho de " código da piscina " usado mais de urna r"o 4, t5 a rea 18 .0 / ta .x . ar ea 4, t5 ar ea 343 .0 / ta [x) . area 27, t5 ar ea 18 . 0 x x + 1; 27, t5 area 343 . 0 x x + 2; ta . x ta[x) = setArea(); x x - 1; ta(x) int x; ta . x = setArea(); ta[x) r--. int y; 28 . 0 x < ta [x) . setArea () ; int x O; r-... 30 . 0 x < [ ) ta n ew Trian gle (4) ; int x 1; ta = new r J , int y x; ta = new Tri a n gle (); l [ ) ta = n ew t a[ x) = new Triangl e() ; "48 cap ituio 3
  • 75. variáveis primitivas e de referência Uma pilha de problemas Um programa Java pequeno está listado à direita. Quando a linha II executa algo for alcançada, alguns objetos e variáveis de referência terão sido criados. Sua tarefa é determinar que variáveis de referência apontarão para quais objetos. Nem todas as variáveis de referência serão usadas, e alguns objetos podem ser referenciados mais de uma vez. Desenhe linhas conectando as variáveis de referência aos seüs respectivos objetos. Dica: a menos que você seja mais esperto que nós, provavelmente terá que desenhar diagramas como os das páginas 55 e 56 deste capítulo. Use um lápis para poder desenhar e, em seguida, apague os vínculos das referências (as setas que vão do controle remoto da referência para um objeto). class HeapQuiz ( Variáveis de referência: Objetos HeapQuiz: int id = O; publi c static v o id main (String [] args ) int x = o · HeapQuiz [ ] hq = new HeapQuiz[5]; while ( x < 3 ) ( hq[x] = new HeapQuiz () ; hq[x] .id = x· x = x + l } hq [3 ] hq [1] ; hq [4] hq [1] ; hq[3] null; hq [ 4] hq [ O] ; hq [ O] hq [3] ; hq[31 hq [3] hq [2 ] ; hq [2] hq [O] ; II executa algo conecte cada variável de referÊncia hq[41 com 0(5) respe ccivo ( s) objeto(s} Tal vez você nào precise usar todas as :re f erências. o caso das referências roubadas Era uma noite escura e chuvosa. Tawny caminhava para a cela dos programadores como se fosse proprietária do local. Ela sabia que todos os programadores ainda estariam trabalhando e queria ajuda. Precisava de um novo método adicionado à classe principal, que devia ser carregada no novo celular Um pequeno altamente secreto e habilitado com Java do cliente. O espaço na pilha de memória do celular estava tão apertado quanto o vestido de Tawny, e todo mundo sabia disso. O murmúrio normalmente rouco na mistério ~~.. cela silenciou quando Tawny se encaminhou para o quadro branco. Ela desenhou uma visão resumida da funcionalidade do novo método e lentamente examinou a sala. "Bem meninos, hora de trabalhar", murmurou. "Quem criar uma versão para esse método que use a memória mais eficientemente irá comigo à festa de lançamento do cliente em Maui amanhã ... Para me ajudar a instalar o novo software." Na manhã seguinte, Tawny entrou na cela usando seu curto vestido Aloha. "Senhores", ela sorriu, "o avião parte em algumas horas, mostrem-me o que vocês tem!" Bob foi o primeiro; quando ele começou a desenhar seu projeto no quadro branco Tawny disse: "Vamos direto ao ponto Bob, mostre-me como você manipulou a atualização da lista de objetos de contato." Bob escreveu rapidamente um fragmento de código no quadro: Contact [] ca = new Co ntact[10]; while I ( x < 10 ) ( I I cria 1 0 obj etos de contato ca [x] = new Contact ( ); x = x + 1; II executa complicada atualização da lista de objetos Con~act com ca "Tawny, sei que temos pouca memória, mas suas especificações diziam que tínhamos que ser capazes de acessar informações específicas de todos os dez contatos permitidos, e esse foi o melhor esquema que pude criar", disse Bob. Kent foi o próximo, já imaginando coquetéis de coco com Tawny. "Bob", ele disse, "sua solução é um pouco complicada não acha?" Kent sorriu, "Dê uma olhada neste bebezinho": Cont a ct refc; whil e ( x < 1 0 ) ( II make 1 0 c o ntact objects r e f c = new Cont ac t (); ~I x = x + 1; II e x e c ut a complicada at u ali z aç ã o da lista de o bje t os Cont a ct c o m r e f c "Economi.zei-muitas-vaF~ávsi-s-Ele referência q-ue usariam mem.Ó!::h:1-,-BGbiz-i..Rho, po.!=tfl!lt-o, OQdel!Jlardar seu orotetor solar". 2:0Z0U Kent. "Não tão rápido, Kent!", disse Tawny, "você economizou um pouco de memória, ~as é Bob que ve~ comigo". . ~ Por que Tawny escolheu o método de Bob e não o de-Kent, se o de Kent usava menos memória? você está aqui .. 49-.._--- - - _J
  • 76. """" ,.-... ----, ----, soluções dos eX6tCCI..!.:> --. Soluções .-dos Exercícios - - - _. - -----····- -------- - c ~ I cIa~s BOO~S {_ -rn::-re;- ~._. I Str ing au th or ; " ~ cIass BooksTestDrive ,.-... pub1 ic static vo id main(String [] arg s) Books [] myBooks = new Books[3]; código: int x = O; r-.. cIas s TestArrays { myBooks[O] new Books(); Lembre-se: temos que criar pubIic static void main (String [] args) { myBooks[l] new Books(); realmente os objetos Book! " int [] index = new in t [4]; myBooks[2] new Books(); r-.. index [ O] 1; myBooks [O] . t i tl e "The Grapes of Java"; index [ 1] 3; myBook s[l].title = "The Java Gatsby"; r--.. index[2] O; A myBooks [2] . titIe = "The Java Cookbook"; index[3] 2; myBooks [O] . author "bob " ; "" Str ing [] isI ands = new String[4] ; myBooks[l].author "sue"; isIands [O] isI ands[ l] "Ber muda"; "Fiji" ; myBooks [2] . au t hor while (x < 3) { "ian" ; " i sIands [2] "Azores" ; System.out.print(myBooks[x] . title ) ; " isIands[3 ] "Cozumel"; System . out . print (" by ,,); int y = O; System.out.println(myBooks [x ] . autho r); " int ref; x = x + 1; whiI e (y < 4 ) { " ~ ref = index [y] ; System.out.print("island = "); r--.. Sys tem . out .prin tln(i s lands[ ref] ) ; y = y + 1; cl ass Hobbits { r-.. Str i ng n ame; public static vo i d main(String [] args) -, Hobbits [ ] h = neW HOrb~b~i~ t~s~[~3~ __________~____- , ]~; int z = -1 ; Lembre-se : as matrizes """" Soluções dos quebra-cabeças while (z < 2) começam com o elemento O! z = z + 1; h[z ] = new Hobbits(); h[z] . name = "bilbo"; " if (z == 1) { o caso das referências roubadas 8 h[z] . name = " fr odo"; r--.. Tawny percebeu que o método de Kent tinha uma if (z == 2) { " r--.. falha séria. É verdade que ele não usou tantas h[z] .name = "sam"; variáveis de referência quanto Bob, mas não havia r-- como acessar nenhum dos objetos Contact que esse System. out . print(h[z] . name + " is a ,, ) ; Syst em. out . println (" g ood Hobbit name"); método criava, exceto o último. A cada passagem do " loop, ele estava atribuindo um novo objeto à variável de referência, portanto, o objeto referenciado " ,...., anteriormente era abandonado na pilha - inalcançável. Sem acessar nove dos dez objetos class Triangle { double area; ,...., criados, o método de Kent era inútil. int he igh t; int length; (O software foi um grande sucesso, e o cliente deu a Tawny e Bob pub1ic static void main(String [] args) uma semana a mai s no Havaí. Gostaríamos de lhe dizer que, ao int x = O; " terminar este livro, você também conseguirá coisas desse tipo .) Triang1e [ ] ta = new Triang1e[4]; while ( x < 4 ) { " -õ ;·· · variávei s de referência: Objetos HeapQuiz: ta[x] = new Triangle(); """" ta[x] . he ight = (x + 1 ) * 2 ; :,:; ta[x] . l eng th = x + 4; " . I ta[x] .setArea(); System.out . print("triangle "+x+" , area "); r-- .~ J System . out.println(" = " + ta[x] .ar ea); ,-., hq[ O] x = x + li " int y = x; x = 27 ; " Trianqle tS = ta [2]; ,...., ta[2 ] . area = 343; System . out.print( "y = " + y); System . out .pr intln(", tS area "+ tS . area); " _J vo id- setArea() { area = (height * length) / 2; " ,., ; " --:r ...-... :;~. ~
  • 77. ~ - - 4 os métodos usarn variáveis de instância r ,,-.... ,,-... Como os Objetos ,,-... .,..-... se Comportam ,--. r o estado afeta o comportamento, o comportamento afeta o estado. Sabemos que os objetos têm estado e comportamento, representados pelas variáveis de instância e métodos. Mas, até agora, não examinamos como o estado e o comportamento estão relacionados. Já sabemos que cada instância de uma classe (cada objeto de um tipo específico) pode ter seus próprios valores exclusivos para suas variáveis de instância. O cão A pode ter o nome "Fido" e peso de 37 quilos. O cão B se chama "Killer" e pesa 5 quilos. E se a classe Cão tiver um método emitirSom( ), bem, você não acha que um cão de 37 quilos latirá um pouco mais alto do que o de 5 quilos? (Supondo que o som incômodo de um ganido possa ser considerado um latido.) Felizmente, isso é o que há de importante em um objeto - ele tem um comportamento que atua sobre seu estado. Em outras palavras, os métodos usam os valores das variáveis de instância. Por exemplo: "Se o cão pesar menos de 8 quilos, emita um ganido, caso contrário ..." ou "aumente o peso em 3 quiios". A/Ceremos aiguns estados! _. este é um novo capítulo 51..... _---- f
  • 78. ,.....,. """--os objetos possuem estado e COiliportamento " ,.....,. ,.....,.Lembre-se: uma classe d~sç!eve_ o qUf? um """"objeto conhece e o que ele faz ,.....,. Song jUma classe é o projeto de um objeto. Quando você criar uma classe, variáveis de t i tle r-estará descrevendo como a JVM deve criar um objeto desse tipo. Você já instância conhece (estado) artistsabe que todo objeto desse tipo pode ter diferentes valores para as /""o..variáveis de instância. Mas e quanto aos métodos? setTitle( ) r métodos setArtist( ) fazCada objeto desse tipo pode ter um método com (COllPortamento) play( ) I~: ,.....,.comportamento diferente? - I ----...Bem ... Mais ou menos. * c inco instâncias da cla s se Song r--.Todas as instâncias de uma classe específica têm os mesmos métodos,mas eles podem se comportar diferentemente com base no valor das ,--..,variáveis de instância.A classe Song tem duas variáveis de instância, title e artist. O método "- .<play( ) reproduz uma canção, mas a instância em que você o chamar "- >/,reproduzirá a canção representada pelo valor da variável de instância title(título) dessa instância. Portanto, se você chamar o método play( ) em .uma instância, reproduzirá a canção "politik", enquanto outra instância "- , ~reproduzirá "Darkstar". O código do método, porém, é o mesmo. ~ I void play() ( "- soundPlayer .pl aySound(title); ,.~ Chamar pla y( ) nessa ,.--.., ~ instância fará com que u Song t2 = new Song(); "Sing seja~p r~i J t2 .setArtist( "Travi s" ); ~:~; ./ t2.setTitle("Sing"); Song s3 = new Song(); s3.setArtist("Sex Pistols"); s3.setTitle("My Way");*Sim, outra resposta surpreendentemente clara! ê Song t2.play( ); ~ .- }1 s3 - Song s3.play( }; Chamar play( ) nessa instância fará com que "~ty Way" seja reproduzida . (ma s não com O Sinatra)o tamanho afeta o latidoo latido de um cão pequeno é diferente do de um cão grandeA classe Dog tem uma variável de instância size (tamanho), que ométodo bark( ) usa para decidir que tipo de som emitir para o latido. class Dog ( int sizei String name; , Dog Lata Diferente void bark () { i i f (size > 60) ( size System.out.println("Wooof! Wooof!"); name ,; else if (size > 14) { bark( ) : System. out . println ("Ruff ! Ruff ! " ) ; else ( k - System . out.println("Yip! Yip ) ;52 capítulo 4 ----------------------- 1
  • 79. os métodos usam variáveis de instância c la s s DogTestDrive { public static void ma i n (String[] a r gs) ( Dog one = new Dog(); one .s ize = 70; Dog two = new Dog(); two.size ·· = 8 ; Dog three = new Dog() ; thre e. size = 35 ; o n e . bark () ; two.bark(); three.bark(); Você pode enviar valores para um método Como é de se esperar de qualquer linguagem de programação, você pode passar valores para seu método. Pode, por exemplo, querer informar a um objeto Dog quantas vezes latir chamando : d.bark(3); Dependendo de sua experiência em programação e preferências pessoais, você pode usar o termo argumentos ou talvez parâmetros para os valores passados para um método. Embora essas sejam distinções formais na ciência da computação que pessoas que usam jalecos e que quase certamente não lerão este livro fazem, temos coisas mais importantes com que nos preocupar aqui. Portanto, você pode chamá-los como quiser (argumentos, donuts, bolas de pêlo, etc.), mas usaremos essa convenção: Um método usa parâmetros. Um chamador passa argumentos. Os argumentos são os valores que você passará para os métodos. Um argumento (um valor como 2, "Foo" ou uma referência que aponte para um objeto Dog) será inserido diretarnente em um ... Adivinhe ... Parâmetro. E um parâmetro nada mais é do que uma variável local. Uma variável com um tipo e um nome, que poderá ser usada dentro do corpo do método. Mas aqui está a parte importante: se um método usar um parâmetro, você terá que passar algo para ele. E esse algo deve ser um valor do tipo apropriado. Dog d = new Dog( )i ~ Chame o método bark na variável de referência Dog er passe o va lor 3 (como o argumento do método) . d.bark(3)i ~ Os bits que repr esentam o valor int 3 serão dist ribuídos para o método bark .r parâme tro vo id bark(int numOfBarks) { / while (numOfBarks > O) { System.out.println("ruff H ) ; numOfBarks = numOfBarks - 1; ~ Os bits serão inseridos no parâmetro numOfBarks (uma v ari áve l de tamanho in t) . ~ Use o parâmetro numOfBar ks como uma v a riáve l no código do método . Você pode fazer valores serem retornados por um método você está aqui ii>- 53
  • 80. vários argumentos void go () (Mas podemos declarar um método que retorne um tipo específico devalor para o chamador, como em: int giveS e cret () return 42 ;Se você declarar um método que retorne um valor, terá que retornar umvalor do tipo declarado! (Ou um valor que seja compatível com o tipodeclarado. Nós nos aprofundaremos mais nisso quando falarmos sobrepolimorfismo nos capítulos 7 e 8.)o que vocêdisser que retornará é bom que sejamesmo retornado! I I. n . 1::. o compilador não permi t irá que você retorne o t i po errado de c oisa. int theSec = life.giveSecret();Es ses t ipos devem~ Os bits que r epresentam 42 ~ ints er iguais s ã o ret o rnados pelo método giveSe ret() { g i veSecr et( ) e inseridos na -.-l ess e valor variável chamada tneSecret. return~ preci s a caber } em um in t !Você pode enviar mais de um valor para um métodoOs métodos podem ter vários parâmetros. Separe-os com vírgulas ao declará-los e separe os argumentos comvírgulas ao passá-los. O mais importante é que se um método tiver parâmetros, você deve passar argumentosdo tipo e na ordem canetas. ~ ~Chamando um método de dois parâmetros e enviando dois argumentos para ele. r" v oid go () ( -7 TestStuff t = new TestStuff(); r--.. l~ t. takeTwo (12, 34); Os argumentos serão inseridos na mesma ordem r--.. ~ ~ em que você os p a ssar. O primeiro argUloen t o ~ I. será inserido no primeiro parâmetro, o segundo argUlnento no segundo parâmetro e assim por diante. " void t akeTwo( int x, int y ) ( int z = x + y; " Systern . out.println("Total is " + z); r"Você pode passar variáveis para um método, contanto que o tipo da variável seja igual aotipo do parâmetro. vo i d go () { Os valores de foo e bar serão inseridos nos int foo = 7 · parâmetros x e y. Portanto, agora os bits de . int bar = 3; .} UakeTwo "0 b, x serão idênticos aos de foo (o padrão àe bits do inteiro 7) e os bits de y serão idênticos aos de bar . void takeTwo(int x , int y) { Qual é o val or de z? O resultado será o in t z = x + y; mesmo que voc ê obteria se somasse fao + b ar Sys tern . o u t . println ( " To tal is " + z ) ; ao passá-los p ara o método takeTwo54 capítulo 4
  • 81. os métodos usa.!l variáveis de instância o Java passa por valor. Isso significa passar por cópia. .. ~ int x 7, · o Declare uma var iável int e atribua a ela o valor 7 . O padrão de bits do número 7 será inser i do na variável chamada x . int v oid go(int z) { } fi int Declare um método com um parâmetro in t chamad o z . Chame o método go( ), passando a var i ável x como argumento . Os bits de x serão c opiados, e a cóp ia s erá inser ida e m z . int int TO O. g o (x) ; vo i d g o( i nt z ) { } x não ser á al t erado, me smo ser z f or .·...,.t!! -- • Altere o valor de z dentro do método . O val o r de x não se rá a ltera do ! O argumento passad o para o p arâmet ro z era ape n a s uma cópia de x .i--, int int O mét odo não pode alterar os bits que estav am na variáve l x que o chamou .I"• void go(int z)t-" z = O;~tr-I~ Não existem Perguntas Idiotas1 P·. o= que aconteceria se o argumento que você quisesse passar fosse um objeto em vez de uma variável primitiva? R: Você aprenderá mais sobre isso em capítulos posteriores , mas já sabe a resposta . A Java passa tudo por valor. Tudo. Porém ... Valor significa os bits existentes na variável. E lembre-se de que você não pode inserir objetos em variáveis; a variável é um controle remoto -- uma referência a um objeto. Portanto, se você passar a referência de um objeto para um método, estará passando uma cópia do controle remoto. Mas fique atento, temos muito mais há dizer sobre isso. P: valor? Um método pode declarar diversos valores de retorno? Ou há alguma maneira de retornar mais de um .~- r ! t( : Mais-;u ~en~s.·-U~ -método pode declarar somente um· valor de retorno. MAS ... Se -você qu iser retornar, ,""" digamos, três valores int, então, o tipo de retorno declarado pode ser uma matriz int. Insira esses tipos int dentro da •.,r- ..:., você está aqui >- 55~~ ...........--------------------------------------------------------------------------------------
  • 82. - argumentos e valores de retorno matriz e retorne-a . É um po~-º. mais complicado retornar diversos va lores com tipos diferentes; falaremos sobre isso em um capítulo posterior quando discutirmos o objeto ArrayList. P: Tenho que retornar o tipo exato que declarei? Lembrete: O Java R: Você poderá retornar qualquer coisa que possa ser um byte elevada a esse tipo. Portanto, pode passar implicitamente acha o tipo onde um int for esperado. O chamador não se importará , porque o importante! byte caberá perfeitamente no int que ele usará para atribuir o resultado. Você deve usar uma conversão explícita quando o tipo Você não pode retornar uma declarado for menor do que o que você estiver tentando retornar. Girafa quando o tipo de retorno for declarado como um P: Tenho que fazer algo com o valor de retorno de um método? Posso apenas ignorá-lo? Coelho. O mesmo ocorre com os parâmetros. Você não pode passar uma Girafa para R: O Java não exige que o valor de retorno seja usado. Você pode querer chamar um método com um tipo de retorno que não um método que use um Coelho. seja nulo, ainda que não se importe com o valor de retorno. Nesse caso, estará chamando o método pelo que ele executa internamente, em vez de pelo que retorna. Em Java, você não precisa atribuir ou usar o valor de retorno. r - - - - - DISCRIM INAÇÃO DOS PONTOS - As classes definem o que um objeto conhece e o que ele faz. - Os valores passados para dentro e fora dos métodos podem ser elevados implicitamente a um tipo maior ou convertidos - As coisas que um objeto conhece são suas variáveis de explicitamente para um tipo menor. instância (estado). - O valor que você passar como argumento para um método - As coisas que um objeto faz são seus métodos (comportamento). pode ser literal (2, c, etc.) ou uma variável com o tipo de - Os métodos podem usar variáveis de instância para que parâmetro declarado (por exemplo, x onde x for uma variável objetos do mesmo tipo possam se comportar diferentemente. int). (Há outras coisas que você pode passar como argumentos, mas ainda não chegamos lá.) - Um método pode ter parâmetros, o que significa que você pode passar um ou mais valores para ele. - Um método deve declarar um tipo de retorno. Um tipo de retorno void significa que o método não retorna nada. - A quantidade e o tipo dos valores que você passar devem corresponder à ordem e tipo dos parâmetros declarados - Se um método declarar um tipo de retorno que não seja void, pelo método. deve retornar um valor compatível com o tipo declarado. Coisas interessantes que você pode fazer com os parâmetros e tipos de retorno Agora que vimos como os parâmetros e tipos de retorno funcionam, é ElectricGuitar hora de lhes darmos alguma utilidade prática: os métodos Getter e brand 1 Nota: usar essas ---- Setter. Se você quiser ser formal com relação a isso, pode preferir numOfPickups( ) ~ convenções de chamá-los de acessadores e mod(ftcadores. Mas desperdiçaria sflabas. nomeação .--..., rockStarUse slt ~1 Além do que, Getter e Setter se enquadram na convenção de nomeação si.gnifica que getBrand( ) você est a rá Java, portanto, é assim que os chamaremos. /~ setBrand ( ) segtd.ndo um Os método Getter (de captura) e Setter (de configuração) permitirão que getNumOf Pickups ( ) ~ importante você, bem , capture e cOl~flgure coisas . Geralmente variáveis de instância. setNumOfPi ckups ( ) pa.drão r)a,Vâ.J ,,~ getRockSta rUseslt ( ) A única finalidade de um método de captura é enviar, como valor de retorno, o valor do que quer que esse método de captura específico setRockStarUs eslt . ,,,.; ,~ ( ) - ~ " captu re. Portanto, não é surpresa que um método de configuração só ex ista para esperar a chance de receber o valor de um argumento e usá-lo para cOl ~fig urar uma variável de instânci a. 56 capitu lo 4
  • 83. os métodos usam variáveis de instância cIass EIectricGuitar String brand ; int numOfP i ckups ; boolean rockStarUsesl t ; String getBrand() return brand; void setBrand(String aBrand) I brand = aBrand ; 1-" Ir- int getNumOfPickups() ( re turn numOfPickups; void setNumOfP i ckups(int nUm) ( numOfPickups = num; boolean getRockStarUseslt() II""" return rockStarUseslt; void setRockStarUse slt(boolean yesOrNo) ,r- I rockStarUseslt = yesOrNo; I I r- Encapsu lamento Use-o ou arrisque-se a ser humilhado e ridicularizado. Até esse momento tão importante, cometemos uma das piores falhas na 00 (e não estamos falando de violações menores como não usar B maiúsculo em BYOB). Não, estamos -I falando de uma Falha com F maiúsculo. I,......, rf Qual foi nossa transgressão vergonhosa? I,....... Expor nossos dados! 1-- Aqui estamos nós, apenas seguindo em frente sem sequer nos importarmos em deixar lI""" nossos dados expostos para que todos vejam e até mesmo mexam. I- Talvez você já tenha experimentado esse sentimento vagamente inquietante que surge I .)" , quando deixamos nossas variáveis de instância expostas . I~ Exposto significa alcançável através do operador ponto, como em: theCat.height = 27; Pense nessa idéia do uso de nosso controle remoto para fazermos uma alteração direta na variável de instância do tamanho do objeto Cal. Nas mãos da pessoa errada, uma variável de referênci a (controle remoto) seria uma arma bem perigosa. Porque nada impediria isso: theCat.height = Oi ( - - - - - opa! Não podemos deixar isso acontecer! Seria péssimo. Precisamos construir métodos de configuração para todas as variáveis de instância e encontrar uma maneira de forçar os outros códigos a chamarem esses métodos em vez de acessar os dados diretamente.I~ publ i c void setHeight (int ht) { Inserimos verificações para garantir uma if (ht > 9) { ~-----------------------------------­ altura mínima para o objeto Caé. height = ht;T~ i0 Ao forçar todos os códigos a cllaIllã.z-em uzn método de cOllfigura r;ão, I ~~de::r!c;; pr?t"3g~r o o .bj-:to C~t- de alterações inaceitáveis no tamanho ..1 I você esta aqui ~ 57J,-,-""" -
  • 84. desenvolvedores profissionais ",S;:,;,,, ) :" C;:.;)SU,.~ i ··~ · te)Oculte os dadosSim, é muito simples passar deuma implementação que esteja ---.- f; --------- A . 0 Tudo sobre o Java 1pedindo para receber dados /~ Entrevista desta semana: Iinválidos para uma que proteja Um objeto abre o jogo sobre o encapsulamento.seus dados e seu direito de altení-la posteriormente. Use a Cabeça!: Qual é o grande problema do encapsu lamento?Certo, então como exatamenteocultar os dados? Com os Objeto: Certo, você conhece aquele sonho em que está fazendo uma palestra para 500modificadores de acesso public e pessoas quando subitamente percebe estar nu?private. Você está familiarizado Use a Cabeça!: Sim, já aconteceu conosco. É semelhante àquele da máquina Pilates e ...com public - ele foi usado em Bem, isso não importa. Certo, então você se sente nu . Mas além de estar um poucotodos os métodos main. exposto, há algum perigo?Aqui está uma regra prática inicial Objeto: Se há algum perigo? Algum perigo? [começa a rir] Ei, instâncias, ouviram isso,para o encapsulamento (todas as "Há algum perigo? ", ele pergunta? [rola de tanto rir]isenções de responsabilidadereferentes às regras práticas são Use a Cabeça!: Qual é a graça? Me parece uma pergunta sensata.aplicáveis): marque suas variáveis Objeto: Certo, vou explicar. É que [não consegue controlar o riso novamente]de instância com private e forneçamétodos de captura e configuração Use a Cabeça!: Posso pegar algo para você? Água?públicos, para ter controle sobre o Objeto: Uau! Nossa. Não, estou bem . Falarei a sério. Vou respirar fundo. Certo. Prossiga.acesso. Quando você conhecermelhor o projeto e a codificação Use a Cabeça!: Então, de que o encapsulamento o protege?em Java, provavelmente fará as Objeto: O encapsulamento cria um campo de força ao redor de minhas variáveis decoisas de um a forma um pouco instância, portanto, ninguém pode configurá-las com, digamos, algo inapropriado.diferente, mas, por enquanto, essaabordagem o manterá seguro. Use a Cabeça!: Você pode citar um exemplo? Objeto: Não é preciso ser um PhD. A maioria dos valores das variáveis de instância é codificada com certas definições sobre seus limites. Por exemplo, pense em todas as cclisas .Márque as variáveis de que não funcionariam se números negativos fossem permitidos. A quantidade de banheiros .instâncía coní private. de um escritório. A velocidade de um avião. Aniversários. O peso de halteres. Números de celular. A potência de fornos de microondas. Marque os métodos de Use a Cabeça!: Entendo o que você quer dizer. E como o encapsulamanto permite a corrflguh3çãoe captura definição de limites? com public. Objeto: Ao forçar os outros códigos a passarem por métodos de configuração. Dessa forma, o método de configuração pode validar o parâmetro e decidir se é viável. Ele poderá"Infelizmente, Bill se rejeitá-lo e não fazer nada ou lançar uma exceção (por exemplo, se houver um número deesqueceu de encapsular sua CPF nulo em um aplicativo de cartões de crédito) ou ainda arredondar o parâmetro enviadoclasse Cat e acabou com umgato gordo." para o valor mai s próximo aceitável. O importante é o seguinte: você pode fazer o que(Ouvido n o bebedouro.) quiser no método de configuração, contanto que não faça nada se suas variáveis de instância forem públicas. Use a Cabeça!: Mas às vezes vejo métodos de configuração que simp lesmente configuram o valor sem verificar nada. Se você tiver uma variável de instância que não tenha um limite, esse método de configuração não geraria uma sobrecarga desnecessária? Um impacto no desempenho? Objeto: O importante nos métodos de configuração (e também nos de captura) é que você pode mudar de idéia posteriormente, sem travar o código de ninguém! Imagine se metade das pessoas da empresa usasse sua classe com variáveis de instância públicas e um dia você percebesse, de repente, que "opa - há algo que não planejei para esse valor, terei que passar para um método de configuração". Você travaria o código de todo mundo. O interessante no encaps ul amento é que você pode mudar de idéia. E ninguém é prejudicado. O ganho no desempenho pelo uso das variáveis diretamente é tão pequeno que raramente vale a pena, se é que vale.58 capi tulo 4
  • 85. """ os métodos usam va riá veis de in stâ ncia ,-.. Encapsulando a classe GoodOog ,-.. class GoodDog { GoodDog Torna a va.= iavel de private int size; ~(~----------------------------------- inscância p~jvad~. size/--- public int getSize (),[ getSize( )Ir-- return sizei T0rna os métodos de captura e configuração ~blicos. setS ize( )I ........ bark( ) public void setSize (in t s) ( . -~ --".. size -= s;1~ void bark() {1".-... Ainda que os métodos não if (size > 60) { System. out . println ("Wooof! Wooof!"); adici onem realmente uma neva else if (size > 14) { funcionalidade, o interessante System . out .println ("Ruff! Ruff) ; é ~Je você pode mudar de idéia e lse ( pos teri ormente. Pode voltar e System . out . println("Yip! Yip ); tcrnar um método mais seguro~ mais rápido e melhor. class GoodDogTestDrive { Qualquer local onde um valor . específico puder ser usado, uma public static vo id main (String[] args ) ( GoodDog one = new GoodDog(); chamada de-método que retorne o ne.setSize(70) ; esse tipo poderá ser empregada. GoodDog two = new GoodDog () ; two .se tSize(8) ; em vez de: System.out.println ("Dog one : " + one.getSize ()) ;, System . out . print ln(" Dog t wo : " + t wo . getSize()); int x =3 + 24; você pode usar:i:I one . bark( ) ; t wo . bark(); int x = 3 + one . getSize( ) ;i-i!".-... Como os objetos de uma matriz se comportam?~1,..... Exatamente como qualquer outro objeto. A única diferença é como você os capturará. Em outras palavras,I:I" como será o controle remoto. Tentaremos chamar métodos nos objetos Dog de uma matriz,:..._ - - - - - -__ ~ Dec lare e crie uma matri z Dog, que tenha 7 referências Dog . . f Ir Dog[] pets ; pets = new Dog[7]; 1 2 3 4 5 Dog Dog Dog Dog Dog Dog objeto de matriz Dog (Dog[ ]) Dog[] pets [O] new Dog () ; pets[l] new Dog() ; ______ l~I~I~ l?IQI~l~. l ) ~~~ DO~Og/ peL:::;[O] . :seLSt-z-e(--:3U-) ; int x = pets[O] . getSize() ; pets[11 . setSize(8) ; Dog[] --_ _ _ _ _ ~_ --._------- _ Dog Dog Dog objeto de mat riz Dog (Dog[ ]) ..... você 83té aqui .~ 59 ,-
  • 86. - inicializando variáveis de i n s ti~f)ci êj ,-..., Declarando e inicializando variáveis de instância Você já sabe que uma declaração de variável precisa de pelo menos um nome e um tipo: int size; String name; E sabe que pode inicializar (atribuir um valor) a variável ao mesmo tempo: int size = 420; String name = "Donny"; Mas se você não inicializar uma variável de instância, o que acontecerá quando chamar um método de captura? Em outras palavras, qual será o valor de uma variável de instância antes de você a inicializar? class PoorDog { Declara duas variá,reis de ".1 private int size; ( ---------------------------------------- instância mas não atribui J private String name; (~----------------------------------- um valor public int getSize() return sizei o que esses métodos retornarão? public String getName() . ~ return name; ..-... :$ 51 ,..-, 1 , public class poorDogTestDrive { public static void main (String[] args) PoorDog one = new PoorDog ( ) ; O que voe€! System.out . println("O tamahho do cão é " + one.getSize()); ( - - - acha? Isso sera System.out.println("O nome do cão é " + one.getName()); (fl----------- compilado? ~: . ...,. Não €i preciso inicializar variáveis de instâ.ncia r elaB semp::$ têm um V"ê..lor padrão~ J:.JÚln.eros prim3.ti·Jos porque " . ( inclusive do tipo cha..:r) recebem o valer 0$ booleanos recebem fa1.so € variá:Fsis de referê.ncia de objeto ficam. com valor nulo~ (LemJ::J:.re~se de que nulo significa apenas um controle remoto que não e.stá controlando/programado para nada~ É Q~~ :referênci2~. porém sem 1..00 objeto real .. ) A diferença entre variáveis de instância e locais As variáveis de instância são declaradas dentro de uma classe, mas não dentro de um método . class Horse { private double height 15.2; private String breed; II mais código. As variáveis locais NÃO recebem um valor padrão! As variáveis locais são declaradas dentro de um método. O compilador reclamará se você tentar usar uma class AddThing variável local antes dela int a; ser inicializada. int b = 12; public int add ( ) 1 "" -1 " A int total = a + b; ,r-. .~ return total; ) r ~. .............. -.1 - -]. 7 60
  • 87. os métodos usam variáveis de instância As variáveis loca is DEVEi] se r ini ci ali z adas antes de s er usadas! class Foo ( public void go() { int x · Não será compiLado! v-ocê pode declarar Jl sem ~ _______________________________ um v alor, mas r assim qu e tentar USÁ~LO$ o j~ int z = x + 3 ; compiLador ficará confuso. I I"" I I" I~ r- Não existem. Perguntas Idiotas 1= P: E quanto aos parâmetros do método? Como as regras sobre variáveis locais se aplicam a eles? R: Os parâmetros dos métodos são praticamente iguais às locais -- são declarados dentro do método variáveis (bem, tecnicamente eles são declarados na lista de argumentos do método em vez de dentro do corpo dele, mas ainda são variáveis locais e. não variáveis de instância) . Porém nunca serão inicializados, e você nunca verá uma mensagem de erro do compilador informando que uma variável de parâmetro não foi inicializada. Mas isso ocorre porque o compilador exibirá uma mensagem de erro se você tentar chamar um método sem enviar os argumentos de que ele precisa. Portanto, os parâmetros são SEMPRE inicializados, já que o compilador garante que esses métodos sejam sempre chamados com argumentos que correspondam aos parâmetros declarados para eles, e os argumentos são atribuídos (automaticamente) aos parâmetros. I~ Comparando variáveis (primitivas ou de referência) Haverá situações em que você pode querer saber se duas variáveis primitivas são iguais. Isso é muito fácil, basta que use o operador = =. Em outras, pode querer saber se duas Use = = para comparar variáveis de referência apontam para o mesmo objeto da pilha. Também é fácil , use o duas variáveis primitivas r~ I operador = = . Mas você pode querer saber se dois obj etos são iguais. E para fazer isso, ou saber se duas precisará do método .equals( ). A idéia de igualdade no que diz respeito a objetos depende referências apontam para do tipo de objeto. Por exemplo, se dois objetos String diferentes tiverem os mesmos o mesmo objeto. caracteres (digamos, "ativo"), serão sign ificati vamente equivalentes, independentemente de serem dois objetos di stintos da pilha. Mas e quanto a um Cão? Você vai querer tratar dois Use o método equals( ) Cães como se fosse m iguais se, por acaso, tiverem 6 mesmo tamanho e peso? para saber se dois objetos Provavelmente não . Portanto, o fato de dois objetos diferentes serem tratados como se diferentes são iguais. fossem iguais dependerá do que for relevante para esse tipo de objeto específico. (Como dois objetos String Examinaremos a noção de ig ualdade entre obj etos novamente em capítulos posteriores Ce no diferentes representando os Apêndice B), mas, por enquanto, temos que saber que o operador = = é usado apenas para caracteres de "Fred".) comparar os bits de duas variáveis. O que esses bits representam não interessa. Eles são iguais ou não. Para comparar duas variáveis primitivas, use o operador == o operador = pode ser usado para comparar duas variáveis de qualquer tipo, e ele comparará apenas os bits. A instrução if (a= =b) ( ... ) examinará os bits de a e b e retornará verdadeiro se o padrão de bits for o mesmo (porém ela não verificará o tamanho da variável, logo, os zeros do lado esquerdo são ilTelevantes). (há mais zeros no lado esquerdo do número inteiro, mas isso não únpoz·t " aqu i) int a = 3;L_ byte b = 3; os padrões de bits sào os:..... if (a = = b) ( II verdadeiro) mesmos r portanto, essas duasi usa.rm:os "Z = int byte você está aqui»> 61 r-- ---------------------------------------
  • 88. igualdadePara saber se duas referên~i.as ~~~~guail? (o que si9.:lifi~ª-q~~e_elas --- Os p adrões de bits --S""i!3- os mesmos para a.referenciam o mesmo objeto da pilha) use o operador = = e C J po=tantc, serãoLembre-se de que o operador = = só leva em consideração o padrão de bits da variável. Asregras serão as mesmas, sendo a variável uma referênci a o u um tipo prirrlitivo. Portanto, ooperador = = retornará verdadeiro se duas vari áveis de referênc ia apontarem para o mesmo O"iguais se usarmos = = ~objeto Nesse caso, não saberemos qual é o padrão de bits (porque não depende da JVM e essa ~ .info em,ção ",ta," oco ta), m" ,"bemo, qu" q""qu,, qoe~fei;~c~, q:;;~:;;;:: ~om o m"nw ob}"o. f.1: : "i, m6 o me,"", pom duo.< / ( , , - ,-.. Foo c a; .- ~:!: O ~ a , ~ :- :ii 1: :: ;! ;; ;:~meiro) :: :::::do,ro ;: ~ foo o Jav-a As rOSas - Sao verme l has paSSar por valor é essa poesia é 1 PasSar Por . a eatoria cOP~a Oh, acha que d estúpido segu:~o e fazer melhor? Tente. subst· verso pel Substitua ~tua o Poema os seu própri nosso nunca o esquecera. ~nte~ro Por SUas , o. Melhor ainda propr~as palav ras, e você o que é válido? int a ca1cArea(7, 12); shor t c = 7; Dado o método a seguir, qu al das chamadas li stadas à direita ca1cArea(c,15) ; são váli das? Mantenha-se int d = ca1cArea(57) ; Insira uma marca de seleção próxima ca1cAre a(2,3 ) ; às c hamadas que forem válidas. 10ng t = 42; (Alg um3 s in stru ções só foram à direita int f ca1cArea(t,17); incluídas para atribuir os valores usados nas chamadas do método.) int g ca1cArea( ) ; ca1cArea() ; int ca1cl,rea ( in t heigh t, int width) ( return height * widt h ; byte h = ca1cArea(4 ,2 0); int j = calcArea( 2 ,3,5);62 sapituio 4
  • 89. os métodos usam variáveis de instância Seja o compilador Cada um dos arquivos Java dessa página representa um arquivo- fonte compl eto. Sua tarefa é personificar o compilador e determinar se cada um deles pode ser compilado. Se não puderem ser compilados, co mo você os corrigiria, e, se eles forem compilados, qual seri a sua saída? A B class XC opy ( class Cloc k { String time; public static void main(String [] args) ( void setTime (Str ing t) ( int orig = 42; time = t; XCopy x = new XCopy () ; void getTime () { int y x . go(orig) ; return time; System . ou t.print ln(orig + " " + y); class ClockTestDrive ( int go (in t arg ) { public sta t ic void main(String [] args ) ( arg = arg * 2 ; Clock c = new Clock(); return arg; c . setTime("124S"); String tod = c . getTime(); Sys tem. out .print l n("t ime: " + tod); Quem sou eu? Um grupo de componentes Java, vestidos a rigor, está participado do jogo, "Quem sou eu?" Eles lhe darão uma pista e você tentará adivinhar quem são, baseado no que disserem. Suponha que eles se mpre digam a verdade quando falam de si mesmos. Se por acaso disserem algo que . -.. possa ser verdadeiro para mai s de um deles, anote todos aos quais a frase possa ser aplicada . Preencha as linhas em branco próximas à frase com os nomes de um ou mais candidatos. Candidatos desta noite: Variável de instância, argumento, retorno, método de captura, método de configuração, encapsulamento, public, private, passar por valor, método Uma classe pode ter quantos quiser. _______________________________________ O método só pode ter um. _____________________________________________________________________________ Pode ser clevado implicitamen~. _________ _____ _________ ______________~ Prefiro minhas variáveis de instância privadas. Na verdade significa fazer uma cópia. _____ _________________________________ Só os métodos de configuração devem atualizá-Ios. _ _ __ __ __ _______________________ .Um m~odopode~rmui~sdcl~. _ _ _______ ____ __ _____ __ ______________~ r Retorno algo por definição. ________________ __________ ______________ Não devo ser usado com variáveis de instância. ___________________________ _______ Posso ter mu~o s ~gunlento s . _________ _ _____________ _____ _ _____________ .,,-... Por definição. uso Ulll argulnento. _____~~~~~~~~~~~-~~~~~~~---------------- ~udama c riaro encap s ulrunenw. -----------------------------_______ ____ Estou sempre sozinho. _____________________ _________________ _ _ _____ você está aqui 17 63•
  • 90. quebra-cabeças: rnensag&ns misturadas I":~­ JJJ1LPrOgrama Java. c urto está listado à sua di r~itJ.. Doi ~b tocQ~ d9--p....m.grmTIq estão faH~ndo. Seu desafio é comparar os blocos de código candidatos (a seguir) com a saída que vocêq;;;s Mensagens misturadas veria se eles fo ssem inseridos . Nem todas as linhas de saída serão usadas, e algumas delas podem ser usadas mais de uma vez. Desenhe linhas conectando os bl ocos de código candidatos à saída de linha de com ando correspondente. " " public c l ass Mix4 { int counter = o; public static void main(String [] args) { int count = o; Mix4 [] m4a =new Mix 4[20]; int x = o;Candidatos: Saídas possíveis: whi1e ( x < 9 index < 5 m4a[x] new Mi x4 (); k m4a[x ] .counter = m4a[x] . counter + 1; count c ount + 1 ; count count + m4a[x] .maybeNew(x); x = x + 1; System.out . println(count + " " + m4a[1].counter); pub1ic i nt maybeNew( i nt index) {. F~~~ x < 19 if ( 1 _ _ _ .... 1) Mix4 m4 = new Mix4(); m4 . counter = m4.counter + 1; re turn 1 ; return O;64 capítulo 4
  • 91. ~l~ os métodos usam variáveis de instância,-I Quebra-cabeças na PiscinaI~ Sua tarefa é pegar os trechos de código da piscina e inseri-los nas linhas emI branco do código. Você pode não usar o mesmo trecho mais de uma vez e!i .-., . não precisa empregar todos os trechos. Seu objetivo é criar uma Classe que seja compilada e executada produzindo a saída listada. public class Puzzle4 ( public static void main(String [ ) args) ( int y 1; int x O; int result = O; while (x < 6) ( y y * 10; Saída x = 6;1""-" while (x > O) (iI~!Ir" result result + I~ System.out . println("result " + result);i rI"" l~ class int ivari! ______ doStuff(int - - - -) (!--.. if (ivar > 100) ( return else ( return Nota : Cada trecho de código da piscina pode ser usado só uma vez! obs[xl . doStuff(factor); obs[xl . doS t uff(x); ivar + factor; Puzzle4 Xi ivar ivar * (2 + factor ) ; Puzzl e 4b x; factor ivar * (5 - factor); Puzzle4b( x; public ivar * factor; x = x + 1; obs[xl .ivar = y; private x = x-I; int obs [x l new short obs [ ) new Puzzle4b( new-l--- ~ 1;.<- .:.... . você está aqui ~ 65.irl _
  • 92. quebra-cabeças: um pequeno mistério Quando Buchanan encostou sua arma em Jai, ele congelou. Jai sabia que Buchanan era tão estúpido quanto feio e não queria assustar o grandalhão. Buchanan ordenou que ele entrasse no escritório de seu chefe, mas como Jai não tinha feito nada de errado (ultimamente), pensou que conversar com Leveler, o chefe de Buchanan, não seria tão ruim. Ele vinha movimentando Um pequeno muitos estimulantes neurais no lado oeste nos últimos tempos e achava que mistério ~~III!.. Leveler ficaria satisfeito. Estimulantes do mercado negro não geravam as maiores quantias que circulavam, mas eram inofensivos. A maioria dos viciados em estimulantes que ele conheceu desistiu após algum tempo e voltou à vida normal, talvez um pouco menos concentrada do que antes. O escritório de Leveler era um esconderijo de má aparência, mas quando Buchanan o empulTou para dentro, Jai pôde ver que tinha sido modificado para fornecer toda a velocidade e segurança extra que um chefe local como Leveler poderia esperar. "Jai meu caro", sussurrou Leveler, "bom te ver novamente". "A recíproca é verdadeira ... ", disse Jai, sentindo a malícia por trás do cumprimento de Leveler, "devíamos estar quites, Leveler, há algo que eu não saiba?" "Ah! Você está fazendo tudo direitinho, Jai, sua carga foi preenchida, mas tenho sentido, digamos, algumas falhas ultimamente ... " disse Leveler. Jai recuou involuntariamente, ele tinha sido um ótimo hacker no auge de sua caneira. Sempre que alguém descobria como burlar a segurança de um sistema, uma atenção indesejada se voltava para Jai. "Não fui eu meu caro", " disse Jai, "não vale a pena. Eu me aposentei das invasões, agora cuido dos meus próprios negócios". "Sim, sim", sorriu Leveler, "tenho certeza de que dessa vez não foi você, mas vou perder grandes margens de lucro até que esse novo hacker seja eliminado!" "Bem, boa sorte Leveler, me deixe aqui e eu conseguirei mais algumas unidades para você antes de terminar por hoje", disse Jai , "Receio que não seja tão fácil, Jai, Buchanan disse que agora você está trabalhando com a J37NE", insinuou Leveler. "A Edição Neural? É verdade que me divirto um pouco com ela, e daí?", Jai respondeu sentindo-se um pouco preocupado. "A edição neural é como deixo os viciados em estimulantes saberem onde poderão encontrar a próxima dose", explicou Leveler. "O problema é que algum viciado ficou sem o estimulante por tempo suficiente para descobrir como invadir meu banco de dados WareHousing". "Preciso de alguém que pense rápido como você, Jai, para examinar minha classe J37NE StimDrop; os métodos, as variáveis de instância, o conjunto todo, e descobrir como estão invadindo. Você terá ... ". "Ei!", exclamou Buchanan, "não quero nenhum hacker como Jai examinando meu código!", "Calma grandão", Jai percebeu uma chance, "Tenho certeza de que você fez um ótimo trabalho com seu modificador de aces .. ,", "Você acha mesmo, embaralhador de bits!", gritou Buchanan, "Deixei públicos todos os métodos usados pelos viciados, para que eles pudessem acessar os dados do site, mas marquei todos os métodos críticos do WareHousing como privados. Ninguém do ambiente externo pode acessar esses métodos meu caro, ninguém!" "Acho que posso identificar a falha, Leveler; o que diz de deixarmos Buchanan aqui e darmos uma volta pelo quarteirão", sugeriu Jai. Buchanan procurou sua arma, mas a mão de Leveler já estava em seu pescoço, "Deixe estar, Buchanan", sorriu Leveler, "Largue a arma e saia, acho que Jai e eu temos alguns planos a pôr em prática". De que Jai suspeitou? Ele conseguirá sair do esconderijo de Leveler com todos os ossos no lugar?66 4
  • 93. os métodos usam variáveis de instância Soluções dos Exercícios B class Clock { String time; void setTime (Str ing t) { Nota: os time = t; métodos de captura têm String getTime ( ) um tipo de return time; retorno por definição.A class ClockTestDrive { public sta tic void main (St ring [J args) (A classe XCopy será compilada e executada na Cl oc k c = new Clock();forma em que se encontra! A saída será: 4284. c .s etTime("1245") ; String tod = c.getTime();Lembre-se de que a Java passa por valor (o que System . out.println("time : " + tod);significa passar por cópia), a variável orig não seráalterada pelo método go( ).Uma classe pode ter quantos quiser. variáveis de instância, métodos de captura e configuraçãoO método só pode ter um . retornoPode ser elevado implicitamente. retorno, argumentoPrefiro minhas variáveis de instância privadas. encapsulamentoNa verdade significa fazer uma cópia. passar por valorSó os métodos de configuração devem atualizá-Ias. variáveis de instânciaUm método pode ter muitos deles. argumentoRetorno algo por definição. método de capturaNão devo ser usado com variáveis de instância. publicPosso ter muitos argumentos. métodoPor definição, uso um argumento. método de configuraçãoAjudam a criar o encapsulamento. métodos de captura e configuração, public, privateEstou sempre sozinho. retornoSoluções dos Quebra-cabeças public class Puzzle4 ( Resposta do peque·no mistério ... public static void ma in (String [J args) Puzz1e4b [ ] obs = new Puzz1e4b[6]; Jai sabia que Buchanan não era muito inteligente. Quando falou int y = 1; sobre seu código, Buchanan não mencionou as variáveis de int x = O; instâncias. Jai suspeitou que embora Buchanan tivesse realmente int result = O; manipulado seus métodos corretamente, não tinha marcado suas while (x < 6) ( obs[x] = new Puzz1e4b( ); variáveis de instância com private. Esse deslize pode facilmente ter obs[x] • ivar = y; custado milhões a Leveler. y y * 10; x = x + li Candidatos: Saídas possíveis: x = 6; while (x > O) ( x = x - 1; result = result + obs[x].doStuff(x); System . out.println("result • + result); x class Puzz1e4b ( int ivar; pub1ic int doStuff(int factor ) i f (ivar > 100) { return ivar * factor; index < 7 7 7 else ( return iva~*_~_: Jactor); 20 1 ---~-----=-=-------_.- - _. -_._-- - - - - - x < 19 __________ 205 index < 1 você está aql:i iii 67 -
  • 94. ~ 5 escrevendo u programaj~IrIrI Métodos Extra FortesI:II~ Fortaleceremos nossos métodos. Você esmiuçou as variáveis, brincou com alguns objetos e escreveu um pouco de código. Mas estávamos vulneráveis. Precisamos de mais ferramentas. Como os operadores. Precisamos de mais operadores, para que possamos fazer algo um pouco mais interessante do que, digamos,(.~ latir. E loops. Precisamos de loops, mas o que há de errado com os discretos loops while? Precisamos de loops for se quisermos fazer algo sério. Poderia ser útil gerar números aleatórios. E converter uma string em um inteiro, sim, isso seria avançado. É melhor aprendermos isso também. E por que não aprender tudo criando algo real, para sabermos como é escrever (e testar) um programa a partir do zero. Talvez um jogo, como a Batalha Naval. Essa é uma tarefa pesada, portanto, precisarei de dois capítulos para terminar. Construiremos uma versão simples neste capítulo e, em seguid 9 , uma mais poderosa e sofisticada no Capítulo 6. este é unl novo 69
  • 95. construindo ", i000 rea st ilo_B_ talha.--,--,"",,,-,,-,-,,-,-~_-------=V< :.=c~ vai _Construiremos um jogo no e_ _ a__ N a v~ I : =--::o con§truJr çUOqº_Sillk a"Sink a Dot Com" Dot Com , com uma grade 7 x 7 e três Dot Coms. Cada Dot ComSerá você contra o computador, mas diferente do jogo de Batalha Naval ocupa três células.real , aqui nenhum navio será nosso. Em vez di sso, sua tarefa seráafundar os navios do computador no menor número de tentativas. parte de interação do jogoAh, e não afundaremos navios. Eliminaremos Dot Coms (empresas na IInternet). (Demonstrando assim a importância das empresas para quevocê possa avaliar o custo deste livro.)Objetivo: afundar todas as Dot Coms do computador no menor númerode tentativas. Você receberá uma classificação ou nível, baseado emcomo foi seu desempenho.Preparação: quando o programa dojogo for iniciado, o computadorinserirá três DotComs em uma grade virtual 7 x 7. Concluída essaetapa, o jogo solicitará seu primeiro palpite.Como você jogará: ainda não aprendemos a construir uma GUI,portanto essa versão funcionará na linha de comando. O computadorsolicitará que você insira um palpite (uma célula), que deve ser digitadona linha de comando como "A3", "CS" , etc. Em resposta a seu palpite, .,.- i..você verá um resultado na linha de comando, "Correto", "Errado" ou"Você afundou a Pets.Com" (ou qualquer que seja a Dot Com de sortedo dia). Quando você tiver eliminado todas as três Dot Coms, o jogoterminará exibindo sua classificação. grade 7 x 7 A ., ;- B c: O () c ·N · o (!) D Fets.cc m l. E F G A~ kMe.( om r o 1 2 3 4 5 6 iCOlileça em: zero, como cada quadrad"o é uma ~célu.l aHa.s matrizes ,.Jz:vaPrimeiro, um projeto de alto nívelSabemos que precisamos de classes e métodos, mas como eles devem ser? Para responder isso, prec isa mos de ,! . -mai s informações sobre o que o jogo deve fazer.
  • 96. escrevendo um programa Primeiro, temos que descrever o fluxo geral do jogo. Aqui está a idéia básica: Um círculo significa inicio ou fim Ct O usuário inicia o jogo Um retângulo é usado p ara ~ Ct ~ representar uma ação ,...._....._-.., O jogo cria três Dot Coms ~ O jogo insere as três Dot Coms e m Preparação uma grade virtual do jogo Et O jogo começa Repita as etapas a seguir até não haver mais Dot Coms : ~ Sol ic ita a o usuário um palpite ("A2" , "CD", etc.) remove ~ Confronta o palpite do usuário com célula do as Dot Coms para procurar um local acerto, um erro ou uma eliminação. Toma a medida apropriada: se for um acerto, excluir a célula (A2, D4, etc.). Se for uma eliminação, excluir a Dot Com. remove o O jogo termina Dot Com um losango represe nta um Fornece ao usuário uma classificação, p onto de d eci s ão baseando - se na quantidade de palpites. Agora temos uma idéia do tipo de coisas que o sim programa precisa fazer. A próxima etapa é definir de que tipos de objetos precisaremos para fazer o trabalho. Lembre-se, pense como Brad em vez de classificação do usuário .-, Uau! Um diagrama de fluxo real o "Jogo Dot Com Simples" Uma introdução mais amigável Parece que precisaremos de pelo menos duas classes, uma classe Game e uma classe DotCom. Mas antes de construirmos o jogo Sink a Doi Com completo, começaremos com uma versão simplificada, o Jogo Doi Com Simples. Construiremos a versão simples neste capítulo, seguida pela versão sofisticada que construiremos no f · __ . próximo capítulo. . Tudo será mais simples nesse jogo. Em vez de uma grade 2-D, ocultaremos a Dot Com em uma única linha. E em vez de três Dot Coms, usaremos uma. No entanto, o objetivo será o mesmo, logo, o jogo ainda precisará criar uma instância da Dot Com, atribuir a e!a um local qualquer na linha, solicitar a entrada do usuário e, quando todas as células da Dot Com tiverem Sido adivinhadas, o jogo terminará. Essa versão simplificada nos ajudará muito na construção do jogo . completo. Se conseguirmos fazer essa versão menor funci onar, poderemos convertê-I a na versão maisf!-,,~~~_,;;~omplexa posteriormente. _ __ , "....,. . Ne~sa versão simples, a classe Game não terá variáveis de instância, e todo o código do jogo ficará no método ____m..~In( ). Em outras palavras, quando o programa for iniciado e main( ) começar a ser executado, ele criará uma n você está aqui )- 71
  • 97. 1# versão mais simples do jogo e somente uma instância da Dot Com, selecionará um local • o jogo é iniciado , cria UMA Dot Com e , para ela (três células consecútivas -na -ÓillcãTinha virtuardesete - - - - - - ---" õeITne um1.õCà1- para ela em crês células da linha única de sete células . células), solicitará ao usuário um palpite, verificará esse palpite Em vez de "A2", C4", etc ., os locais e repetirá isso até todas as três células terem sido adivinhadas_ são apenas números inteiros . Por exemplo: 1 , 2, e 3 são os locais das Lembre-se de que a linha virtual é ... Virtual. Em outras células nessa figura : palavras, ela não existe em nenhum local do programa. Contanto que o usuário e o jogo saibam que a Dot Com está oculta em três células consecutivas entre sete delas (começando em zero), a linha propriamente dita não terá que o 1 2 3 4 5 6 ser representada no código. Você pode ficar tentado a construir uma matriz de sete ints e, em seguida, atribuir a Dot Com a o jogo c omeça a ser disputado. três dos sete elementos da matriz, mas não é preoiso fazer isso. ~ Solicitará um palpite ao usuário e, em , seguida, verificará se ele acertou Tudo de que precisamos é uma matriz que contenha apenas as alguma das três células da Dot Com_ Se três células que a Dot Com ocupa. houver um acerto, ele incrementará a variável numOfHits. o jogo terminará quando todas as t r ês ~células tiv erem sido adivinhadas (a variáve l numOfHits será igual a 3) e informará ao usuário quantos palpites e l e usou para afundar a Dot Com_ Uma interação completa do jogo Desenvolvendo uma classe Como programador, provavelmente você tem uma metodologia/processo/abordagem para o escrever código. Bem, nós também _Nossa seqüência foi projetada para ajudá-lo a ver (e aprender) o que pensamos quando trabalhamos na codificação de uma classe. Não se trata necessariamente da maneira como nós (ou você) escrevemos códigos no dia-a-dia. É claro que, nesse contexto, você seguirá a abordagem que suas preferências pessoais, o projeto ou poder do seu chefe impuserem_ Nós, no entanto, podemos fazer o que quisermos_ E quando criamos cérebro uma classe Java como uma "experiência de aprendizado", geralmente o fazemos desta forma: Flexione esses dendrites. - Definimos o que a classe devefazer. Como você definiria que classe - Listamos as variáveis de instância e métodos. ou classes construir prirneiro, quando estiver escrevendo um - Escrevemos um código preparatório para os métodos. (Você verá isso em breve.) programa? Supondo que todos - Escrevemos um código de teste para os métodos. os programas, exceto os menores, precisem de mais de - Implementamos a classe. uma classe (se você estiver - Testamos os métodos. seguindo os bons princípios da 00 e não tiver uma classe que - Depuramos e reimplementamos quando necessário . execute muitas tarefas - Agradecemos por não ser necessário testar nosso assim chamado aplicativo de experiência diferentes), onde iniciaria? de aprendizado com usuários ativos reais .." 72 capítulo 5
  • 98. escrevendo um programá I As três coisas que escreveremos para cada classe: " código preparatório I,"", I Essa barra será exibida no primeiro conjunto de páginas para lhe mostrar em que parte você está trabalhando. I~ Por exemplo, se você encontrar essa figura na parte superior de uma página, significa que estará trabalhando no código preparatório da classe SimpleDotCom. I~ I~ classe Simpl e DotCom ~ Para fazer: I código classe SimpleDotCo m 1- preparatório .. escreva o co di.go nreparatório o . I;" o i _ escreva o codi go"de teste . código preparatório ,c.tA 0. di~6~lava final _ escreva o CO~8 ,i o , o• • . Um tipo de pseudocódigo, para ajudá-lo a enfocar a lógica sem se preocupar com a sintaxe. cl~s~e SimpleDotcomGam código de teste dicro preparatório _ escreva o co ° . o Uma classe ou os métodos que testarão o código real e avaliarão se ele está fazendo a coisa certa. 0 - código de teste (não1 escreva o código real vao códicroJava final _ escre 00 - " A implementação real da classe. Trata-se do código Java real. código preparatório Você terá uma idéia de como o código preparatório (nossa versão do pseudocódigo) funciona quando exarrunar esse exemplo. Ele é como um intermediário entre o código Java real e uma descrição simples da classe em SimpleDotCom português. A maioria dos códigos preparatórios inclui três partes: ~I ~ declarações de variáveis de instância, declarações de métodos, lógica dos}- - int[] locationCells int numOfHits métodos. A parte mais importante do código preparatório é a lógica dos métodos, porque ela define o que tem que acontecer, que posteriormente ~ converteremos em como, quando escrevermos realmente o código doi String checkYouself(String guess).-o:. ~ void s elfLoca ti onCel ls (int[] loc ) método. ,- ~ ~ --. " Declare uma matriz int para armazenar os l oca is das cé lul as. Chame-a de locationCells.~ol ~.. Declare um int para a rmazenar o número de acertos. Chame-o de numOfHits e configure-o com O. Declare um método checkYourself( ) que us e uma String para o palpite do usuário (" 1" , "3", etc . ), veri fique a string e retor ne um resultado que represente um "acert o", "erro" ou "eliminação" . Declare um método de configuração setLocationCells( ) que use uma matriz int conte ndo os t r ês l ocais das c élulas na forma de números inteiros (2, 3, 4 , etc .) . Método: String chec1r:Yourself(String userGuess) Capture o palpite do usuár i o como um parâme tro de String Converta o palpite do usuário em um int Repita iss o para cada local de célula da matriz int II Confronte o palpi te do usuário com o local da célula Se o palpite do usuár i o estive r cor r eto Incremente o número de acertos II Verifique se essa foi a última célula : L Se o número de acertos for i gual a 3, retorne "eliminação" como resultado Caso contrário não terá sido uma eliminação, portanto, retorne, "correto" End If Caso contrário o palpite do usuário não estará correto, portanto, re torne "errado" _ _=~T.l: L -.c..J.l~.l...L Fim da iteração Fim do método você está aqui fi> 73
  • 99. .. ~ .classe SimpieDo:Ccm Método: void setLoc:ationCells (int l1 c:ellLoc:ations) Capture os l oca is das c é lul as como um parâmetro de matriz int Atribua o parâme t r o d os locai s das células à v ar i ável d e ins tância desse s l o c a i s F im d o método código preparatório cõdi.go de testeEscrevendo a implementação dos métodosEscreveremos o código real do método agora efaremos essa belezinha funcionar. .Antes de começarmos a codificar os métodos, faremos uma pausa paraescrever algum código que os teste. É exatamente isso, escreveremos ocódigo de teste antes de haver algo para testar!O conceito de escrever o código de teste primeiro é uma das práticas daExtreme Programming (XP) e ela pode tornar mais fácil (e rápida) acriação de seu código. Não estamos dizendo necessariamente que vocêdeva usar a XP, mas gostamos da parte sobre escrever os testes primeiro.E o termo XP soa bem. Extreme Programming (XP) A Extreme Programming (XP) é uma novidade no mundo da Não inserir nada que não esteja na especificação (não importa metodologia de desenvolvimento de softwares. Considerada o quanto você fique tentado a criar funcionalidades "para por muitos "a maneira como os programadores querem uso futuro"). realmente trabalhar", a XP surgiu no fim dos anos 1990 e tem Escrever o código de teste primeiro. sido adotada por empresas que vão da loja de garagem com apenas duas pessoas à Ford Motor Company. O destaque da Não seguir prazos apertados; cumprir as horas normais. XP é que o cliente obtém o que deseja, quando deseja, Redefinir (aperfeiçoar o código) quando e onde notar a mesmo quando as especificações são alteradas na última hora. oportunidade. A XP se baseia em um conjunto de práticas testadas que Não lançar nada que não tenha passado por todos os testes. foram projetadas para funcionar em conjunto, embora muitas . pessoas selecionem algumas e adotem somente uma parte das Definir prazos realistas, baseando-se em versões pequenas. regras. Essas práticas incluem coisas como: Manter a simplicidade. Criar versões pequenas, mas freqüentes. Programar em pares e com rotatividade para que todos Desenvol ver em ciclos repetitivos. conheçam bem tudo sobre o código.Escrevendo o código de teste da classe SimpleDotComPrecisamos escrever um código de teste que consiga criar um objeto SimpleDotCom e executar seusmétodos. Para a classe SimpleDotCom , só nos preocupamos realmente com o método checkYours e ~f( ),embora seja preciso impl ementar o método setLocationCells( ) para que o método checkYourse(f( ) sejaexecutado corretamente.Examine bem o código preparatório a seguir, do método checkYourse=f( ) (O método (setLocationCells( ) é ummétodo de configuração simples, portanto, não nos preocuparemos com ele, mas em um aplicativo realpoderíamos querer um método de configuração mais robusto, que pudéssemos testar.)Em seguida, pergunte para você mesmo : "Se o método checkYourself( ) fosse implementado, que códi go deteste eu poderi a escrever qu e me provasse que ele está fun cionando corretamenteT74 cap itulo 5
  • 100. escrevendo um programa Baseado nesse código preparatório: Método: String cbeckYourself(String userGuess) Capture o palpite do usuário como um parâmetro de String Converta o palpite do usuário em um int Repita isso para cada local de célula da matriz int II Confronte o palpite do usuár i o com o local da célula Se o palpite do usuário estive r correto Incremente o número d2 acertos I ...., II verifique se essa foi a última célula: I~ Se o número de acertos for igual a 3, retorne "eliminação" como resultado Caso contrário não terá sido uma eliminação, portanto, retorne "correto" End If Caso contrário o palpite do usuário não estará correto, portanto, retorne "errado" End If Fim da iteração Fim do método Aqui está o que devemos testar: 1 Instanciar um objeto SimpleDotCom. ·1 2 . Atribuir um local para ele (uma matr iz de 3 in ts, como {2, 3, 4}) . 1 - 3 . Criar uma String que represente um pa lpi te do usuário ("2" , "O", etc.) . ~l~ 4. Chamar o método checkYourself( ), passando para ele o palpite de~I usuário fictício.~I.< 5 . Exibir o resultado para ava li ar se está co rreto ("bem-sucedido" ou "com falhas").,J~- 1w-:iI,f- Não existem Perguntas Idiotas P·. Talvez eu não esteja entendendo alguma coisa aqui, mas como exatamente executar um teste em algo que ainda não existe? R: Isso não é possível. Nunca dissemos que você começaria executando o teste; começará escrevendo o teste. Quando estiver escrevendo o código de teste, você não terá nada em que usá-lo, portanto, provavelmente não poderá compilá-lo até escrever o código stub que possa ser compilado, mas isso fará com que o teste falhe (por exemplo, retornando nulo)..,~ P: Ainda não entendi. Por que não esperar até o código ser escrito e, então, projetar o código de teste?~L ., R: o ato de planejar (e escrever) o código de teste ajudará a clarear seus pensamentos sobre o que o método propriamente dito precisa fazer. Assim que seu código de implementação estiver concluído, você já terá um código de teste apenas esperando para validá-lo. Além disso, você sabe que, se não o fizer agora, nunca o fará. Há sempre algo mais interessante a fazer. . O ideal seria escrever um pequeno código de teste e, em seguida, criar apenas o código de Implementação que você precisa que passe no teste . Depois escreva um pouco mais de código de teste e crie ··-apenas o novo código de implementaçao que tera que passar nesse novõ testê-:f.Caaã repetiçãauu teste, você ~xecutará todos os testes já escritos, para que continue a avaliar se seus últimos acréscimos ao código não Interrom perão código já testado. você está aqui ~ 75
  • 101. classe SimpleDotCom código preparatório e6diqo de Código de teste da classe SimpleDotCom public class SimpleDotComTestDrive { public static void rnain (String[] args) { SimpleDotCom dot = new SimpleDotCom() i (~------------- instancia um objeto SilnpleDotCom cria uma lnatriz int para o int[] locations = {2,3,4}i (~---------------- local das dot com (3 ints consecutivos entre 7 possíveis) dot. setLocationCells (locations) i ( _ _ _ _ _ _ _ _ _ _ __ chama o método de configuração na variável dot com String userGuess = "2"i ( - - - - - - - - - - - - - - - - - - cria um palpite de usuário fictício chaw~ o método cneckYourself( ) String result = dot.checkYourself(userGuess) i ~(------­ no objeto dot com e passa para String testResult = "failed"i ele o palpite fictício if (result.equals("hit") { se o palpite f i ctício (2 ) testResult = "passed"i ( __________________ retornar um ltacerto N z o código } estará f~~cionando e,dbe o resu ltado do teste System.out.println(testResult)i (~--------------------- (bem-sucedido ou com falhas) } } Aponte seu láp is Nas próximas páginas implementaremos a classe SimpleDotCom e posteriormente retornaremos à classe de teste. Se examinarmos o código de teste anterior, o que mais deve ser adicionado? O que não estamos testando nesse código, que deveríamos testar? Escreva suas idéias (ou linhas de código) a seguir: ( .... . "i ~ ~--i "~ ,~ /" , .~ .............. ,~ {i ,., l ,..- r:~ j r-- :~lI 76 capitulo 5
  • 102. escrevendo um programa código de testeI ~II~ o método checkYourself( ) Não há uma conversão perfeita de código preparatório para código Java; você verá alguns ajustes, O código preparatório nos deu uma idéia muito melhor do que o código precisa fazer e agora temos que encontrar o código Java que cons iga definir a maneira de fazer- Em segundo plano, pense em que partes desse código você pode querer (ou ter que) aperfeiçoar, Os números dentro do círculo são para indicar as coisas (recursos de sintaxe e linguagem) que você ainda não viu, Elas são explicadas na outra página, Capture o palpite do usuario public Str i ng c heckYourse lf(St ri n g stringGue ss ) Converta o palpi t.e (..0 int guess = ® Integer,parselnt(stringGue ss); ( converte a String em um int usuario .em um int cria uma variável para armazenar o resultado que retornaremos. String result "miss"; ( : - . - - - - - - - - - - - - Insere "miss" como o padrão (isto é, estamos presumindo que ocorrerá u..1l l erro""") repete para cada Repita is so pará cada célula for ®in t ( cell loc at ionCells ) { ( ---------------- célula da matriz locationCells (cada (la mat:r::L:-:; int local de célula do objeto) compara o palpite do usuário com esse Se o palpite. do usuáric if (guess == cell) ( - - - - - - - - - - - - - elemento (célula) da est.iver corr eto matriz Incremente c nUITlE:ro d(.;?- acertos resul t = "h,® numOfHits++; ~ ;_============== <: tivemos um aoerto! ,,..-..., @) sai do loop, não é break; (~------------------­ preciso testar as II fim do teste if outras células II fim do loop for estamos fora do loop, ! i Verifique se essa foi a mas vejamos se já última célula terminamos (acertamos Se o número de acert:os ror if (numOfHits locationCells . length) { ( ------- 3 vezes) e alteramos igua l a 3 a string do resultado para nkill,r Retorne "e liminação" come result = "kill"; resultado II fim do teste if exibe o resultado Caso contrário D&.O terá sido para o usuário uma eliminação: portanto, System.out.println(result); ( ----------------------- (l1Miss H r a menos que Retorne, ~co rreto" seja alterado para nHit N ou nKill") Caso contrário retorna o resultado return re s ult; ~( ~-----------------------------------­ Retorne "errado " para o método chamador II fim d o método~-- você está aqui ~ 77
  • 103. .,,-,. . - classe SirnpleDotCorn código preparatório As novidades o que ainda não vimos se encontra nesta página. Pare de se preocupar! O resto dos detalhes está no final do capítulo. Isso é o suficiente para que você possa continuar. Um método da c~asse Integer que sabe como llconverter H uma string no inteiro que ela representa. Uma classe que Usa uma St ring. com a Java. I iTem Q) Conve r tendo u ma string em um int ~ Integer.parseInt(U3") Leia essa declaração do Ioop for o sinal de dois-pontos (:) des ta forma: "repí ta para cada significa "de", portanto, elemento da matr iz locationCells: o conjunto todo significa extraia o próximo elemento da matriz ,!para cada valot ínt DE e atribua-o à variável int cell r. N locatíonCe1.ls ... " ® O l oop for ~ for (int cell j locationCells) { } Declara uma variável que armazenará um elemento da matriz. A cada vez que o loop for percorrido, essa 1 A matriz que o loop percorrerá. A cada vez que o Ioop for variável (nesse caso uma variável percorrido, o próximo elemento da int chamada "cell") r armazenará um matriz será atribuído à variável elemento diferente da matriz, até "cell ". (VereIl10S mais sobre .i s so que não haja mai s elementos (ou o no final deste capítulo.) código faça uma "interrupção" .. . Consulte o item 4 a seguir). ® O operador pós-incremento o sinal ++ significa somar ~ ao que quer venha antes (em outras palavras, incrementar " ~ em 1). numOfHits++ numOfHits++ é o mesmo (neste caso) que dizer numOfHits = numOfHits + ~, exceto por ser um " pouco mais eficiente. ® I ns trução break Fará você sair de um loop. Imediatamente. breaki Neste exato momento. Sem iteração, nenhum teste booleano, .">..~i"!: __"!:fl~~"!:! ------------------------------------------------------------------------" Não existem Perguntas Idiotas P: o que aconteceria em Integer.parselnt( ) se você passasse algo que não fosse um número? A instrução reconhece números por extenso, como em "three"? R: Integer.parselnt( ) só funciona com strings que representem os valores ascii dos dígitos (O, 1, 2, 3, 4, 5, 6, 7, 8, 9) . Se voçê . entar converter algocomo "two" ou "blurp", o código será interrompido no tempo de execução. (Por t interrompido, queremos dizer na verdade que ele lançará unia exceção, mas não falaremos sobre exceções até chegarmos ao capítulo sobre elas. Portanto, por enquanto, interrompido é o que chega mais próximo.) 78 capítulo 5
  • 104. escrevendo um programa , h P: No começo do livro, havia um exemplo de loop for muito diferente desse - há dois tipos diferentes de loop for? R: Sim! Na primeira versão do Java havia apenas um tipo de loop for (que será explicado posteriormente neste capítulo) com a seguinte aparência: for (int i = O; i < 10; i++) { II faz algo 10 vezes .h. h Você pode usar esse formato para qualquer tipo de loop de que precisar. Mas,.. A partir do Java 5.0 (Tiger) , também pode usar o loop for aperfeiçoado (essa é a descrição oficial) quando seu loop tiver que percorrer os h elementos de uma matriz (ou outro tipo de conjunto, como você verá no próximo capítulo). Você sempre poderá usar h o loop for antigo para percorrer uma matriz, mas o loop for aprimorado tornará isso mais fácil. h ,~l~ l~ Código final de SimpleDotCom e SimpleDotComTester1:.:~ pubI i c class SimpleDotComTestDrive { public sta t ic void main (String[] a r gs) ( S i mpIeDotCom do t = new SimpleDotCom() ; int[] locations = (2,3,4);]"~I dot . setLocationCe11s(locations); String userGuess = "2"; St ring r esu1t = dot.checkYourself(userGu e ss ) ; public clas s S i mpleDotCom int [] l oca t i onCells; int nurnOfHi ts = O; pub l ic v oid s et Lo c ationCe 11 s(i n t [ ] l o c s) ( locationCell s = lo c s; pub lic String chec kYourse l f (St ring stringGuess ) int guess = In teg er . p a rse In t (stringGue s s); String resu1t = "missO ; o que devemos ver quando fo r (int c eI 1 : loca t ionCell s ) executarmos esse código? if (guess == c e l l) ( resu lt = "hi t "; o código de teste cria um objeto numOf Hits ++; SimpleDotCom e fornece um local para ele b reak ; nas posições 2, 3 e 4. Em seguida, envia um palpite de usuário fictício igual a "2" para o II f o r a do Ioop método checkYourself( ). Se o código estiver if (nurnO f Hi ts == funcionando corretamente, devemos ver a location Cells.length) exibição do resultado: resu l t = "kill"; Java SimpleDotComTestDrive System . out.println (result) ; hit return r e sul t; II fecha o mé t odo II fecha a classe Há um pequeno erro à espreita aqui. O código será ~ºmpiJçtdo-.e .exe_ cillado.JTlas em _ alQUns momentos ... ~ão se preocupe por enquanto, mas teremos que enfrentar ISSO um pouco mais adiante. vocs está aqui» 79 l .
  • 105. ..... classe SirnpieDotCom código ~~,Aponteseulápis9--------------------------------------------------------------------------, - - Construímos a classe de teste e a classe SimpleDotCom, Mas ainda não A classe temos o jogo real. Dado o código da página anterior, e as especificações do SimpleDotComGame jogo real , escreva suas idéias para o código prejJaratório da classe do jogo . precisa fazer isto: Forneceremos uma linha ou outra para ajudá-lo a começar, O código do 1, Criar apenas um objeto jogo real está na próxima página, portanto, não olhe a página até ter feito SimpleDotCom, esse exercício! 2. Criar um local para ele (três, Você deve obter algo entre 12 e 18 linhas (incluindo as que escrevemos, células consecutivas na porém sem incluir as linhas que apresentam apenas uma chave). mesma linha de sete células virtuais) , Método public static void main(Stringl] args) 3. Pedir ao usuário um Declare uma variável int para armazenar o número de palpite. palpites do usuário chamada numOfGuesses 4. Verificar os palpites. 5. Repetir isso até a dot com ser eliminada. 6. Informar ao usuário quantos palpites ele usou. Gere um número aleatório entre O e 4 que será a célula da posição inicial Uma interação completa do. jogo r Enquanto a dot com existir: Capture entradas do usuário na linha de comando Código preparatório da classe SimpleDotComGame Tudo acontece em maín( ) ., Há algumas coisas em que você terá apenas que acreditar, Por exemplo, temos uma linha de código " . . preparatório que diz, "CAPTURE entradas do usuário na linha de comando". Na verdade, isso vai um pouco além elo que gostaríamos de imv]ementar nesse momento. Mas, feli zmente, estamos usando a 00 . E isso significa que você solicitará a outra classe/objeto. que faça o que é necessário, sem se preoc upar com a lIlaneira ,,:"~ como será feito. Quando você escrever o código preparatório, deve presumir que de alRUI/la jórm{/ será capaz ~ -I de fazer o que for preciso, assim poderá dedicar toei o o seu poder mental à co nstrução da lóg ica. ft • ,I~ " ~ .. ~ 80 capítulú 5
  • 106. ~~­~g - escrevendo um programa I """ código preparatório public static void main(StringCJ args) Declare uma variáv e l in t para armazenar U HÚltlerO de palpites do usuário, chamada numOfGuesses , e configure - a com o. Crie uma nova instância de Simp le DotCom . L. Gere um número aleatório entre O e 4 que será a célula da posi ção inicial . Crie uma matriz int com 3 inteiros us ando o número gerado aleatoriamente, esse número ~ i ncrementado em 1 e ess e número incrementado em 2 (exemp l o : 3,4,5) . h Chame o método setLocationCells( ) na ins tância de Si mpleDotCom. Declare uma variáve l booleana que representará o estado do j ogo, chamada isAlive , e h configure-a c om verdade i ro . h Enquanto a dot com existir (i sAli ve true) :,h Capture entradas do usuário na linha de comando.~I,", I I Verifique o palpite do usuário I~ Chame o método checkYourself( ) na inst â nci a de SimpleDotCom. Incremente a variáve l numOfGuesses.l~ II Verifique se a dot com f oi eliminadal~ Se o resultado for "kill"J~ Configure isAlive com falso (o que signif i ca que não entraremo s no loop novamente ) .J~ Exiba o número de palp ites do usuário . End If1~~r End Whilel" Fim do método.t~~-- dica metacognitiva Não use apenas uma parte do cérebro por muito tempo. Usar apenas o lado esquerdo do cérebro por mais de 30 minutos é como usar apenas seu braço esquerdo durante esse período. Dê a cada lado de seu cérebro uma pausa,~ alternado-os em intervalos regulares. Quando você passar para um dos lados, o outro descansará e se recuperará. As atividades do lado esquerdo do cérebro incluem coisas como seqüências em etapas, resolução de problemas lógicos eil~~I . análise, enquanto o lado direito se encarrega de metáforas, resolução de problemas que usam a criatividade, comparação de padrões e visualização.f .1J~ DISCRIMINAÇÃO DOS PONTOS - Seu programa Java deve começar com um projeto de alto nível. - Normalmente escrevemos três coisas quando criamos uma nova classe: código preparatório código de teste código real (Java) - O código preparatório deve descrever o que fazer e não como fazê-lo. A implementação ve m depois. - Use o código preparatório como ajuda no projeto do código de teste. - Escreva o código de teste antes de implementar os métodos. - Use loopsfor em vez de white quando souber quantas vezes deseja repetir o código do loop. - Use o operador pré/pós-incremento para adicionar uma unid ade a uma variável (x++). - Use o operador pré/pós -decremento para subtrair uma unidade de uma variável (x-) . .~ Use Intege~,p_<l.~elntU para capturar o valor int de LIm a String. - Integer.parselnt( ) só funcionará se a String representar um dígito ("O", "] " , "2", etc.). - Use break para sair antecipadamente de um loop (isto é, mes mo se a condi ção do teste booleano ainda for verdadeira). você: está aqdi 81
  • 107. classe SíTipieDotCornGame c-ódig-o preparatório o método main( ) do jogo Exatamente como você fez com a. classe SimpleDotCom, pense nas partes desse código que pode querer (ou ter que) aperfeiçoar. Os números dentro de um círculo são para as coisas que queremos destacar. Elas serão explicadas na outra página. Ah, se estiver querendo saber por que saltamos a fase do código de teste nessa classe, não precisamos de uma classe de teste para o jogo. Ele só tem um método, portanto, o que você faria em sel1 código de teste? Criaria uma classe separada que chamasse main( ) nessa classe? Não é necessário. " f public static void main(String[) args) cria uma variável para "::1. int numOfGuesses = O; ~------------------------------- controlar quantos ".~ ~ palpites o usuário usou ~3 " -;; essa é uma classe especial com 0 . que cria~s e que contém o método de captura de GameHelper h e lpe r new GameHelpe r ( ) ; ~------- entradas do usuário~ Por enquanto considere - a como l parte do Java Crie um obje t ü SimpleDotCom theDotCom = n e w SimpleDotCom ( ) ; ~ cri" o obieto uot com SimpleD0t:CorI: _ Gere um núrne:r(; êlleatóL-i c int randomNum = (int) CD (Math.random() * 5); ~ ern.l!2 U 2 .:,1.. gera um número aleató~io para a primeira célula e ~ o usa para criar a matriz de locais de células ".1.; ~ , o l o c~l das t~ês c~lulas ~-I; int[) locations = {randomNum , randomNum+l, randomNum+2}; fornece à doI:: com ,sua .,,-.....- : theDotCom . setLocationCells (locations) ; ~------------ localização i a matriz) ,, : boolean isAlive = true; booleana isAl ive cria uma variável booleana que será usada no teste do loop whiIe para registrar se o jogo continua ativo. Repete o loop enquanto o jogo estiver a.tivo .. enquanto " d~,t ,= GF whi le ( isAlive == true) captura a 2x:Lstir . Capture ii entrada ,:10 ® String guess = help er. getUserI nput (" insira um número") ; string da entrada do usuárjo. usuário ; i Verifique-a solícita à ãot com para Chame :,:·heCv.Youl-S~J. t { String resul t theDotCom.checkYourself(guess); ~verificar o palpite; n(;· ·:,bj et .: cL,t. c ,:,m. sal ,rã. O resul tado retornado em uma string incrementa a contagem de numOfGuesses++; ~-----------------------------------­ palpites ., 1~ i ] 1" . if ( result.equa ls( "kill ")) Configure .J a:.: m~~~ !..l. .... v ;;:~ <~,~>m isAlive = false; foi uma l~e líminação~? Se rorr conrJ:gu,re isAlive coxo 1:<0.1 $:;) (pare não entramos nOV8~ente no Ioop) e ex:tbe 5. contagem de palpites do usuário System.out.println (";Você usou" + numOfGuesses + " palpites"); II ence rra a instru ção if II encerra wh il e II encerra mai n~i_._______8_2___ C_8_P_it_lJ_IO 5_________________________________________________________________________________________ ___ ~
  • 108. iS " :=:1 - T~-- escrevendo urn programa ~ h I. . . . random( ) e getUserlnput( ) h I...., Duas coisas que precisam de um a exp li cação um po uco me lhor estão nessa página. Trata-se apenas de um a visão geral para que , você possa continuar; mais detalhes sobre a cl asse GameHelper se encontram no fim deste capítulo. J--.. Isso é uma conversão e ela forçará o que o método Math.random retornará l......., estiver imediatamente após a ficar com o um número no intervalo entre zero e menor ~Je um. Portanto, h seu tipo (isto é, o tipo entre parênteses). Matb,random retornará um tipo double, essa fórmula (com a conversão), ~ portanto teremos que convertê-lo em um int (queremos um número inteiro entre O e 41. retornará um n~~ero de O a 4 (isto é, de O a 4,999 .. , h Nesse caso~ a conversão eliminará a parte convertido em um inteiro). j Eracionáría do tipo àoubl e . i Ir-- ~ Ge r e um número a l eató r io Ir""- I,~ int randomNum = (int) (Math . randorn( * 5) ..:.. Declaramos ~~a variável int que ! uma clas se que vem com Um método da armazenará o número aleatório fornecido. a Java .. classe Matb. uma instância que criamos Es s e método recebe um argumento de String anteriormente, de uma classe que que ~aa para interagí= com o usuá: ic na construímos para auxil i a r o jOgo . l i nha de c omando . Qualquer c oisa que voce Ela se cbama GameHelper e você p a s s ar aqui s erá exibida no terminal ainda não a viu (mas verá). imediatamente antes do método começar a ~ procur ar a en rreda do UUár~ ~ Cap t urando a entrada do usuári o us ando a classe GameHelper String guess helper . getUserInput("insira um número"); De c laramos mna variável de 1 Um método d a classe GameHelper que solicita String que a rmazenará a s t rin g ao usuári o entrada na linha d e comando, a lê d a entrada f orne c ida pelo d epois que o usuário pressiona Enter e usuári o ( .t3 nS l r e tc .) .. U , re torna o resul t ado como U!lla S tri ng . Uma última classe: GameHelper 1~ Criamos a cl asse dot com.~I,-.. C.~......::; - namos a classe do j ogo."f ,-..-~ Só falta a classe auxiliar - a do método getUserInput( ). O código para . capturar entrada na linha de comando vai além do que queremos explicarE :::,d:::::,::c:::::~:;~:::U::~i:~ agora. Ele abre caminho para muitos tópicos, o que é melhor deixarmos-, compHá lo chamada GameHelper. Insira todas as três classes (SimpleDotCom, ,m em,cl""~t"" SompleDotComGame, GameHelper) no mes mo diretói-io e faça com ele~ seja seu diretório de trabalho.tJ = Sempre que você ~ncontr~ro logotipo ~CÓdigO predefinido, veráiL um código que tera que digi tar do modo em que se encontra e acreditarw ,.....-·--- enl-s Q.,-fu- ~ -~-~... 4 ...u ___ -n _ ..l~ ~ _ ":; ,,- " ,,_~ ~_----L...-~.~.. ri 33e-ee . . llp-()- - -- Il,.,lV lI d UlCIJlV . rvu c ..... V IIl l dL vv,., ç UjJ l L>UU,...l Ú ,.. V JIJ V ..... . ·~"" funciona posteriormente. " Sabem os co mo você aprec ia di gitar, mas para os raros momentos~ em que preferi r fa zer outra co isa. di sponibilizam os o Cód igo Predefinido e m wickedlysmart. com. você está aqui... 83
  • 109. - -- - - " - - -- - - --------- --- classe GameHelper P~""-L;-: - /~6: código preparatório import java .i o . *; public class GameHelper public String getUserInput(String prompt) String inputLine = null; System . out.print(prompt + " "); try { ~t,(>digo BufferedReader is = new BufferedReader (ne w InputStreamReade r (System.in) ) ; pré-definido inputLi?e = is.readLine() ; if (inputLine.length () == O) return null; c atch ( I OExcep ti on e) { System . out . println("IOException : " + e); re turn i nputLine; Agora podemos jogar o que é isso? Um erro? Veja o que acontecerá quando executarmos o código e Opa! inserimos os números 1, 2,3,4,5, 6. Parece fu ncionar bem. Veja o que acontece quando inserimos 1, 1, l.I ., Uma interação completa do jogo Uma interação diferente do jogo (sua pontuação pode variar) (epa)1·1 I _i É uma situação-limite! f" 1 Encontraremos o erro? Corrigiremos o erro? Não perca o próx imo capítulo, onde responderemos essas perguntas e muitas outras ... fi. Mas por enquanto, veja se consegue ter um a idéia do que deu errado e de ~J ~ como corri gi r. :~ 84 capíluio 5 ~ :~
  • 110. ~~~.: escrevendo um programaf-_- - h i V" Mais informações sobre os loops for I ~ Abordamos todo o código do jogo neste capítulo (mas voltaremos a ele para terminar a versão sofisticada no i próximo capítulo). Não quisemos interromper seu trabalho com alguns dos detalhes e informações secundárias, ,.-.. portanto retornaremos a eles aqui. Começaremos com os detalhes dos loops for e, se você é programador de I.. . . C++. poderá ler apenas superficialmente essas últimas páginas ... . operador o cóéLigo Loops for comuns (não-aperfeiçoados) incremente x·epeti.dc aqui corpo) for(int i = Oi i < 100i i++) 1 { / } ii"Jicial j ,za.qifo test e eJcpressãc de booleano iteração o que significa em português simples: "repetir 100 vezes." repita 100 vezes: Como o compilador interpreta: - criar uma variável i e configurar com O. _ repetir enquanto i for menor que 100.,,--,, _ no fim de cada iteração do loop, acrescentar uma unidade a i. Parte um: inicialização Use essa parte para declarar e inicializar uma variável que será usada dentro do corpo do loop. Geralmente essa variável é usada como um contador. Na verdade você pode inicializar mais de uma variável aqui, mas veremos isso posteriormente no livro. parte dois: teste booleano É aqui que o teste condicional entrará. Independentemente do que houver nele, terá que ser convertido em um valor booleano (você sabe, verdadeiro oufalso). Você pode ter um teste, como (x>=4) , ou até mesmo chamar um método que retorne um booleano. Parte três: expressão iterativa Nessa parte, insira uma ou mais coisas que você deseja que ocorram a cada passagem do loop. Lembre-se de que elas acontecerão no final de cada loop. -Percorrendo um loop declare a for (int i = O; i < 8; i++) variável int i System . out.println(i); configure i com O System.out.println("done") ; saída: ~______~~I entre no corpo do loop exiba o valor de i exiba done ll (passe para baixo do loop) ---~~-~=~-~~ -- -~ -- (a expressão interativa) você estú aqtJ! 85 - L _ _ _ _ _ __ _ _ _ ~ ~ _ _ _ __ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ __ _
  • 111. diferença entre ior e wi, i!eDiferença entre for e whileUm loop while apresenta apenas o teste booleano; não tem uma expressão interna de inicialização ou iteração.Ele será útil quando você não souber quantas vezes o loop será executado e qui ser continuar a execuçãoapenas enquanto alguma condição for verdadeira. Mas se você souber quantas vezes o loop será executado(por exemplo, dependendo do tamanho de uma matriz, 7 vezes, etc.), um loop for será mais simples. Aqui estáo loop anterior reescrito usando-se white: int i = O; ~----------------~---------------------------­ t emos que declarar e inicializa.r o conr:ado? wh il e (i < 8) System.au t .println ( i ) ; i++; ~~---------------------------------------------- temos que incrementar o contador System . aut .println ( "dane" ) ; ++ Operador de pré e pós-incremento/decremento o atalho para se adicionar ou subtrair 1 unidade de uma variável. x++, é o mesmo que: x=x+1; As duas instruções significam a mesma coisa nesse contexto: "adicione 1 unidade ao valor atual de x" ou "incremente x em 1 unidade" E: x- -; é o mesmo que: x=x-1; É claro que isso não é tudo. A inserção do operador (antes ou depois da variável) pode afetar o resultado . Inserir o operador antes da variável (por exemplo, ++x) , significa "primeiro, incremente x em 1 unidade e, em seguida, use esse novo valor de x". Isso só será importante quando x++ fizer parte de alguma expressão maior e não de apenas uma instrução. int X = O; int z = ++x; produzirá: x é igual a 1, z é igual a 1 Mas, se inserirmos o sinal ++ depois de x, teremos um resultado diferente: int x = O; int z = x++; produzirá: x é igual aI , mas z é igual a O! Z receberá o valor de x e, em seguida, x será incrementado.o loop for aperfeiçoadoA partir do Java 5.0 (Tiger), a linguagem passou a ter um segundo tipo de loopfor chamadojór apeljeiçoado,que torna mais fácil a iteração por todos os elementos de uma matriz ou outros tipos de conjunto (vocêaprenderá sobre outros conjuntos no próximo capítulo). Na verdade isso é tudo que o loop for aperfeiçoadofornece --.uma maneira mais simp les de percorrer todos os elementos do conjunto, mas já que essa é afinalidade mai s comum de um loop for , valeu a pen a adicion á-lo à linguagem. Revisitaremos o loopfor ~-apelfeiçoado no próxim o capítulo, quando falarmo s sobre conjuntos que não são matrizes. ~ ~86 capítulo 5 -tA -"-- i;S!:
  • 112. ., f"- escrevendo , n i programa Deç la,zoa uma 1T, .... ·i ·~.F~) I de um elemento da. ma~ríz~ for ~~ name:! (String I ii nameArray) { I } Os elementos da matriz / T ,":1 cada i;.:>eraç§.o DEVEM ser comvativ€.:s um el.é1.nsnto Suponllamos que 8:m. algum !JOllto ant.:r:..t:;"or do ;f)digc com o tipc declarado diferente da ti7ásse11los: para a varíá . rel. . matriz será String[] ~1ê.me.Ai..~ray .;;; {llFred~(~ uI..ffaJ::y~~~ ~~BobNJ; atribuído ã ~!a prí.üleira it:araçãc_" a Fê..~iat--~21 I1ame tez~:!l o Tfalcr variável Una.."ne N " tFred"... !lã segu.."1da. c valoz:: nriJa.!..yf( I C!.,...- o que isso significa em português claro: "a cada elemento de nameArray, atribua o elemento à variável name e execute o corpo do loop. " Como o compilador interpretaria: 1 i:1ft"Ua:;;em de P,Z°o!;;;{xemaçi#o (;ru.e - Criar uma variável de string chamada name e configurá-Ia com nulo . tiverem usado no passadc~ a-1.gumas pessoas podem cila."TIar - Atribuir o primeiro valor de nameArray à variável name. o Ioop for ap~rfeiçaado de - Executar o corpo do loop (o bloco de código dentro das chaves) . Hror eecll" ou ""ror in?r~. . porQUe é assim ~~$ se - Atribuir o próximo valor de nameArray a name. incerpreta: "para for) C_~A elemento DO (eacil) in).,.-.., - Repetir enquanto ainda houver elementos na matriz.I", conjunt0 ... ~1f Parte um: declaração da variável de iteração1--- Use essa parte para declarar e inicializar uma variável que será usada dentro do corpo do loop. A cada iteraçãof~ do loop, essa variável armazenará um elemento diferente do conjunto. O tipo da variável deve ser compatível com os elementos da matriz ! Por exemplo, você não pode declarar uma variável de iteração int para usar comIr.- urna matriz String[] .l~ Parte dois: o conjunto atualI"t~ Deve ser uma referência que aponte para uma matriz ou outro conjunto. Não se preocupe ai nda com os outros tipos de conj unto que não são matrizes - você os verá no próximo capítul o.iIr-f~ Convertendo uma string em um inteiroI~ int guess = Integer .parseInt (stringGuess) ;Jr:.! O usuário digitará seu palpite na linha de comando quando o jogo solicitar. Esse palpite chegará na forma de uma string ("2", " O", etc.), e o jogo passará essa string para o método checkYourself( ). ,-., Mas os locais das células são simplesmente os inteiros de uma matliz, e você não poderá comparar um inteiro com uma string.I1---- Por exemplo, isso não funcionará:~-k S t r i ng num = "2"; int x = 2; if (x == num) l/confronto incompatíve l!Ir-- Tentar compilar esse código fará o compilador rir e zombar de você:~-f Portanto, para contornar as diferenças, temos que converter a string "2" no illteiro 2. Embuti da na biblioteca de classes Java temos uma classe chamada Integer (certo, trata-se da classe Integer e não de um tipo primitivo int) e uma de suas tarefas é pegar strings que representam números e convertê-l as em números reais. uma c~asse que vem com o ~=.=a_~,-_____ __ ~ usa uma. scri .. "1gt~ ~ Integer.parselnt("3") -- .. 87
  • 113. convertendo t:PQ sprirnitiv("sl.nnvArt,::mrln tinnc:: nrimitilnc:: - _ ••• _·õ- - _. __ õ · · · . . , _. o . _ - -~- bits cio ladc.· es~..!e::do fcraui. e2imina,áos 0.1 0..1 .1.10. .1.10. ~ mas você pode ~ longo pode ser convert i do em curto ~J perder algo t.t No Capítulo 3 falamos sobre os tamanhos dos vários tipos primitivos e que você não pode inserir algo grande diretamente em um recipiente pequeno : long y = 42; int x = y; II não será compilado Um tipo longo é maior do que um inteiro e o compilador não terá certeza de onde esse longo saiu . Pode ter estado bebendo com outros l ongos e recebendo valores realmente altos. Para forçar o compilador a e spremer o valor de uma variáve l pr imiti v a maior em um tipo menor, você pode usar o operador de conversão . Ele tem esta aparênc i a : long y = 42; I I até aqui tudo bem int x = (int) y; II x = 42 muito boml Se você inserir a conversão, estará solicitando ao compilador que pegue o valor de y, converta-o para o tamanho de um inteiro e configure x com o que sobrar. Se o v al o r de y for maior do que o valor máximo de x, acabaremos com um número estranho (mas calculável* ) : long y = 40002; II 40002 excede o limite de 16 bits de um tipo curto short x = (short) y; II agora x é igual a -25534 ! Mesmo assim, o importante é que o compilador lhe permita continuar . E digamos que você tivesse um número de pont o flutuante e quisesse a penas a parte inteira ( int ) dele : float f = 3.l4f; int x (int) f; II x será igual a 3 Mas nem pense em converte r algo em um booleano ou vi ce-versa - deixe como está . * Isso envolve os bits de sinais, o sistema binário, complementos de dois e outros detalbes, que serão discutidos no começo do Apêndice B. c l ass Output { public static vo id main(String [J args) Output o new Output(); o.go () ; void go () ou Seja a JVM int y = 7 · for(int x 1; x < 8; x++) o arq uivo Java dessa Y++i página representa um if (x > 4) arquivo-fonte System . out . print(++y + " O); completo. Sua tarefa é if (y > 14) personificar a . ou System . out . println(" x " + x); JVM e determ inar qual break; será a saída , " quando o ~~) programa fo r .~~88 capit! I!O 5 executado? .j t
  • 114. escrevendo um programa ímãs com código Um programa Java funcional está todo misturado sobre a geladeira. Você conseguiria reorganizar os trechos de código para criar um programa Java funcional que produzisse a saída listada a seguir? Algumas das chaves caíram no chão e são muito pequenas para que as recuperemos, portanto, fique à vontade para adicionar quantas delas precisar! I 1) "", System.out . println(x + " " + 4; Y > 2; y-) for (int Y ., for(int x O; x < 4; x++) ~- - I ~ pUblic static main(String [1 n I "P---~~10- Um programa Java curto é listado a seguir. Um bloco do programa está faltando . Seu desafiori --~ Mensagens é comparar o bloco de código candidato (à esquerda) com a saída que você veria se ele fosse inserido. Nem todas as linhas de saída serão usadas e algumas delas podem ser usadas:.4- misturadas mais de uma vez. Desenhe linhas conectando os blocos de código candidatos à saída de;~,- linha de comando correspondente. (As respostas estão no final do capítulo.) ~ " class MixFor5 public static void main (String [J args) int x = O; Candidatos: Saidas possiveis: int y = 30; ~- for (int outer = O; outer < 3; outer++):l ~~i-., . for (int inner = 4; inner > 1; inner-) ~1~-;L;;:- .*~ y = y - 2; if (x == 6) break; o CiHldidato x x + 3; gntra aqui Compare cada c andidato COm uma das saídas possíiJ"eis y y - 2;) ....,~h" " Sy,steITl . out .pri- tln (x n +·:f~1;i-. .1., voce estú 89
  • 115. quebra-cabeças: Como um jogo de palavras cru zadas o aj udará a aprend er Ja ~a? Bem, Cruzadas Java ~ - ~--~- toda~as pala vn;~ tê~~relação com o Java. Além di sso, as pi stas fornece m metáforas, trocadilhos e coi sas do tipo. Esses atalhos mentais disponibilizarão rotas altemativas para o aprendizado Java, diretamente e m seu cérebro! ,r-.. ,Horizontais VerticaisI . Palavra engraçada em informática que significa construir 1. Estabelecer o primeiro valor4 . Loop de várias partes 2. Tipo de incremento6. Teste primeiro 3. Cavalo-de-batalha da classe7.32 bits 5. O pré é um tipo de _ _ __10. Resposta do método 7. Um ciclo11 . Código preparatório 8. Wh ile ou For13. Alteração 9. Atualizar uma variável de in stânci a15. O grande kit de ferramentas 12. Contagem regress iva17. Uma unidade da matriz 14. Compilare _ __18. De instância ou loca l 16. Pacote de comunicação20. Kit de ferram e ntas autom á tico 19. Mel1mge iro dos métodos (abre v.)22. Parece Ulll tipo primitivo, mas ... 21. Como se25. Não conversível 23. Ad icionar depo is26. Método ele Math 24. A casa cio pi28. M étodo conversor 27. Valo r cio operaclor ++29 . Sai r antes 30. de iteração do loop for ~ -,~
  • 116. escrevendo ,; programa - , Seja a JVM: Imãs com Código c1ass Output c1ass Mu1tiFor ( L pub1ic static void main(String [] args ) ( pub1ic static void main(String [] args) ( Output o new Ou tput() ; O .go (); for ( int x = o; x < 4; x+ + ) ( void go () ( f o r(in t y = 4 ; y > 2; y - ) int y = 7; System.out . print1n(x + " " + y) ; for(int x = 1; x < 8; x++) ( y ++; if (x > 4) ( o que aconteceria Syst em . out . print(++y + " O); if (x == 1) ( se esse bloco de X++i código viesse antes if (y > 14) ( System.out.print1n(" x " + x); do loop for de y? break; Você se lembrou L de considerar a - :1--. instrução break? Como isso afetou a saída? I h:I 1-. ,h~L. ~ ~ Oluções dos quebra-cabeças Candidatos: Saídas possíveis: x x + 3; 4S 6 x x + 6; 36 6 x x + 2; S4 6 X++; 60 10 x--; 18 6 X =X + O; 6 14 12 14 ". 91- ......--------------------
  • 117. - 6 conheça o APl Java Usando a Biblioteca Java) o Java vem com centenas de classes predefinidas. Você não terá que reinventar a roda se souber como encontrar o que precisa na biblioteca Java, normalmente conhecida como APl Java. Há coisas melhores a fazer. Se você pretende escrever códigos, pode escrever somente as partes que forem exclusivas de seu aplicativo. Conhece o tipo de programador que vai embora toda tarde às 5 PM? Aqueles que não chegam antes das 10 AM? Eles usam o APl Java. E nas aproximadamente oito páginas seguintes, nós também usaremos. A principal biblioteca Java é uma pilha gigante de classes apenas esperando para serem usadas como blocos de construção, para que você construa seu próprio programa usando código em grande parte predefinido. A seção de códigos Java predefinidos deste livro são trechos que você não terá que criar do zero, mas mesmo assim precisará digitá-los. O APl Java está cheio de códigos que você não terá nem mesmo que digitar. Tudo que precisa fazer é aprender a usá-lo. este é u:-", redO capíÍulo 93
  • 118. ai nda temos : Como o código deve funcionar Como o erro se manifesta Veja o que acontecerá quando executarm os o cód igo e Veja o que acontece quando in serimos 2, 2, 2. in serirm os os números J, 2, 3, 4. 5, 6. Parece funcion ar bem. Uma interação completa do jogo Uma interação diferente do jogo (sua pontuação pode variar) (epa) Na versão atual, quando você acertar, terá apenas que repetir esse palpite mais duas vezes para eliminar!Mas o que aconteceu? public String checkYourself(Str i ng stringGues s) { int guess = Integer . parseInt (stringGuess): ~ convertê a String em um intÉ aqui que está o cria uma veriável para armazenar oerro. Contamos um String result = "miss": ~<E:"--__-------- resl.ütado que retornaremos. Insereacerto a cada vez ~1n:i.ssl como o paãrão (isto é, estamesque o usuário presuJ nindo um "erroU)adivinhou umacélula, mesmo for (int cell : locationCells) { <E------------- repete para cada célula da matrizquando esse localjá tinha sido if (gu e ss cell) {adivinhado! co:mpara o pa lpi.t iS do u suári o com es se result = "hi t": (~--------_. ( ______ tíveruos um e~ement:o (cél.ula) da matrizPrecisamos de umamaneira de saber numOfHits++: ~ acerco!se quando ousuário deu um saí do loop, não e preciso testar as break : ( - - - - - - - - - - - - - - - - - - - - - - - outras célulaspalpite, ele já nãoadivinhou essa II fim do tes te ifcélula . Se já tive radivinhado , então, II fim do loop fornão iremos contá-Ia estamos fora do ~oopz mas vejamos se jácomo um acerto. if (numOfHits == loca ti onCells . length) { ~----- terminamos (a-=ertamo5 3 vezes) €r a.lteramos a string do resLlcario .para ~ki.l1n r esult = "kill": II fim do te ste if s,:ib·? o ::.."€!sultaóo para o usuéri.o Syst em . ou t. pri ntln (re sult ) : ~<E------------------- (fomiss!l,. .ç men<J$ c:n.l6 se.-;a alterado j..IIC( .....::i. • ~j........ vu ir.l..1. J. I re t.urn resul t : re-,t"::..}:-na D reEt!l tado pe.ra o método C-,l~.. madDr II f im elo métoelo
  • 119. conheça o APl Java Como corrigir? Precisamos de uma maneira de saber se uma célulaj á foi adi vinhada. Exami naremos algumas possibilidades , mas, primeiro, revisaremos o que sabemos até agora ... Temos uma linha virtual com sete células e um objeto DotCom ocupará três células consecutivas em algum local dessa linha. A linha virtu al abaixo exibe um objeto DotCom situado nas células das posições 4, 5 e 6. r- I- A linha virtual, com os ~ locais das três células do I- I objeto DotCom, O 1 2 3 4 5 6 o objeto DotCom tem uma variável de instância - uma matriz int - que contém os locais das células em que ele se encontra. 5;l~J A variável de instáncia. da. lna triz que contém os locais das células do objeto l~ locati o nCells « --- - DotCom. Esse objeto DotCom contém oS 3 (variáve l de instância valores 4, 5 e 6~ ESS&S são os números:h do objeto DotCom) 1 2 ~üe o usuário tem w~e adivinharA I~J ...,_ . (2) Opção um Poderíamos criar uma segunda matriz e, a cada vez que o usuário acertasse,.J-- armazenaríamos esse palpite nela, para em seguida a verif icarmos a cada vez que 1-: houvesse um acerto e saber se essa célula já foi adi vinhada. o valor I verdadeiro em um índice específico k dessa matriz significaria que a posição da falso falso verdadeiro célula nesse mesmo índice da OUTRA matriz (--- (locationCells) teria sido adivinhada. ~~~ Essa matriz contém três valores que matriz hitCells -----l>,~ I t o" 1 L (seria uma nova variável _ _ 1 óf 1 _ -2 representam o estado de cada célula da matriz de posições de células do objeto ~ DotCom. Por ex~mp1o , se a célula do indice 2 de instância de matriz for adi vinhada~ então; confi~are Q índice 2~1~ booleana do objeto DotCom) da matriz nb.itCells" com verdadeiro.-J---;}:- , A opção um é muito complicada(V=-: A opção um parece dar mais trabalho do que gostaríamos. Significa que, a cada vez que o usuário acertar, você terá que alterar o estado da segunda matriz (a matriz hitCells), ah - mas primeiro será preciso VERIFICAR a matriz hitCells para sabermos se essa célula já foi adivinhada. Funcionaria, mas tem que haver algo melhor.. . ® Opção dois Poderíamos simplesmente manter a matriz original, mas alterar o valor de qualquer célula que f osse adi v inhada para -1 . Dessa forma, só teremos UMA matriz para v erificar e manipular 4 5 -1 um valor igual a - 1 no local de uma célula especifica significaria que a célula já foi ~ A « aãivirillada, portanto só procuraríamos 11 números positivos na matriz.:5:- 1.~ locationCells1 (variável de instânc ia ~. do objeto DotCom)~ )..., A opção dois é um pouco mel hor, mas ainda bem complicada I~ . A opção dois é um pou65 menos c ompficada~ mas não é mu ito eficIente. Voce ainda teria quê percorrer todos À os três espaços (posições de índice) ela matriz, mesmo que um ou mais já fossem inválidos por tere m sido--À- - adivinhados (tendo o valor -1) . Tem que haver algo melhor.. .l1- ---- você está aqui :> 95
  • 120. código preparatório _..::.- .: ";VY..L.~U -- preparatório CD Opção três Excluiríamos cada local de célula quando ele fosse adivinhado e alteraríamos a matriz t ornando-a menor. Porém as matrizes não podem mudar de tamanho, logo, ter e mos que cri ar uma nova matriz e copiar as cél ul as r estantes d a matri z antiga para a nova ma t riz meno r. A ma t riz i n icialmente t~~ um tamanho igu al a 3, de modo que percorreremos todas as t:rês c élulas (pos ições da matriz) para procurar matriz locationCells uma coincidência ent:re o palpite do usuário ANTES de qualquer cé lula e o valor da célula (4, 5, 6). ser adivinhada 4 Quando a célula 5 for adivinhada, matriz locationCells criaremos uma nova matriz menor somen te com DEPOIS da célula 5, que os locais das células restantes e a es t ava no índice 1 da atribuiremos à variável de referência matri z, ser adivinhada o locationCells original. A opção três seria muito melhor se a matriz pudesse ser reduzida, para que não tivéssemos que criar uma nova matriz menor, copiar os valores restantes nela e reatribuir a referência.o código preparatório original referente à Tudo seria melhor se pudéssemosparte do método checkYourself( ): alterá-lo para:Repita para cada local de cé l ula da matr iz int ......... fR;pit~ p-;:~r"cad; lo~al de cél~la ~eBcente / / Compare o palpite do usuário com o local / / Compare o palpi te do usuár i o com O local da cé l ula da célula Se o palpite do u suá r io estiver correto Se o palpite do usuári o estiver correto Incremente o número de acertos ---------....j~. Remova essa célula da matr iz / / Verifique se essa foi a ú l t ima célula / / Verifique se essa foi a última célula Se o número de acertos for igua l a 3, Se agora a matriz est i ver vazia, Retorne "elimi na ção" Retorne "eliminação" Caso contrário não t erá si do uma Caso contrário não terá sido uma el iminação, portanto Retorne " co rr eto " eliminação , port ant o Ret orne " correto " End If End If Caso contrário o palpite do usuário n ão Caso contrário o palpite do usuário não coincide, portanto Retorne "errado " coin c ide, po rtanto Retorne "errado " End If End IfFim da iteração Fim da ite r ação96 cap itulo 6 * . ~ " W
  • 121. conheça o APl Java I ~ Se pelo menos eu conseguisse encontrar uma matriz que ,....., I pudesse ser reduzida quando removêssemos algo. Uma que não tivéssemos que percorrer para ve rificar cada elemento, mas em vez disso pudéssemos apenas perguntar se ela contém o que estamos procurando. Então ela permitiria que excluíssemos seus elementos, sem que tivéssemos que saber exatamente em que posição eles estão. Isso seria um sonho. Mas sei que é apenas ilusão ... i ~ I .r--" ~ J~;h :~ .ii.~ y--.., -~_."h··h~"I ! c.~~ " Anime-se e conheça a biblioteca.~t:-< Como em um passe de mágica, na verdade há algo assim.:;" ,·1.~~~~- Mas não é uma matriz, é uma ArrayList.# ·· h~~ç~~- Uma classe da biblioteca Java principal (o APl). ;r-J.-""1)/;I~ A Java Standard Edition (que é a que você deve ter a menos que esteja trabalhando com a,~ ~ Micro Edition para dispositivos pequenos e acredite, você saberia) vem com centenas de classes predefinidas. Exatamente como em nossa seção de códigos predefinidos exceto por essas classes predefinidas já terem sido compiladas. Isso significa que não é preciso digitar. Apenas use as classes. Uma das diversas classes da bibl i oteca Java. Vo c ê p o derá usá-la eln seu código como se a tivesse criado. (No ta: n a verdade o método add(Object element) tem uma aparência um p ouco ma is estranha do que o mostrado a~li ••. Chegaremos ao método r eal posteríormente no livro~ Por enquanto, apenas consiélere - o como () luétodo a d d ( ) ~1e receberá o você~~r---q:Ji Ser adicionar).::r-~ dos métodos de ArrayList" você está 97
  • 122. quando 8S matrizes não sã o suficientes .,Alaumas r:o is;::)s -..J - . - - - - . - - - - 01-- A -. I- VOr:P. - - - - OOr! A f;::) 7A r . - - - -- - -- --- . r.n m - - 0_ - Arr;::)vl = 7- ist 0," l::; ~- - 0 " ."j ", Não se preocupe com essa 110va sinta:u.e de sinaí s lnaior e menor agora; «Egg» ,;J -"~" I"J /ela. s~gnifica apenas "crie uma lista de objetos Egg com essa instrução". G) Criar um objeto Ar~ ist ~ 1· ~. Um novo objeto }!.rrayList é ArrayList<Egg> myList new ArrayList<Egg>() .! v __