Vous êtes sur la page 1sur 144

Bacharelado em Sistemas de Informao

UAPI

Mdulo II
Organizao de Sistema Metodolgico Algoritmos e Programao II

Mdulo II
Algoritmos e Programao II
Magno Santos

PRESIDENTE DA REPBLICA Luiz Incio Lula da Silva MINISTRO DA EDUCAO Fernando Haddad GOVERNADOR DO ESTADO Wellington Dias REITOR DA UNIVERSIDADE FEDERAL DO PIAU Luiz de Sousa Santos Jnior SECRETRIO DE EDUCAO A DISTNCIA DO MEC Carlos Eduardo Bielschowsky COORDENADORIA GERAL DA UNIVERSIDADE ABERTA DO BRASIL Celso Costa SECRETRIO DE EDUCAO DO ESTADO DO PIAU Antonio Jos Medeiros COORDENADOR GERAL DO CENTRO DE EDUCAO ABERTA A DISTNCIA DA UFPI Gildsio Guedes Fernandes SUPERITENDNTE DE EDUCAO SUPERIOR NO ESTADO Eliane Mendona DIRETOR DO CENTRO DE CINCIAS HUMANAS E LETRAS Antnio Fonseca dos Santos Neto COORDENADOR DO CUSO DE ADMINISTRAO A DISTNCIA Francisco Pereira da Silva Filho COODENADORA DE MATERIAL DIDTICO DO CEAD/UFPI Cleidinalva Maria Barbosa Oliveira DIAGRAMAO Emanuel Alcntara da Silva

B726c SANTOS, Magno Alves Algoritmos e Programao II / Magno Alves dos Santos Teresina: UFPI/UAPI 2008. Inclui bibliografia 1 Algoritmo. 2 Linguagem Java, 3 Programao Orientada a Objetos . I. Universidade Federal do Piau/Universidade Aberta do Piau. II. Ttulo. CDU: 32

Sumrio Geral
UNIDADE 1. FUNDAMENTOS DE PROGRAMAO ORIENTADA A OBJETOS 01 Introduo engenharia de software 02 Introduo programao de computadores 03 Histrico da Linguagem Java 04 - Instalao do Java e do NetBeans 05 Primeiro Programa Java com a IDE NetBeans 06 Entrada e Sada de Dados UNIDADE 2. ESTRUTURAS DE CONTROLE 07 Estruturas de Deciso: if-then-else, switch 08 Estruturas de Repetio: while, do-while, for 09 Estruturas de Interrupo: break, continue, return UNIDADE 3. ARRANJOS E ARGUMENTOS 10 Arranjos em Java 11 Argumentos em Java UNIDADE 4. PARADIGMA DE PROGRAMAO ORIENTADA A OBJETOS 12 Classes, Objetos e Mtodos 13 Definio de Classe em Java 14 Herana, Polimorfismo e Interface 15 Tratamento e Excees em Java APNDICES: A01 - EXERCCIOS ADICIONAIS A02 PLANO DE ENSINO A03 - AGENDA DE ATIVIDADES REFERNCIAS BIBLIOGRFICAS

07 09 21 27 31 36 46 53 56 62 69 75 77 83

89 91 107 125 138

142 145 149 151

Apresentao Apresentao

Este texto destinado aos estudantes aprendizes que participam do programa de Educao a Distncia da Universidade Aberta do Piau (UAPI) vinculada ao consrcio formado pela Universidade Federal do Piau (UFPI) Universidade Estadual do Piau (UESPI), Centro Federal de Ensino Tecnolgico do Piau (CEFET-PI), com apoio do Governo do estado do Piau, atravs da Secretaria de Educao. O texto deste compndio composto de quatro unidades, contendo quinze sub-unidades, estruturadas de modo sequencial, onde discorrem sobre os fundamentos da programao de computadores orientada a objetos. Na Unidade 1, abordamos os fundamentos de engenharia de software e da programao orientada a objetos, apresentando a anatomia de um programa orientado a objetos com seus elementos constituintes. Apresentamos os primeiros passos com a IDE NetBeans e como escrever um cdigo para ler e escrever dados na entrada e sada padro. Na Unidade 2, apresentamos as estruturas de controle de um programa em Java. Exemplificamos as estruturas de repetio incremental, repetio com teste no incio e repetio com teste no final, alm das estruturas de desvio condicional. Na Unidade 3, abordamos as estruturas de dados de arranjos homogneos e heterogneos. Trabalhamos exemplos com vetores, matrizes e adicionalmente passagem de parmetros como argumentos para um programa Na Unidade 4, so expostos contedos sobre o paradigma da programao orientada a objetos. Focamos nas definies e exemplos de classe, objeto, mensagem. Apresentamos caractersticas intrnsecas da programao OO como herana, polimorfismo e interface.

A soc sociolo iologia gia e ea a Soc Sociolo iologia gia A da Educa Fundamentos cao o de da Edu Programao Orientada a Objetos

U ni de da 1 Unidade 1

Resumo
Esta unidade tem como meta apresentar uma viso geral sobre os elementos conceituais da programao orientada a objetos. So abordados os fundamentos da engenharia de software e da programao de computadores. A anatomia de um programa em Java apresentada com suas caractersticas e funes onde se deve aprender a criar, editar, compilar e executar um dos primeiro programa em Java. Como objetivo principal, esta unidade ensina, a gerar um cdigo simples dentro dos padres mnimos exigido pela engenharia software.

Sumrio

UNIDADE 1. FUNDAMENTOS DE PROGRAMAO ORIENTADA A OBJETOS 01 Introduo engenharia de software 02 Introduo programao de computadores 03 Histrico da Linguagem Java 04 - Instalao do Java e do NetBeans 05 Primeiro Programa Java com a IDE NetBeans 06 Entrada e Sada de Dados

07 09 21 27 31 36 46

1. INTRODUO ENGENHARIA DE SOFTWARE 1.1. Engenharia de Software Uma viso em camadas Engenharia de Software uma disciplina que aplica princpios da engenharia de desenvolvimento na qualidade do software em um determinado tempo e com um custo efetivo. Usando uma abordagem sistemtica e metodolgica para produzir resultados que possam ser quantificados. Faz uso de medio e mtricas para avaliar a qualidade, no somente do software, mas tambm do processo. Utilizada para avaliar e gerenciar projetos de desenvolvimento de software. Engenharia de Software vista de modo diferente pelos diversos profissionais. Pressman sugere uma viso da engenharia de software como uma camada tecnolgica 1. Essa viso consiste em quatro camadas: foco na qualidade, processo, mtodo e ferramentas. A Figura abaixo ilustra essa viso da engenharia de software.

1.1.1. Foco na Qualidade Essa camada busca um total foco na qualidade. uma cultura onde o compromisso em melhoria continua no processo de desenvolvimento do software sustentado. Permite o desenvolvimento de mais abordagens efetivas para engenharia de software. 1.1.2. Processo Define uma estrutura, que consiste em reas de processos chave, que define e permite a entrega racional e a tempo de um software. reas de processos chave so a base para o gerenciamento de projeto de software. Estabelecem que mtodos tcnicos sejam aplicados, quais ferramentas so usadas, que produtos de trabalho precisam ser produzidos, e que marcos so definidos. Incluem a garantia que a qualidade ser mantida, e que a mudana devidamente controlada e gerenciada.

82 9

1.1.3. Mtodo Mtodos definem procedimentos sistemticos e ordenados de construo de software. Eles proporcionam uma estrutura global interna onde as atividades do engenheiro de software so realizadas. Essas atividades incluem um conjunto amplo de tarefas, tais como, anlise de requisitos, design, construo do programa, teste e manuteno. Metodologia a cincia de pensamento sistemtico, usando os mtodos ou procedimentos para uma disciplina em particular. Existem vrias metodologias da engenharia de software que so usadas atualmente. Algumas delas esto enumeradas abaixo: Metodologias Estruturadas: Informaes de Engenharia Desenvolvimento do Ciclo de Vida do Software/Ciclo de Vida do Projeto Metodologia de Desenvolvimento de Aplicao Rapid Metodologia de Desenvolvimento de Aplicao Joint Mtodo CASE* Metodologias Orientadas a Objeto: Mtodo Booch Mtodo Coad e Yourdon Mtodo Jacobson Mtodo Rambaugh Mtodo Wirfs-Brock 1.1.4. Ferramentas Promovem o suporte aos processos e mtodos. Ferramentas CASE (Computer Aided Software Engineeing) proporcionam um sistema de suporte ao projeto de desenvolvimento, onde as informaes criadas por uma ferramenta podem ser usadas por outras. Podem ser automticas ou semi-automticas. Muitas ferramentas so usadas para desenvolver modelos. Modelos so patterns (padres) de algo que foi criado ou so simplificaes. Existem dois modelos que geralmente so desenvolvidos por um engenheiro de software, especialmente, o modelo de sistema e o modelo de software. O modelo de sistema uma representao acessvel de um sistema complexo que precisa ser estudado, enquanto o modelo de software chamado de blueprint do software que precisa ser construdo. Assim como as metodologias, vrios modelos de ferramentas so usados para representar sistemas e softwares. Alguns esto descritos abaixo. Abordagem de Modelos de Ferramentas Estruturada: 10 82

Diagrama de Entidade-Relacionamento Diagrama de Fluxo de Dados Pseudocdigo Fluxograma Abordagem de Modelo de Ferramenta Orientada a Objeto: Linguagem de Modelagem Unificada (UML) 1.2. Qualidade dentro do Esforo de Desenvolvimento Conforme mencionado anteriormente, a qualidade a mente que influencia todo engenheiro de software. Focando na qualidade em todas as atividades de engenharia de software, reduz-se custo e melhora-se o tempo de desenvolvimento pela minimizao de um novo trabalho de correo. Para proceder dessa forma, um engenheiro de software tem que definir explicitamente que qualidade de software ter um conjunto de atividades que asseguraro que todo produto de trabalho da engenharia de software exibe alta qualidade, fazer controle de qualidade e atividades garantidas, o uso de mtricas para desenvolver estratgias para melhorar o produto de software e o processo. 1.2.1. O que qualidade? Qualidade a caracterstica total de uma entidade para satisfazer necessidades declaradas e implcitas. Essas caractersticas ou atributos tm que ser mensurveis de modo que possam ser comparados por padres conhecidos. 1.2.2. Como definimos qualidade? Trs perspectivas so usadas na compreenso da qualidade, especialmente, olhamos para a qualidade do produto, do processo e no contexto do ambiente de negcios. Qualidade do Produto Significa coisas diferentes para cada pessoa. relativo para uma pessoa analisar qualidade. Para os usurios finais, o software tem qualidade se fornecer o que desejam e quando desejam o tempo todo. Tambm julgam baseados na facilidade de usar e de aprender como us-lo. Normalmente avaliam e categorizam com base em caractersticas externas, tal como, nmero de falhas por tipo. Falhas podem ser categorizadas como: insignificantes, importantes e catastrficas. Para que outros possam desenvolver e manter o software, estes devem ficar de olho nas caractersticas internas em vez das externas. Exemplos que incluem erros e falhas encontradas durante as fases de anlise de requisitos, design, e codificao so normalmente feitos anteriormente ao carregamento dos produtos para os usurios finais. 82 11

Como engenheiros de software, devemos construir modelos baseados em como os requisitos dos usurios externos sero relacionados com os requisitos internos dos desenvolvedores. Qualidade do Processo Existem vrias tarefas que afetam a qualidade do software. s vezes, quando uma tarefa falha, a qualidade do software falha. Como engenheiros de softwares, devemos validar a qualidade no processo de desenvolvimento do software. Regras de processo sugerem que pela melhoria do processo de desenvolvimento do software, tambm h melhora da qualidade do produto resultante. Algumas regras de processo so demonstradas abaixo: Capability Maturity Model Integration(CMMI). Foram formulados pelo Software Engineering Institute (SEI). um processo meta-modelo que baseado em um conjunto de sistemas e competncias da engenharia de software que devem existir dentro de uma organizao. Como a mesma atinge diferentes nveis de capacidade e maturidade desses processos de desenvolvimento. ISSO 9000:2000 para Software. um padro genrico, aplicado para qualquer organizao que queira melhorar a qualidade global dos produtos, sistemas ou servios que proporciona. Software Process Improvement e Capability Determination (SPICE). um padro que define um conjunto de requisitos para avaliao do processo de software. O objetivo desse padro auxiliar organizaes a desenvolver uma anlise objetiva da eficcia de qualquer processo de software definido. Nessa perspectiva, qualidade visualizada em termos de produtos e servios sendo proporcionado pelo negcio em que o software usado. Melhorando a qualidade tcnica dos processos de negcio, agrega-se valor ao negcio, por exemplo, valor tcnico do software traduz o valor do negcio. Tambm importante medir o valor do software em termos de terminologias de negcio, tal como, quantos pedidos de venda foram processados hoje?, valor do dlar sobre o retorno em cima dos investimentos (ROI), etc. Se o software no agrega valor ao negcio, qual a necessidade de t-lo em primeiro lugar? 1.2.3. Como endereamos os pontos importantes sobre qualidade? Podemos enderear os pontos importantes sobre qualidade em:

82 12

1. Uso de padres de Qualidade. Padres de qualidade so um conjunto de princpios, procedimentos, metodologias e regras, para resumir, sobre qualidade no processo, tais como, CMMI, ISO 9000:2000 para Software e SPICE. 2. Compreender pessoas envolvidas no processo de desenvolvimento incluindo usurios finais e participantes. Sustenta um ambiente de colaborao e comunicao efetiva. 3. Compreender as tendncias sistemticas na natureza humana. Tal como, as pessoas tendem a ser contrrias ao risco quando existe uma perda potencial, so indevidamente otimistas em seus planos e projees, e preferem usar julgamentos intuitivos ao invs de modelos quantitativos. 4. Engajamento para a qualidade. Uma mente focada sobre qualidade necessria para descobrir erros e defeitos assim que possam ser endereados imediatamente. 5. Requisitos de usurios administradores porque mudaro ao longo do tempo. Requisitos a base, definindo as caractersticas da qualidade de software. 1.3. Tcnicas e Garantias de Qualidade de Software Garantia de qualidade de Software um subconjunto da engenharia de software que assegura que todos os produtos de trabalho sejam realizados, e que cumpram com as exigncias e padres estabelecidos pelos usurios. Considera-se como uma das atividades mais importantes que aplicada durante todo o processo do desenvolvimento do software. O objetivo detectar defeitos antes do software ser entregue como um produto acabado para o usurio final. Isto abrange uma aproximao eficaz da gerncia de qualidade, tecnologia de engenharia de software (mtodos e ferramentas), tcnicas formais de reviso, vrias estratgias de teste, controle de documentao de software e alteraes feitas, um procedimento para assegurar a conformidade com os padres de desenvolvimento de software, e um mecanismo para mensur-los e document-los. 1.3.1. Qualidade de Software Um software possui qualidade se ele estiver ajustado para uso, isto , se estiver trabalhando corretamente. Para que ele trabalhe corretamente, ele deve estar em conformidade com os requisitos funcionais e de performance caractersticas externas dos usurios), padres explicitamente documentados de desenvolvimento (padres de qualidade), e caractersticas implcitas (caractersticas internas aos desenvolvedores) que so esperadas por todo desenvolvimento profissional de software. Trs pontos importantes enfatizados para definir a qualidade do software. 13 82

1. Requisitos de Software so a base para a qualidade do software. necessrio explicitar, especificar e priorizar. 2. Padres definem um de critrios de desenvolvimento que iro mostrar a maneira com a qual o software ser desenvolvido. 3. Caractersticas implcitas devero ser identificadas e documentadas; elas influenciam na maneira de como o software ser desenvolvido assim como sua manutenibilidade. 1.3.2. Caractersticas para uma Boa Engenharia de Software Para definir uma boa engenharia de software, d uma olhada nas caractersticas especficas que o software apresenta. Algumas delas esto enumeradas abaixo: Usabilidade. a caracterstica do software de apresentar facilidades entre a comunicao dos usurios com o sistema. Portabilidade. a capacidade do software ser executado em diferentes plataformas e arquiteturas. Reusabilidade. a habilidade do software de se transferir de um sistema para outro. Manutenibilidade. a habilidade do software de se envolver e adaptar-se s alteraes em um curto espao de tempo. caracterizado pela fcil atualizao e manuteno. Dependncia. a caracterstica do software ser confivel e de segurana Eficincia. a capacidade do software utilizar os recursos com maior eficincia. 1.3.3. Atividades da Garantia de Qualidade de Software Garantia de Qualidade de Software composta por uma variedade de atividades com o objetivo de construir software com qualidade. Isto envolve dois grupos de desenvolvedores e a equipe de SQA (Software Quality Assurance). A equipe de SQA tem responsabilidade em garantir plenamente qualidade, supervisionar, manter, analisar e reportar defeitos. As atividades envolvidas so as seguintes: 1. A equipe de SQA prepara o Plano de SQA. Isto se d durante a fase de planejamento de projeto. Identificam-na: Avaliao a ser executada; Auditorias e revises a serem executadas; Padres que devem ser aplicados; Procedimentos de erros reportados e monitorados; Documentos que devem ser produzidos; e Conjunto de respostas que se fizer necessrio. 2. A equipe de SQA participa na descrio do processo de desenvolvimento de software. O time de desenvolvedores 82 14

escolhe o processo de desenvolvimento e a equipe de SQA deve verificar se ele se enquadra na poltica organizacional e nos padres de qualidade 3. A equipe de SQA revisa as atividades de engenharia de software empregadas pelo time de desenvolvedores para checar a conformidade com o processo de desenvolvimento de software. Eles monitoram e seguem desvios do processo do desenvolvimento do software. Documentam-no e asseguramse de que as correes sejam feitas. 4. A equipe de SQA rev o trabalho para verificar se esto conforme o padro definido. Eles monitoram e marcam defeitos e falhas encontrados em cada trabalho. 5. A equipe de SQA assegura-se que os desvios nas atividades de software e no processo de produo estejam seguramente baseados na definio de procedimentos e padres de operao 6. A equipe de SQA envia desvios e desconformidades aos padres para os gerentes ou a quem for de interesse. 1.3.4. Tcnicas Formais de Reviso Produtos de trabalho so as sadas esperadas como resultado da execuo de tarefas no processo de desenvolvimento de software. Esses resultados contribuem para o desenvolvimento de software com qualidade. Conseqentemente, devem ser mensurados e verificados novamente se vo ao encontro das exigncias e dos padres. As alteraes nos produtos de trabalho so significativas; elas podem ser monitoradas e controladas. A tcnica de checar a qualidade dos produtos de trabalho a tcnica formal de reviso. Formal Technical Reviews (FTR) so executadas em vrios pontos do processo do desenvolvimento do software. Ela serve para descobrir erros e defeitos que podem ser eliminados antes do software ser enviado para o usurio final. Especificamente, seus objetivos so: 1. Descobrir erros em funes, na lgica ou na execuo para toda a representao do software; 2. Verificar se o software sob a reviso encontra-se de acordo com os requisitos do usurio; 3. Assegurar-se que o software esteja de acordo com os padres definidos; 4. Conseguir que o software seja desenvolvido de uma maneira uniforme; e 5. Desenvolver projetos mais gerenciveis. Um guia geral de conduo das tcnicas formais de reviso est listado abaixo. Revisar o produto de trabalho e NO o desenvolvedor do produto de trabalho. O objetivo da reviso e descobrir erros e defeitos para melhorar a qualidade do software. O tom da reviso 15 82

pode ser brando, porm construtivo. Planejar e cumprir a agenda. Revises no devem durar mais de duas horas. Minimizar os debates e discusses. inevitvel que os problemas sejam levantados e isso no cause efeito nas pessoas. Lembre a todos que no hora de resolver os problemas que sero apenas documentados, uma outra reunio deve ser agendada para resolv-los. Indique reas de problema, mas no s tente resolv-las. Mencione e esclarea reas de problema. Entretanto, no hora de resolver problemas, devero ser resolvidos em uma outra reunio. Tome nota. uma boa prtica tomar nota do que foi dito e suas prioridades para que elas possam ser vistas por outros revisores. Isto ajudar a esclarecer os defeitos e aes a serem tomadas. Mantenha o nmero dos participantes a um mnimo e insista em preparar-se para a reviso. Escrever comentrios e observaes pelos revisores uma boa tcnica. Fornea uma lista de verificao para o produto de trabalho que provvel ser revista. A lista de reviso prov uma estrutura que conduza a reviso. Isto tambm ajuda os revisores a manterem o foco na questo. Programe as revises como parte do processo de desenvolvimento de software e assegure-se de que os recursos sejam fornecidos para cada revisor. Preparao prev interpretaes em uma reunio. Isto tambm ajuda os revisores a manterem o foco na questo. Sumrio da reviso. Verifica a eficcia do processo da reviso. Duas tcnicas formais de reviso do produto de trabalho usadas na indstria so Fagan's Inspection Method e Walkthroughs. 1.3.5. Mtodo de Inspeo de Fagan Introduzido por Fagan em 1976 na IBM. Originalmente foi utilizado para verificar cdigos de programas. Entretanto, pode ser estendido para incluir outros produtos de trabalho como tcnicas de documentos, modelo de elementos, projetos de cdigos e dados etc. Isto gerenciado por um moderador que responsvel por supervisionar a reviso. Isto requer uma equipe de inspetores designados a verificar se as regras do produto de trabalho vo de encontro lista de interesse preparada. mais formal que o walkthrough. A seguir esto descritas regras determinadas na qual cada participante dever aderir: As inspees so realizadas em um nmero de pontos no processo do planejamento do projeto e do desenvolvimento dos sistemas. Todas as classes com defeito so documentadas e os produtos do trabalho so inspecionados no somente a nvel lgico, de especificaes ou de funes de erros. A inspeo realizada por colegas em todos os nveis exceto o 16 82

chefe. As inspees so realizadas em uma lista prescrita das atividades. As reunies de inspeo so limitadas a duas horas. As inspees so conduzidas por um moderador treinado. Inspetores so designados a especificar regras para aumentar a eficcia. As listas de verificao dos questionrios a serem perguntados pelos inspetores so usadas para definir tarefas e estimular a encontrar defeitos. Os materiais so inspecionados minuciosamente para que seja encontrado o mximo nmero de possveis erros. Estatsticas com os tipos de erros so vitais, so utilizadas para obter anlises de uma maneira similar anlise financeira. Conduzir inspees requer muitas atividades. Elas esto categorizadas a seguir: Planejamento. O moderador deve se preparar para a inspeo. Decide quem sero os inspetores e as regras que estes devem obedecer, quem e quando desempenharo seus papis e distribuir a documentao necessria. Uma rpida apresentao. 30 minutos de apresentao do projeto dos inspetores o suficiente. Isto pode ser omitido se todos estiverem bem familiarizados com o projeto. Preparando. Cada inspetor ter de 1 a 2 horas sozinho para inspecionar o produto de trabalho. Ele ir executar as regras passadas a ele com base na documentao provida pelo moderador. Ele ir tentar descobrir defeitos no produto de trabalho. Ele no dever reparar defeitos ou criticar o desenvolvedor do produto de trabalho. Realizando a reunio. Os participantes das reunies so inspetores, moderadores e desenvolvedores do produto de trabalho. Os desenvolvedores do produto de trabalho esto presentes para explicar o produto de trabalho, e responder s perguntas que os inspetores fizerem. Nenhuma discusso se o defeito ou no real permitida. Uma lista de defeitos deve ser produzida pelo moderador. Refazendo o produto de trabalho. A lista de defeitos deve ser atribuda a uma pessoa para repar-la. Normalmente, esta o desenvolvedor do produto de trabalho. Acompanhando os reajustes. O moderador assegura-se que os defeitos nos produtos de trabalho sejam endereados e solucionados. Mais tarde este deve ser inspecionado por outro inspetor. Realizando uma reunio ocasional de anlise. Isto opcional, momento onde dada a possibilidade aos inspetores de expressarem sua viso pessoal sobre erros e melhorias. A nfase dada maneira que a inspeo foi feita. 1.3.6. Walkthrough O walkthrough menos formal que a inspeo. Aqui, o produto de trabalho e sua documentao correspondente so entregues para um time de revisores, normalmente em torno de 3 17

pessoas, onde comentrios de sua exatido so apresentados. Ao contrrio da inspeo onde um o moderador, o desenvolvedor do produto de trabalho coordena o walkthrough. Um escrivo tambm deve estar presente para documentar a lista de aes. Uma lista de aes deve ser feita a fim de melhorar a qualidade do produto final a qual inclui ajustes dos defeitos, resolues dos problemas etc. Alguns passos devem ser seguidos para obter sucesso no walkthrough. Eles esto listados abaixo: Nenhum gerente deve estar presente. Enfatizar que o walkthrough para deteco de erros e no para correo. Manter o interesse do grupo. Nenhuma contagem ou atribuio de nota. Criticar o produto; no a pessoa. Sempre documentar a lista de aes. Conduzir o walkthrough, similar inspeo, requer muitas atividades. Elas esto categorizadas como se segue: Antes do walkthrough o O desenvolvedor do produto de trabalho agenda o walkthrough, preferivelmente, com um dia de antecedncia ou dois no mximo. o Distribuir o material necessrio para o produto de trabalho dos revisores. o Pede-se especificamente que cada revisor traga pelo menos dois comentrios positivos do walkthrough e um comentrio negativo sobre o produto do trabalho. Durante o walkthrough o O desenvolvedor do produto de trabalho faz uma rpida apresentao do seu produto de trabalho. Este passo pode ser ignorado caso os revisores conheam bem o produto de trabalho. o olicitar comentrios aos revisores. s vezes, problemas so levantados e apresentados, mas no devem ser solucionados durante o walkthrough. Os problemas devero ser includos em uma lista de aes. o Uma lista de aes deve ser produzida at o fim do walkthrough. Aps o walkthrough o O desenvolvedor do produto de trabalho recebe a lista de aes. o Pede-se para enviar os estados das aes com o

18 82

apresentadas na lista de aes. o Possivelmente, um outro walkthrough deve ser agendado. 1.4. Documentao no Esforo de Desenvolvimento 1.4.1. O que documentao? um conjunto de documentos ou informaes do produto que descrevem o sistema. Cada documento desenhado para executar uma funo especfica, como: REFERNCIA, como por exemplo, especificaes tcnicas ou funcionais. INSTRUCIONAL, como por exemplo, tutoriais, demonstraes ou prottipos. MOTIVACIONAL, como por exemplo, brochuras, demonstraes ou prottipos. H vrios tipos de documentao e informaes funcionais do produto. Alguns so citados abaixo: Caractersticas e Funes do Sistema Sumrio Gerencial e do Usurio Manual do Usurio Manual de Administrao do Sistema Vdeo Multimdia Tutoriais Demonstraes Guia de Referncia Guia de Referncia Rpida Referncias Tcnicas Arquivos de Manuteno do Sistema Modelos de Teste do Sistema Procedimentos de Converso Manual de Operaes/Operador Help ON-Line Wall Charts Layout de teclado ou Templates Jornais Bons documentos no geram sistemas complicados. No entanto, eles podem ajudar de outra forma. A tabela seguinte mostra como a documentao ajuda no processo de desenvolvimento de software.

19 82

Existem dois principais propsitos da documentao. Especificamente, eles: Fornecem um argumento racional e permanente para a estrutura do sistema ou comportamento atravs dos manuais de referncia, guia do usurio e documentos de arquitetura do sistema. Servem como documentos transitrios que so parte de uma infra-estrutura envolvida em uma execuo de um projeto real como: cenrios, documentao do projeto interno, relatrio de reunies e problemas. Exerccios: 1. Discuta a viso em camadas tendo em vista no gerenciamento e desenvolvimento do software. 2. Qualidade do software a caracterstica para satisfazer necessidades declaradas e implcitas do contratante. Como mensurar estas caractersticas que do modo que possa ser comparada a padres conhecidos? 3. Pesquisa na Internet exemplos de documentao de software como: a) Manual do Usurio, b) Manual de Administrao do Sistema, c) Vdeo, Multimdia, Tutoriais, d) Demonstraes, e) Arquivos de Manuteno do Sistema, f) Manual de Operaes/Operador, g) Help ON-Line, Wall Charts. 4. Apresente um algoritmo (em fluxograma ou em passos lgicos) do fluxo de desenvolvimento do software. Apresente as fases e atividades importantes para garantir a qualidade do software. 20 82

5.

Documente o cdigo abaixo.


public class Documento { public static void main( String args[] ) { System.out.println( "Cdigo documentado!" ); { } }

Desafio: 6. A equipe de desenvolvimento responsvel pela construo do software que ir dar suporte ao sistema de informao solicitado. Em geral formado por: analista de sistemas, projetista, programadores e testadores. Qual papel de cada um no processo de engenharia do software. 2. INTRODUO PROGRAMAO DE COMPUTADORES 2.1. O que uma linguagem de programao? Uma linguagem de programao uma tcnica de comunicao padronizada para se expressar instrues para um computador. Assim como os idiomas utilizados pelos seres humanos, cada linguagem tem sua prpria sintaxe e gramtica. Linguagens de programao possibilitam ao programador especificar precisamente com quais dados o computador ir interagir, como estes dados sero gravados/transmitidos, e precisamente quais aes sero tomadas de acordo com as circunstncias. Existem diferentes tipos de linguagens de programao que podem ser usadas para a criao de programas, mas, independente da linguagem utilizada, essas instrues so traduzidas em linguagem de mquina, e podem ser entendidas por computadores. 2.2. Categorias das Linguagens de Programao 2.2.1. Linguagens de Programao de Alto Nvel Uma linguagem de programao de alto nvel uma linguagem de programao que mais amigvel para o usurio, em alguns casos independente de plataforma, e que abstrai operaes de baixo nvel como acesso a memria. Uma instruo de programao pode ser traduzida em uma ou vrias instrues de mquina por um compilador. Exemplos so Java, C, C++, Basic, Fortran 2.2.2. Linguagens de Montagem de Baixo Nvel Linguagens de montagem so similares s linguagens de 82 21

Este o ciclo de vida quando se tenta resolver um problema no computador: Para entendermos o funcionamento deste ciclo na soluo de problemas no computador, vamos definir um problema exemplo que iremos resolver passo a passo enquanto discutimos as metodologias para resoluo de problemas em detalhe.

2.3.1. Definir o problema Geralmente, um programador recebe uma tarefa na forma de um problema. Antes do programa poder ser projetado para resolver um problema em particular, o problema deve, em primeiro lugar, ser bem e claramente definido em termos dos seus requisitos de entrada e sada. Um problema claramente definido j metade da soluo. Programao de computadores requer que o problema seja primeiro definido antes de se pensar em criar a soluo. Vamos definir o problema exemplo: Crie um programa que ir determinar o nmero de vezes que um nome aparece em uma lista. 2.3.2. Analisar o problema Depois do problema ter sido definido adequadamente, o mais simples e tambm o mais eficiente e efetivo meio de se resolver ser visualiz-lo atravs de uma representao clara e objetiva. Geralmente, este passo se d com a quebra do problema em sub-problemas menores e mais simples. Problema Exemplo: Determinar o nmero de vezes que um nome aparece em uma lista Entrada para o programa: Lista de nomes, nome que se deseja procurar Sada do programa: O nmero de vezes que o nome aparece em uma lista 2.4. Projetar e representar o algoritmo Logo que o problema estiver sido claramente definido, podemos nos concentrar em desenvolver a soluo. Na programao de computadores, geralmente requerido que expressemos a soluo passo a passo. 82 22

Um Algoritmo uma especificao clara e no ambgua dos passos necessrios para se resolver o problema. Ele pode ser expresso tanto em linguagem humana (Ingls, Tagalog e Portugus), como atravs de representao grfica como fluxograma ou atravs de pseudocdigo, que um meio termo entre a linguagem humana e a linguagem de programao. Dado o problema definido na seo anterior, como podemos expressar a soluo de uma maneira simples e que possa ser entendida? Expressando a soluo atravs da linguagem humana: 1. Obter a lista de nomes, vamos cham-la de NomeLista 2. Obter o nome a ser procurado, vamos cham-lo de NomeChave 3. Criar um contador, vamos cham-lo de Conta 4. Pegar cada nome em NomeLista 5. Se NomeChave for igual ao nome selecionado em NomeLista 6. Adicionar 1 a Conta 7. Repetir 4 at que todos os nomes j tiverem sido comparados 8. Exibir o valor de Conta Expressando a soluo atravs de um fluxograma:

Expressando a soluo atravs de pseudocdigo:

23

2.4.1. Smbolos do Fluxograma e o seu significado Um fluxograma uma ferramenta de projeto usada para representar graficamente a lgica de uma soluo. Os fluxogramas, tipicamente, no mostram comandos de linguagem de programao. Ao invs disto, eles mostram o conceito em Portugus ou em notao matemtica. Aqui esto algumas dicas dos smbolos mais usados para a criao de fluxogramas. Pode-se utilizar quaisquer smbolos quando criar os seus fluxogramas, desde que use-os de maneira consistente.

2.5. Codificar e Depurar Depois de construir o algoritmo, ser possvel criar o cdigo fonte. Usando o algoritmo como base, o cdigo fonte pode ser escrito usando a linguagem de programao escolhida. Na maioria das vezes, depois do programador ter escrito o programa, este poder no estar funcionando 100% no incio. O programador deve corrigir o programa no caso de erros (tambm conhecidos como Erros de Compilao) que ocorrem no programa. Este processo chamado de depurao de erros (debug). 82 24

Existem dois tipos de erros que os programadores podero encontrar. O primeiro o erro em tempo de compilao e o outro o erro em tempo de execuo. Erro em tempo de compilao ocorre se h um erro de sintaxe no cdigo. O compilador ir detectar o erro e o programa nem mesmo compilar. Neste ponto, o programador estar inapto a criar um executvel que possa ser executado pelo usurio at que o erro seja corrigido. Esquecer um ponto-e-vrgula no final de uma instruo ou escrever um comando erroneamente, por exemplo, so erros em tempo de compilao. algo que o compilador pode detectar como sendo um erro. Compiladores no so perfeitos e ento no podem detectar todos os erros em tempo de compilao. Isso especialmente verdadeiro para erros de lgica como as repeties (loops) infinitos. Este tipo de erro chamado de erro em tempo de execuo. Por exemplo, a sintaxe do cdigo pode estar correta. Entretanto, ao seguir a lgica do cdigo, o mesmo pedao de instruo executado vrias e vrias vezes, infinitamente. Neste caso, os compiladores no so espertos o suficiente para pegar todos estes tipos de erro em tempo de compilao, conseqentemente, o programa compila corretamente em um arquivo executvel. Entretanto, quando o usurio final roda o programa, o programa (ou mesmo o computador inteiro) congela devido a uma repetio infinita. Outros tipos de erro em tempo de execuo so: um valor errado a ser computado, uma instruo errada a ser executada, etc. Exerccios: 1. Escrevendo algoritmos: Dado o seguinte conjunto de tarefas, crie um algoritmo para realizar cada uma das tarefas abaixo. Escreva os algoritmos usando pseudocdigo ou fluxogramas. a) Assar po b) Acessar o computador c) Obter a mdia de trs nmeros 2. Com base a figura abaixo, defina um problema simples, faa a anlise de como o problema ser resolvido, represente o problema em fluxograma e codifique em pseudocdigo (portugol).

25 82

Desafio: Suponha que um certo instituto deseja fazer uma pesquisa de opinio pblica. Os dados sero coletados nos bairros da vrias cidades. Os dados sero armazenados e devero ser processados para gerar os relatrios estatsticos da pesquisa. Construa um fluxograma de como ser o processo de coleta, processamento e resultados do sistema.

26 82

3 Histrico da Linguagem Java 3.1. Um pouco da histria Java foi criado em 1991 por James Gosling da Sun Microsystems. Inicialmente chamada OAK (Carvalho), em homenagem uma rvore de janela do Gosling, seu nome foi mudado para Java devido a existncia de uma linguagem com o nome OAK. A motivao original do Java era a necessidade de uma linguagem independente de plataforma que podia ser utilizada em vrios produtos eletrnicos, tais como torradeiras e refrigeradores. Um dos primeiros projetos desenvolvidos utilizando Java era um controle remoto pessoal chamado *7 (Star Seven).

Ao mesmo tempo, a World Wide Web e a Internet foram ganhando popularidade. Gosling achava que a linguagem Java poderia ser usada para programao da Internet. 3.2. O que a tecnologia Java? 3.2.1. Uma linguagem de programao Como linguagem de programao, Java pode ser utilizado para criar todos os tipos de aplicaes existentes, de programas de Inteligncia Artificial para Robs at programas para aparelhos celulares. 3.2.2. Um ambiente de desenvolvimento Como ambiente de desenvolvimento, a tecnologia Java fornece um grande conjunto de ferramentas: um compilador, um interpretador, um gerador de documentao, ferramenta de empacotamento de classes de arquivos e outros. 3.2.3. Um ambiente de aplicao Aplicaes de tecnologia Java so tipicamente programas de propsito geral que executam sobre uma mquina onde o Java Runtime Environment instalado. 82 27

3.2.4. Um ambiente de distribuio H dois ambientes de distribuio principais: Primeiro, o JRE, fornecido atravs do Java 2 Software Development Kit (SDK), contm um conjunto completo de arquivos de classes para todos pacotes de tecnologia Java. Outro ambiente de distribuio o navegador web, ou seja, o browser. Os navegadores web atuais fornecem interpretao tecnologia e ambiente Java em tempo de execuo. 3.3. Algumas caractersticas do Java 3.3.1. Mquina Virtual Java A Mquina Virtual Java uma mquina imaginria que implementada atravs de um software emulador em uma mquina real. A JVM prov especificaes de plataforma de hardware na qual compila-se todo cdigo de tecnologia Java. Essas especificaes permitem que o software Java seja uma plataforma independente pois a compilao feita por uma mquina genrica conhecida como JVM. O bytecode uma linguagem de mquina especial que pode ser entendida pela Mquina Virtual Java (JVM). O bytecode independente de qualquer hardware de computador particular. Assim, qualquer computador com o interpretador Java pode executar um programa Java compilado, no importando em que tipo de computador o programa foi compilado. 3.3.2. Garbage Collection Muitas linguagens de programao permitem ao programador alocar memria durante o tempo de execuo. Entretanto, aps utilizar a memria alocada, deve existir uma 28 82

maneira para desalocar o bloco de memria de forma que os demais programas a utilizem novamente. Em C, C++ e outras linguagens o programador o responsvel por isso. Isso, s vezes, pode ser difcil j que instncias podem ser esquecidas de serem desalocadas da memria pelos programadores e resultar no que chamamos de escapes da memria. Em Java, o programador no possui a obrigao da retirar uma varivel criada das reas de memria, isto feito por uma parte da JVM especfica que chamamos de Garbage Collection. O Garbage Collection o grande responsvel pela liberao automtica do espao em memria. Isso acontece automaticamente durante o tempo de vida do programa Java. 3.3.3. Segurana do Cdigo Segurana do Cdigo alcanada em Java atravs da implementao da Java Runtime Environment (JRE). A JRE roda cdigos compilados para a JVM e executa o carregamento de classes (atravs do Class Loader), verificao de cdigo (atravs do verificador de bytecode) e finalmente o cdigo executvel. O Class Loader responsvel por carregar todas as classes necessrias ao programa Java. Isso adiciona segurana atravs da separao do namespace entre as classes do sistema de arquivos local e aquelas que so importadas pela rede. Isso limita qualquer ao de programas que podem causar danos, pois as classes locais so carregadas primeiro. Depois de carregar todas as classes, a quantidade de memria que o executvel ir ocupar determinada. Isto acrescenta, novamente, uma proteo ao acesso no autorizado de reas restritas ao cdigo pois a quantidade de memria ocupada determinada em tempo de execuo. Aps carregar as classes e definir a quantidade de memria, o verificador de bytecode verifica o formato dos fragmentos de cdigo e pesquisa nestes fragmentos por cdigos ilegais que possam violar o direito de acesso aos objetos. Depois que tudo isso tiver sido feito, o cdigo finalmente executado. 3.4. Fases do Programa Java A figura seguinte descreve o processo de compilao e execuo de um programa Java.

29 82

O primeiro passo para a criao de um programa Java escrever os programas em um editor de texto. Exemplos de editores de texto que podem ser utilizados: bloco de notas, vi, emacs, etc. Esses arquivos so armazenados no disco rgido com a extenso .java. Aps o programa Java ter sido criado e salvo, compile o programa utilizando o Compilador Java. A sada desse processo um arquivo de bytecode com extenso .class. O arquivo .class ento lido pelo Interpretador Java que converte os bytecodes em linguagem de mquina do computador que se est usando.

Exerccios: 1. O que a tecnologia Java inovou em relao as tecnologias j existentes como C++, Delphi, Visual Basic? 2. Com base a figura abaixo, escreva um fluxograma das fases de implementao de um programa em Java. Especifique os desvios lgicos e desvios com repeties. 3. Com vista no desepenho em tempo de execuo, compare a execuo de uma aplio em Java e outra em C++ no ambiente Linux.

Desafio: Pesquise e relacione os sistemas middlewares (mquinas virtuais) existentes para linguagens e aplicativos. Descreva a funo de cada um.

30 82

4 Instalao do Java e do NetBeans 4.1. Instalando Java no Ubuntu Passo 1: No diretrio onde foi efetuado o download dos instaladores.

Passo 2: Antes de executar o instalador, assegure-se de que o arquivo seja um executvel. Para tanto, pressione o boto direito do mouse no cone do instalador, e em seguida selecione Properties. Selecione na aba Permissions, e ento marque a opo Execute. Feche a janela.

Passo 3: Duplo-clique no arquivo jdk-1_5_0_07-linux-i586.bin. A caixa de dilogo abaixo ser mostrada. Pressione o boto Run in Terminal. 31 82

No console ser mostrado o contrato de licena do software. Pressione ENTER at ser mostrada a pergunta: Do you agree to the above license terms? [yes or no]. Caso concorde com os termos apresentados digite a palavra yes e pressione a tecla ENTER . Aguarde que o instalador termine de descompactar e instale o Java. Passo 4: Devemos um caminho de pesquisa a fim de permitir a execuo de comandos java em qualquer local. Para isto, entraremos na pasta /usr/local/bin. Digitando:

Para criar os links simblicos para os comandos, tecle: sudo ln -s /usr/java/jdk1.5.0_07/bin/* .

4.2. Instalando NetBeans no Ubuntu Passo 1: V para a pasta onde estiver o instalador do NetBeans. Passo 2: Antes de executar o instalador, assegure-se de que o arquivo seja executvel. Para tanto, utilize o boto direito do mouse no cone do instalador e, em seguida selecione Properties. Selecione a aba Permissions, e marque a opo Execute. Encerre a janela. 32 82

Passo 3: Duplo-clique no arquivo de instalao do NetBeans. Pressione o boto Run in Terminal. Ser mostrada uma caixa de dilogo do NetBeans 5.5. Pressione o boto Next >.

Na prxima janela o termos da licena sero mostrados, caso concorde selecione a opo I accept the terms in the license agreement, e ento pressione o boto Next >. Modifique o nome do diretrio para: /usr/java/netbeans5.5, ento pressione o boto Next >.

33 82

Na pasta do JDK, selecione /usr/java/jdk1.5.0_07, e ento pressione o boto Next >.

A prxima caixa de dilogo mostra apenas informaes sobre o NetBeans que voc est instalando. Pressione o boto Next >. Aguarde o NetBeans terminar o processo de instalao. Pressione o boto Finish para completar a instalao. Passo 4: A fim de possibilitar a execuo do NetBeans a partir de qualquer pasta no computador, precisamos criar um caminho de pesquisa. Para isso, entramos na pasta :/usr/local/bin. com o comando: cd /usr/local/bin Crie um caminho de pesquisa para o NetBeans, digitando: sudo ln -s /usr/java/netbeans-5.5 . 34 82

possvel executar o NetBeans a partir de qualquer pasta, digitando: netbeans &

Exerccios: 1. Baixe da Internet e instale o sistema de desenvolvimento java (J2SDK) no ambiente Windowns. Edite (usando o editor padro - NotePad), compile e execute (usando linha de comando CMD) o programa Wello World. 2. Baixe da Internet e instale o sistema de desenvolvimento java (J2SDK) no ambiente Linux. Edite (usando o editor padro vi ou pico, etc), compile e execute (usando linha de comando do terminal console) o programa Wello World. 3. Baixe e instale no NetBeans no ambiente Windonws e Linux. Teste alguns exemplos.

35 82

5. PRIMEIRO PROGRAMA JAVA COM A IDE NETBEANS Antes de explicar o que o programa significa, vamos escrev-lo e execut-lo. 5.1 Utilizando a console e um editor de texto Neste exemplo utilizaremos um simples editor de texto, que pode ser o gedit do Linux, para editar o cdigo fonte. Em seguida ser necessrio abrir uma janela terminal para compilar e executar os programas. Passo 1: executar um editor de texto Para iniciar um editor de texto no Linux selecione Applications Accessories Text Editor. Passo 2: Abrir a janela de console Para abrir o terminal no Linux, selecione Applications Accessories Terminal. Passo 3: Escrever as instrues utilizando o Editor de Texto Digite as seguintes instrues no editor de textos:

Passo 4: Salvar o programa Java Chamaremos o programa de "Hello.java" e o colocaremos em uma pasta denominada "myJavaPrograms". Caso esta pasta no tenha sido criada, retorne janela de terminal aberta e insira as seguintes instrues: Para o Linux: $ md myJavaPrograms Retorne ao Editor de textos e salve o programa. Para abrir a caixa de dilogo salvar selecione a opo "File" localizada na barra de menus e depois clique na opo "Save". Selecione a nova pasta criada como myJavaPrograms para entrar nela. A pasta deve estar vazia porque ainda no salvamos nada dentro dela. 36 82

Na caixa de texto "Name", digite o nome do programa (Hello.java), e depois clique no boto salvar. Aps salvar o arquivo observe que o ttulo da janela mudou de "Untitled" para "Hello.java", caso deseje alterar novamente o arquivo basta edit-lo e depois salv-lo novamente clicando em File Save. Passo 5: Entrar na pasta que contm o programa O prximo passo deve ser o de compilar o programa. Inicialmente, precisamos entrar na pasta que o contm. Retorne janela do terminal. Em Linux: Normalmente, quando abrimos uma janela terminal, ela vai diretamente para sua pasta home (identificada por $). Para ver o que tem dentro do diretrio digite ls (LS em minscula, significando "List Sources") e pressione ENTER. Isso far com que sejam listados os arquivos e pastas da pasta home. Verifique a existncia de uma pasta chamada "myJavaPrograms", criada a pouco, sendo esta o local em que foi salvo o programa "Hello.java". Mudaremos o contexto para esta pasta. Para entrar nesta pasta devemos utilizar o comando: cd [nome da pasta]. O comando "cd" significa "Change Directory". Digitaremos: $ cd myJavaPrograms Agora que estamos dentro da pasta onde o arquivo do programa est, poderemos ento compillo. Certifique-se de que o arquivo est realmente dentro desta, executando o comando ls (LS em minscula) novamente. Passo 6: Compilar o programa Para compilar o programa, utilizamos o comando: javac [Nome do Arquivo]. Ou seja: javac Hello.java Durante a compilao, criado o arquivo: [Nome do Arquivo].class, neste caso, Hello.class, que contm o cdigo em linguagem de mquina (chamado de bytecode). Passo 7: Executar o programa Assumindo que no ocorreu problemas na compilao (caso tenha ocorrido qualquer problema refaa os passos realizados), estamos prontos para executar o programa. Para executar o programa, utilizamos o comando: java [nome do arquivo sem a extenso]. No caso do exemplo, digite: 37 82

java Hello Veremos na mesma tela, em que foi executado o comando, a seguinte mensagem: Hello world! 5.2 Erros Vimos um pequeno programa Java, geralmente no encontraremos qualquer problema para compilar e executar esses programas, entretanto nem sempre este o caso, como mencionamos na primeira parte deste curso, ocasionalmente encontramos erros durante esse processo. Como mencionamos antes, h dois tipos de erros: o primeiro pode ocorrer durante a compilao, chamado de erro de sintaxe, o segundo pode ocorrer durante a execuo, chamado runtime error. 5.2.1 Erros de Sintaxe Os erros de sintaxe normalmente so erros de digitao, ocasionados pelo programador que pode ter se equivocado e digitar uma instruo errada, ou por esquecimento de alguma parte da instruo, por exemplo, um ponto e vrgula. O Compilador tenta isolar o erro exibindo a linha de instruo e mostrando o primeiro caractere incorreto naquela linha, entretanto, um erro pode no estar exatamente neste ponto. Outros erros comuns so a troca de letras, troca de letras maiscula por minscula (a linguagem Java completamente case-sensitive, ou seja, o caractere "a" completamente diferente do caractere "A", e o uso incorreto da pontuao. Vamos retornar ao exemplo, o programa Hello.java. Intencionalmente, escreveremos a palavrachave "static" de forma errada e omitiremos o ponto-e-vrgula em uma instruo e a deixaremos errada.

Salve o programa e execute os passos necessrios para compil-lo. Observe a mensagem de erro gerada ao se tentar compilar novamente o programa na imagem da pgina seguinte : 38 82

A primeira mensagem de erro sugere que existe um erro na linha 6 do programa apontado para a palavra void, entretanto esta palavra est correta. O erro na palavra anterior statict que deve ser digitada como static. A segunda mensagem de erro sugere que faltou um ponto-e-vrgula na linha 10, entretanto, esta contm simplesmente o comando de fechar o bloco do mtodo main. O erro est exatamente na linha anterior. Como regra, ao encontrar muitas mensagens de erros devemos corrigir o primeiro erro da lista e tente novamente compilar o programa. Deste modo reduziremos o nmero total de mensagens de erro dramaticamente, pois podem existir o que chamamos de erros derivados, ou seja, um erro que tem por causa a instruo anterior. 5.2.2 Erros em tempo de execuo (Erros de run-time) Os erros em tempo de execuo so erros que no aparecero at que tentemos executar o programa. Os programas so compilados com sucesso, mas apresentaro respostas erradas, que podem ter como causa se o programador no obedeceu uma lgica coerente ou no caso em erro de estruturas do programa. 5.3. Usando NetBeans Construmos o programa sem utilizar nenhum recurso sofisticado, iremos aprender como fazer todo o processo da seo anterior utilizando uma IDE. Nesta parte da lio utilizaremos o NetBeans que um Ambiente de Desenvolvimento Integrado ( I D E - I n t e g r a t e d Development Environment). Um ambiente de desenvolvimento integrado um software aplicativo que possui uma interface construtora, um editor de texto, um editor de cdigo, um compilador e/ou interpretador e um depurador. Passo 1 : executar o NetBeans Para executar o NetBeans por intermdio da linha de comando, abra uma janela terminal (Os passos para abrir a janela terminal foram discutidos anteriormente) e digite:

39 82

Depois de abrir a IDE NetBeans ser mostrada a interface grfica GUI, conforme Figura.

Passo 2: construir o projeto

Clique em File New Project, depois de fazer isso, uma janela de dilogo aparecer. Neste momento deve-se clicar em "Java Application" e em seguida clicar no boto "Next >".

Ser mostrada uma nova janela de dilogo, conforme a figura.

40 82

Troque o local da aplicao clicando no boto "Browse...". Aparecer uma janela de dilogo para localizao do diretrio. D um clique duplo no seu diretrio home.

O contedo da raiz do diretrio ser apresentado. D um clique duplo no diretrio MYJAVAPROGR AMS e depois d um clique no boto "Open".

Veja que a localizao do projeto mudou para /home/florence/M YJAVAPROGRA MS. Finalmente, no campo "Create Main Class", digite "Hello", que ser o nome da classe principal, e em seguida clique no boto "Finish".

82 41

Passo 3: escrever os detalhes do programa Antes de escrever o programa descreveremos a janela principal. Como mostrado na figura abaixo, automaticamente, o NetBeans cria um cdigo bsico para o programa Java. Poderemos adicionar as declaraes neste cdigo gerado. No lado esquerdo da janela visualizamos uma lista de pastas e arquivos que o NetBeans gerou antes de criar o projeto. Tudo se encontra dentro da sua pasta MYJAVAPROGRAMS, onde foi configurado o local do projeto. No lado direito, visualizamos o cdigo gerado.

Modifique o cdigo gerado pelo NetBeans, por hora ignoraremos as outras partes das instrues discutindo os detalhes destas posteriormente. Insira a seguinte instruo: System.out.println("Hello world!"); Isto significa que voc deseja que seja mostrada a mensagem "Hello world!" na sada padro do computador, em seguida seja feito um salto de linha. Poderamos substituir esta instruo por duas equivalentes: System.out.print("Hello"); System.out.println(" world!"); O mtodo print() faz com que no seja provocado o salto de linha, utilizaremos para este exemplo a primeira instruo. Insira esta instruo aps a linha de comentrio (que ser desprezada pelo compilador): 82 42

//TODO code application logic here.

Passo 4 : compilar o projeto Para compilar o programa, a partir do Menu Principal selecione Build Build Main Project, ou utilize a tecla de atalho F11, ou utilize o boto de atalho para compilar o cdigo.

43

Se no existir erros no programa, veremos a mensagem de sucesso na janela de sada.

Passo 5: Executar o projeto

Para executar o programa, clique em Run Run Main Project, ou utilize a tecla de atalho F6, ou utilize o boto de atalho para executar o programa.

O resultado final do programa ser mostrado na janela de sada.

82 44

Exerccios: 1. Baixe e instale no NetBeans no ambiente Windonws e Linux. Teste alguns exemplos inclusive o Hello World 2. Melhore o Hello World. Utilizando o NetBeans crie uma classe chamada [MeuNome], o programa dever mostrar como resultado a mensagem: Welcome to Java Programming [MeuNome]!!! 3. Utilizando o NetBeans, crie uma classe chamada TheTree. O programa dever mostrar as seguintes linhas na sada: Estou aprendendo a usar a IDE NetBeans Minha produtividade vai melhorar O desenvolvimento fica facilitado

Desafio: Baixe da Internet e instale a IDE, bastante conhecida pelo desenvolvedores Java, chamada Eclipse http://www.eclipse.org/. Instale no ambiente Win ou Linux. Execute o memo aplicativo Wello World. Descreva as dificuldades de manipulao entre o Eclipse e o NetBeans.

45

6. ENTRADA E SADA DE DADOS 6.1. BufferedReader para capturar dados Primeiramente, utilizaremos a classe BufferedReader do pacote java.io para capturar dados de entrada atravs do teclado. Passos para capturar os dados digitados, tomemos por base o programa visto na lio anterior: 1. Digite a seguinte instruo no incio do programa: import java.io.*; 2. Adicione as seguintes instrues no corpo do mtodo main: BufferedReader dataIn = new BufferedReader( new InputStreamReader(System.in)); 3. Declare uma varivel temporria do tipo String para gravar os dados digitados pelo usurio e chame o mtodo readLine() que vai capturar linha por linha do que o usurio digitar. Isso dever ser escrito dentro de um bloco try-catch para tratar possveis excees. try { String temp = dataIn.readLine(); } catch (IOException e) { System.out.println("Error in getting input"); } Abaixo, segue o programa completo: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class GetInputFromKeyboard { public static void main(String[] args) { BufferedReader dataIn = new BufferedReader(new InputStreamReader(System.in)); String name = ""; System.out.print("Please Enter Your Name:"); try { name = dataIn.readLine(); } catch (IOException e) { System.out.println("Error!"); } System.out.println("Hello " + name +"!"); } } Faremos uma anlise deste programa linha por linha: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; 46 82

Estas linhas acima mostram que estamos utilizando as classes BufferedReader, InputStreamReader e IOException cada qual dentro do pacote java.io. Essas APIs ou Interfaces de Programao de Aplicaes (Application Programming Interface) contm centenas de classes pr-definidas que se pode usar nos programas. Essas classes so organizadas dentro do que chamamos de pacotes. Pacotes contm classes que se relacionam com um determinado propsito. No exemplo, o pacote java.io contm as classes que permitem capturar dados de entrada e sada. Estas linhas poderiam ser reescritas da seguinte forma: import java.io.*; que importar todas as classes encontradas no pacote java.io, deste modo possvel utilizar todas classes desse pacote no programa. As prximas linhas: public class GetInputFromKeyboard { public static void main( String[] args ) { j foram discutidas na lio anterior. Isso significa que declaramos uma classe nomeada GetInputFromKeyboard e, em seguida, iniciamos o mtodo principal (main). Na instruo: BufferedReader dataIn = new BufferedReader(new InputStreamReader(System.in)); declaramos a varivel dataIn do tipo BufferedReader. No se preocupe com o significado da sintaxe, pois ser abordado mais frente. A seguir, declaramos a varivel name do tipo String: String name = ""; na qual armazenaremos a entrada de dados digitada pelo usurio. Note que foi inicializada como uma String vazia "". uma boa prtica de programao inicializar as variveis quando declaradas. Na prxima instruo, solicitamos que o usurio escreva um nome: System.out.print("Please Enter Your Name:"); As seguinte linhas definem um bloco try-catch: try { name = dataIn.readLine(); } catch (IOException e) { System.out.println("Error!"); } que asseguram, caso ocorram excees sero tratadas. 82 47

Falaremos sobre o tratamento de excees na ltima parte deste curso. Por hora, necessrio adicionar essas linhas para utilizar o mtodo readLine() e receber a entrada de dados do usurio. Em seguida: name = dataIn.readLine(); capturamos a entrada dos dados digitados pelo usurio e as enviamos para a varivel String criada anteriormente. A informao guardada na varivel name. Como ltima instruo: System.out.println("Hello " + name + "!"); montamos a mensagem final para cumprimentar o usurio. PRATICANDO! Digite (retire no nmero das linhas, coloque a identao e documentao) o programa abaixo e execute. Veja a forma de dilogo. Observer a forma de converso de dados parseInt.
1. import javax.swing.*; 2. 3. public class InputTest 4. { 5. public static void main(String[] args) 6. { 7. // get first input 8. String name = JOptionPane.showInputDialog 9. ("What is your name?"); 10. 11. // get second input 12. String input = JOptionPane.showInputDialog 13. ("How old are you?"); 14. 15. // convert string to integer value 16. int age = Integer.parseInt(input); 17. 18. // display output on console 19. System.out.println("Hello, " + name + 20. ". Next year, you'll be " + (age + 1)); 21. 22. System.exit(0); 23. } 24. }

48 82

6.2. Classe Scanner para capturar dados Vimos uma maneira para obter dados de entrada atravs do teclado. O JDK 5.0 lanou uma nova classe chamada Scanner que engloba diversos mtodos para facilitar este servio. Abaixo, segue o programa completo utilizando esta classe: import java.util.Scanner; public class GetInputFromScanner { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Please Enter Your Name:"); String name = sc.next(); System.out.println("Hello " + name +"!"); } } Compare-o com o programa visto anteriormente. Percebe-se que fica mais simples conseguir a mesma funcionalidade. Inicialmente, definimos a chamada ao pacote que contm a classe Scanner: import java.util.Scanner; Em seguida, as instrues que define a classe e o mtodo main: public class GetInputFromScanner { public static void main(String[] args) { Definimos uma varivel, denominada sc, que ser criada a partir da classe Scanner e direcionada para a entrada padro: Scanner sc = new Scanner(System.in); De forma semelhante, mostramos uma mensagem solicitando informao do usurio: System.out.println("Please Enter Your Name:"); Utilizamos a varivel sc para chamarmos o mtodo que far o recebimento dos dados digitados: String name = sc.nextLine(); A classe Scanner possui diversos mtodos que podem ser utilizados para realizar este servio. Os principais mtodos que podemos utilizar, neste caso, so: 49 82

Por fim, mostramos o resultado e encerramos o mtodo main e a classe: System.out.println("Hello " + name +"!"); } } 6.3. Utilizando a JOptionPane para receber dados Um outro modo de receber os dados de entrada utilizar a classe JOptionPane, que pertence ao pacote javax.swing. A JOptionPane possui mtodos que conseguem criar caixas de dilogo na qual o usurio pode informar ou visualizar algum dado. Dado o seguinte cdigo: import javax.swing.JOptionPane; public class GetInputFromKeyboard { public static void main( String[] args ){ String name = ""; name = JOptionPane.showInputDialog("Please enter your name"); String msg = "Hello " + name + "!"; JOptionPane.showMessageDialog(null, msg); } } Essa classe apresentar o seguinte resultado:

50 82

A primeira instruo: import javax.swing.JOptionPane; mostra que estamos importando a classe JOptionPane do pacote javax.swing. Poderamos, de forma semelhante, escrever estas instrues do seguinte modo: import javax.swing.*; A instruo seguinte: name = JOptionPane.showInputDialog("Please enter your name"); cria uma caixa de entrada que exibir um dilogo com uma mensagem, um campo de texto para receber os dados do usurio e um boto OK, conforme mostrado na figura 1. O resultado ser armazenado na varivel do tipo String name. Na prxima instruo, criamos uma mensagem de cumprimento, que ficar armazenada na varivel msg: String msg = "Hello " + name + "!"; Finalizando a classe, exibiremos uma janela de dilogo que conter a mensagem e o boto de OK, conforme mostrado na figura pgina anterior. JOptionPane.showMessageDialog(null, msg);

Exerccios: 1. Utilizando a classe BufferedReader ou Scanner, capture trs palavras digitadas pelo usurio e mostre-as como uma nica frase na mesma linha. Por exemplo: Palavra 1: Meu nome Palavra 2: Palavra 3: Jesus Sada : Meu nome Jesus

2. Utilizando a classe JOptionPane, capture palavras em trs caixas de dilogos distintas e mostre-as como uma nica frase. Por exemplo utilizaremos a figura da pgina a seguir : 51

3. Digite (sem nro de linha e identado), compile e execute o programa abaixo. Estude o programa, diga o que faz e coloque os comentrios em cada linha.
1. import javax.swing.*; 2. 3. public class SimpleFrameTest 4. { 5. public static void main(String[] args) 6. { 7. SimpleFrame frame = new SimpleFrame(); 8. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 9. frame.show(); 10. } 11. } 12. 13. class SimpleFrame extends JFrame 14. { 15. public SimpleFrame() 16. { 17. setSize(WIDTH, HEIGHT); 18. } 19. 20. public static final int WIDTH = 300; 21. public static final int HEIGHT = 200; 22. }

52 82

Unidade 2
Estruturas de controle

Resumo
Esta unidade tem como meta principal apresentar as estruturas de controles bsicas como: desvios condicionais simples (if/then) e compostos (if/then/else), e repeties condicionais com teste no incio (while/for) e no final (do/while) das estruturas da programao Java. Estas estruturas so importantes na especificao de algoritmos, pois de acordo com as entradas o fluxo de execuo do algoritmo pode ser alterado. O principal objetivo desta unidade trabalhar com exemplos das estruturas de controle condicional para desenvolver a capacidade de abstrao na especificao dos algoritmos de acordo com os problemas apresentados.

Sumrio
UNIDADE 2. ESTRUTURAS DE CONTROLE 07 Estruturas de Deciso: if-then-else, switch 08 Estruturas de Repetio: while, do-while, for 09 Estruturas de Interrupo: break, continue, return 53 56 62 69

54 82

7. ESTRUTURA DE CONTROLE DE DECISO IF-THEN-ELSE SWITCH Estruturas de controle de deciso so instrues em linguagem Java que permitem que blocos especficos de cdigo sejam escolhidos para serem executados, redirecionando determinadas partes do fluxo do programa. 7.1. Declarao if A declarao if especifica que uma instruo ou bloco de instrues seja executado se, e somente se, uma expresso lgica for verdadeira. A declarao if possui a seguinte forma: if (expresso_lgica) instruo; ou: if (expresso_lgica) { instruo1; instruo2 ... } onde, expresso_lgica representa uma expresso ou varivel lgica. Dicas de programao: 1. Expresso lgica uma declarao que possui um valor lgico. Isso significa que a execuo desta expresso deve resultar em um valor true ou false. 2. Coloque as instrues de forma que elas faam parte do bloco if. Por exemplo: if (expresso_lgica ){ // instruo1; // instruo2; }

Por exemplo, dado o trecho de cdigo: int grade = 68; if (grade > 60) Stem.out.println (Congratulations!"); ou: int grade = 68; if (grade > 60) { System.out.println("Congratulations!"); System.out.println("You passed!"); } 56 82

Instruo Simples

Instrues em Bloco

7.2. Declarao if-else A declarao if-else usada quando queremos executar determinado conjunto de instrues se a condio for verdadeira e outro conjunto se a condio for falsa. Possui a seguinte forma: if (expresso_lgica) instruo_caso_verdadeiro; else instruo_caso_falso; Tambm podemos escrev-la na forma abaixo: if (expresso_lgica) { instruo_caso_verdadeiro1; instruo_caso_verdadeiro2; ... } else { instruo_caso_falso1; instruo_caso_falso2; ... } Por exemplo, dado o trecho de cdigo: int grade = 68; if (grade > 60) System.out.println("Congratulations! You passed!"); else System.out.println("Sorry you failed"); ou: int grade = 68; if (grade > 60) { System.out.print("Congratulations! "); System.out.println("You passed!"); } else { System.out.print("Sorry "); System.out.println("you failed"); }

Dicas de programao: 1. Para evitar confuso, sempre coloque a instruo ou instrues contidas no bloco if ou if-else entre chaves {}. 2. Pode-se ter declaraes if-else dentro de declaraes if-else, por exemplo: if (expresso_lgica) { if (expresso_lgica) { ... }else { ... } }else { ... }

57 82

7.3. Declarao if-else-if A declarao else pode conter outra estrutura if-else. Este cascateamento de estruturas permite ter decises lgicas muito mais complexas. A declarao if-else-if possui a seguinte forma: if (expresso_lgica1) instruo1; else if(expresso_lgica2) instruo2; else instruo3; Podemos ter vrias estruturas else-if depois de uma declarao if. A estrutura else opcional e pode ser omitida. No exemplo mostrado acima, se a expresso_lgica1 verdadeira, o programa executa a instruo1 e salta as outras instrues. Caso contrrio, se a expresso_lgica1 falsa, o fluxo de controle segue para a anlise da expresso_lgica2.

Se esta for verdadeira, o programa executa a instruo2 e salta a instruo3. Caso contrrio, se a expresso_lgica2 falsa, ento a instruo3 executada.

Observe um exemplo da declarao if-else-if no seguinte trecho de cdigo: public class Grade { public static void main( String[] args ) { double grade = 92.0; if (grade >= 90) { System.out.println("Excellent!"); } else if((grade < 90) && (grade >= 80)) { System.out.println("Good job!"); } else if((grade < 80) && (grade >= 60)) { System.out.println("Study harder!"); } else { System.out.println("Sorry, you failed."); } } 58 82 }

7.4. Erros comuns na utilizao da declarao if 1. A condio na declarao if no avalia um valor lgico. Por exemplo: // ERRADO int number = 0; if (number) { // algumas instrues aqui } a varivel number no tem valor lgico. 2. Usar = (sinal de atribuio) em vez de == (sinal de igualdade) para comparao. Por exemplo: // ERRADO int number = 0; if (number = 0) { // algumas instrues aqui } 3. Escrever elseif em vez de else if. // ERRADO int number = 0; if (number == 0) { // algumas instrues aqui } elseif (number == 1) { // algumas instrues aqui } 7.5. Declarao switch Outra maneira de indicar uma condio atravs de uma declarao switch. A construo switch permite que uma nica varivel inteira tenha mltiplas possibilidades de finalizao. A declarao switch possui a seguinte forma: switch (varivel_inteira) { case valor1: instruo1; instruo2; ... // break; case valor2: instruo1; instruo2; ... // break; default: instruo1 instruo2; ... // break; } 59 82

Notas: 1. Ao contrrio da declarao if, mltiplas instrues so executadas sem a necessidade das chaves que determinam o incio e trmino de bloco {}. 2. Quando um case for selecionado, todas as instrues vinculadas ao case sero executadas. Alm disso, as instrues dos case seguintes tambm sero executadas. 3. Para prevenir que o programa execute instrues dos outros case subseqentes, utilizamos a declarao break aps a ltima instruo de cada case.

// // bloco 1

// // bloco 2

; // // bloco n

onde, varivel_inteira uma varivel de tipo byte, short, char ou int. valor1, valor2, e assim por diante, so valores constantes que esta varivel pode assumir. Quando a declarao switch encontrada, o fluxo de controle avalia inicialmente a varivel_inteira e segue para o case que possui o valor igual ao da varivel. O programa executa todas instrues a partir deste ponto, mesmo as do prximo case, at encontrar uma instruo break, que interromper a execuo do switch. Se nenhum dos valores case for satisfeito, o bloco default ser executado. Este um bloco opcional. O bloco default no obrigatrio na declarao switch.

7.6. Exemplo para switch public class Grade { public static void main(String[] args) { int grade = 92; switch(grade) { case 100: System.out.println("Excellent!"); break; case 90: System.out.println("Good job!"); break; case 80: System.out.println("Study harder!"); break; default: System.out.println("Sorry, you failed."); } 60 82

Dicas de Programao: 1. A deciso entre usar uma declarao if ou switch subjetiva. O programador pode decidir com base na facilidade de entendimento do cdigo, entre outros fatores. 2. Uma declarao if pode ser usada para decises relacionadas a conjuntos, escalas de variveis ou condies, enquanto que a declarao switch pode ser utilizada para situaes que envolvam varivel do tipo inteiro. Tambm necessrio que o valor de cada clusula case seja nico, subseqentes, utilizamos a declarao break aps a ltima instruo de cada case.

Compile e execute o programa acima e veremos que o resultado ser: Sorry, you failed. pois a varivel grade possui o valor 92 e nenhuma das opes case atende a essa condio. Note que para o caso de intervalos a declarao if-else-if mais indicada. Exerccios: 1. Obtenha do usurio trs notas de exame e calcule a mdia dessas notas. Reproduza a mdia dos trs exames. Junto com a mdia, mostre tambm um :-) no resultado se a mdia for maior ou igual a 60; caso contrrio mostre :-( Faa duas verses deste programa: a) Use a classe BufferedReader (ou a classe Scanner) para obter as notas do usurio, e System.out para mostrar o resultado. b) Use JOptionPane para obter as notas do usurio e para mostrar o resultado. 2. Solicite ao usurio para digitar um nmero, e mostre-o por extenso. Este nmero dever variar entre 1 e 10. Se o usurio introduzir um nmero que no est neste intervalo, mostre: "nmero invlido". Faa duas verses deste programa: a) Use uma declarao if-else-if para resolver este problema b) Use uma declarao switch para resolver este problema 3. Escreva um programa para calcular o valor da fatura do consumo de energia eltrica. O programa tem como entrada o consumo em Kilo Watt ms. O valor da conta calculado baseado na faixa de consumo progressivo: a) de 1 a 50 Kw, computa-se R$ 0,50 por Kw consumido b) de 51 a 100 Kw, computa-se R$ 1,00 c) de 101 a 150 Kw, computa-se R$ 2,00 d) acimda de 150 Kw, computa-se R$ 3,00 Por exemplo: Um consumo de 157 Kw/ms gera uma fatura de: (50 x 0,50) + (50 x 1,00) + (50 x 2,00) + (7 x 3,00) = R$ 196,00 Desafio O que faz o program abaixo? O que imprime como sada? public class Mystery { public static void main( String args[] ) { int y, x = 1, total = 0; while ( x <= 10 ) { y = x * x; System.out.println( y ); total += y; ++x; } System.out.println( "Total is " + total ); } } 82 61

8. ESTRUTURA DE CONTROLE DE REPETIO: WHILE, DOWHILE, FOR 8.1. Estruturas de controle de repetio Estruturas de controle de repetio so comandos em linguagem Java que permitem executar partes especficas do cdigo determinada quantidade de vezes. Existem 3 tipos de estruturas de controle de repetio: while, do-while e for. A figura abaixo apresenta a anatomia de um program em Java com os elementos mais relevantes da linguagem. Em geral a maioria da aplicaes em Java so baseadas neste modelo.

8.2. Declarao while A declarao while executa repetidas vezes um bloco de instrues enquanto uma determinada condio lgica for verdadeira. A declarao while possui a seguinte forma: while (expresso_lgica) { instruo1; instruo2; ... }

62 82

As instrues contidas dentro do bloco while so executadas repetidas vezes enquanto o valor de expresso_lgica for verdadeira. Por exemplo, dado o trecho de cdigo: int i = 4; while (i > 0){ System.out.print(i); i--; } O cdigo acima ir imprimir 4321 na tela. Se a linha contendo a instruo i-- for removida, teremos uma repetio infinita, ou seja, um cdigo que no termina. Portanto, ao usar laos while, ou qualquer outra estrutura de controle de repetio, tenha a certeza de utilizar uma estrutura de repetio que encerre em algum momento. PRATICANDO! Digite os exemplos abaixo e observe como funciona a instruo while em diversar formas. Lembre-se da anatomia de um cdigo em Java. Exemplo 1: int x = 0; while (x<10) { System.out.println(x); x++; } Exemplo 2: // lao infinito while (true) System.out.println("hello"); Exemplo 3: // a instruo do lao no ser executada while (false) System.out.println("hello");

8.3. Declarao do-while A declarao do-while similar ao while. As instrues dentro do lao do-while sero executadas pelo menos uma vez.

63

A declarao do-while possui a seguinte forma: do { instruo1; instruo2; ... } while (expresso_lgica);

Inicialmente, as instrues dentro do lao do-while so executadas. Ento, a condio na expresso_lgica avaliada. Se for verdadeira, as instrues dentro do lao do-while sero executadas novamente. A diferena entre uma declarao while e do-while que, no lao while, a avaliao da expresso lgica feita antes de se executarem as instrues nele contidas enquanto que, no lao do-while, primeiro se executam as instrues e depois realiza-se a avaliao da expresso lgica, ou seja, as instrues dentro em um lao do-while so executadas pelo menos uma vez. PRATICANDO! Experimente executar os trechos de cdigo abaixo. Analise o que ocorre. Exemplo 1: int x = 0; do { System.out.println(x); x++; } while (x<10); Este exemplo ter 0123456789 escrito na tela. Exemplo 2: // lao infinito do { System.out.println("hello"); } while(true); Exemplo 3: // Um lao executado uma vez do System.out.println(hello); while (false); 64 82 Dicas de programao: 1. Erro comum de programao ao utilizar o lao dowhile esquecer o ponto-evrgula (;) aps a declarao while. do { ... } while (boolean_expression) // ERRADO -> faltou; 2. Como visto para a declarao while, tenha certeza que a declarao do-while poder terminar em algum momento.

O exemplo anterior mostrar a palavra hello escrita na tela infinitas vezes. 8.4. Declarao for A declarao for, como nas declaraes anteriores, permite a execuo do mesmo cdigo uma quantidade determinada de vezes. A declarao for possui a seguinte forma: for (declarao_inicial; expresso_lgica; salto) { instruo1; instruo2; ... } onde: declarao_inicial inicializa uma varivel para o lao expresso_lgica compara a varivel do lao com um valor limite salto atualiza a varivel do lao

Um exemplo para a declarao for : for (int i = 0; i < 10; i++) { System.out.print(i); } Neste exemplo, uma varivel i, do tipo int, inicializada com o valor zero. A expresso lgica "i menor que 10" avaliada. Se for verdadeira, ento a instruo dentro do lao executada. Aps isso, a expresso i ter seu valor adicionado em 1 e, novamente, a condio lgica ser avaliada. Este processo continuar at que a condio lgica tenha o valor falso. 65 82

Este mesmo exemplo, utilizando a declarao while, mostrado abaixo: int i = 0; while (i < 10) { System.out.print(i); i++; }

PRATICANDO! 1.Modifique o programa abaixo com a estrutura for para incrementar e decrementar valores de c.

// Increment.java public class Increment { // main method begins execution of Java application public static void main( String args[] ) int c; c = 5; System.out.println( c ); // print 5 System.out.println( c++ ); // print 5 then postincrement System.out.println( c ); // print 6 System.out.println(); // skip a line c = 5; System.out.println( c ); // print 5 System.out.println( ++c ); // preincrement then print 6 System.out.println( c ); // print 6 } // end method main } // end class Increment

66 82

2. Digite o programa abaixo e estude com ele funciona. Remove nos nro de linha e faa a identao do cdigo
1 // Average2.java 2 // Class average program with sentinel-controlled repetition. 3 4 // Java core packages 5 import java.text.DecimalFormat; 67 // Java extension packages 8 import javax.swing.JOptionPane; 9 10 public class Average2 { 11 12 // main method begins execution of Java application 13 public static void main( String args[] ) 14 { 15 int gradeCounter, // number of grades entered 16 gradeValue, // grade value 17 total; // sum of grades 18 double average; // average of all grades 19 String input; // grade typed by user 20 21 // Initialization phase 22 total = 0; // clear total 23 gradeCounter = 0; // prepare to loop 24 25 // Processing phase 26 // prompt for input and read grade from user 27 input = JOptionPane.showInputDialog( 28 "Enter Integer Grade, -1 to Quit:" ); 29 30 // convert grade from a String to an integer 31 gradeValue = Integer.parseInt( input ); 32 33 while ( gradeValue != -1 ) { 34 35 // add gradeValue to total 36 total = total + gradeValue; 37 38 // add 1 to gradeCounter 39 gradeCounter = gradeCounter + 1; 40 41 // prompt for input and read grade from user 42 input = JOptionPane.showInputDialog( 43 "Enter Integer Grade, -1 to Quit:" ); 44 45 // convert grade from a String to an integer 46 gradeValue = Integer.parseInt( input ); 47 } 48 49 // Termination phase 50 DecimalFormat twoDigits = new DecimalFormat( "0.00" ); 51 52 if ( gradeCounter != 0 ) { 53 average = (double) total / gradeCounter; 54 55 // display average of exam grades 56 JOptionPane.showMessageDialog( null, 57 "Class average is " + twoDigits.format( average ), 58 "Class Average", JOptionPane.INFORMATION_MESSAGE ); 59 } 60 else 61 JOptionPane.showMessageDialog( null, 62 "No grades were entered", "Class Average", 63 JOptionPane.INFORMATION_MESSAGE ); 64 65 System.exit( 0 ); // terminate application 66 67 } // end method main 68 69 } // end class Average2

67 82

Exerccios: 1. Crie um programa que mostre seu nome cem vezes. Faa trs verses deste programa: a) Use uma declarao while para resolver este problema b) Use uma declarao do-while para resolver este problema c) Use uma declarao for para resolver este problema 2. Receba como entrada um nmero e um expoente. Calcule este nmero elevado ao expoente. Faa trs verses deste programa: a) Use uma declarao while para resolver este problema b) Use uma declarao do-while para resolver este problema3. c) Use uma declarao for para resolver este problema 3. O que o programa abaixo faz:
// Faz algo public class Calculate { public static void main( String args[] ) { int sum, x; x = 1; sum = 0; while ( x <= 10 ) { sum += x; ++x; } System.out.println( "The sum is: " + sum ); } }

Desafio Encontre e faa a devida correo dos erros em cada um dos fragmentos de cdigo abaixo.
// Cod A x = 1; while ( x <= 10 ); x++; }

// Cod B switch ( n ) { case 1: System.out.println( "The number is 1" ); case 2: System.out.println( "The number is 2" ); break; default: System.out.println( "The number is not 1 or 2" ); break; }

// Cod C imprime valores de 1 a 10 n = 1; while ( n < 10 ) System.out.println( n++ );

// Cod D for ( y = .1; y != 1.0; y += .1 ) System.out.println( y );

68 82

9. ESTRUTURA DE CONTROLE DE INTERRUPO: BREAK, CONTINUE E RETURN 9.1. Declaraes de Interrupo Declaraes de interrupo permitem que redirecionemos o fluxo de controle do programa. A linguagem Java possui trs declaraes de interrupo. So elas: break, continue e return. 9.2. Declarao break A declarao break possui duas formas: unlabeled (no identificada - vimos esta forma com a declarao switch) e labeled (identificada). 9.2.1. Declarao unlabeled break A forma unlabeled de uma declarao break encerra a execuo de um switch e o fluxo de controle transferido imediatamente para o final deste. Podemos tambm utilizar a forma para terminar declaraes for, while ou do-while. Por exemplo: String names[] = {"Beah", "Bianca", "Lance", "Belle", "Nico", "Yza", "Gem", "Ethan"}; String searchName = "Yza"; boolean foundName = false; for (int i=0; i < names.length; i++) { if (names[i].equals(searchName)) { foundName = true; break; } } if (foundName) { System.out.println(searchName + " found!"); } else { System.out.println(searchName + " not found."); } Neste exemplo, se a String Yza for encontrada, a declarao for ser interrompida e o controle do programa ser transferido para a prxima instruo abaixo da declarao for. 9.2.2. Declarao labeled break A forma labeled de uma declarao break encerra o processamento de um lao que identificado por um label especificado na declarao break. Um label, em linguagem Java, definido colocando-se um nome seguido de dois-pontos, como por exemplo: teste: esta linha indica que temos um label com o nome teste. 69 82

O programa a seguir realiza uma pesquisa de um determinado valor em um array bidimensional. Dois laos so criados para percorrer este array. Quando o valor encontrado, um labeled break termina a execuo do lao interno e retorna o controle para o lao mais externo. int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; int searchNum = 5; searchLabel: for (int i=0; i<numbers.length; i++) { for (int j=0; j<numbers[i].length; j++) { if (searchNum == numbers[i][j]) { foundNum = true; break searchLabel; } } // final do lao j } // final do lao i if (foundNum) { System.out.println(searchNum + " found!"); } else { System.out.println(searchNum + " not found!"); } A declarao break, ao terminar a declarao for, no transfere o controle do programa ao final de seu lao, controlado pela varivel j. O controle do programa segue imediatamente para a declarao for marcada com o label, neste caso, interrompendo o lao controlado pela varivel i. 9.3. Declarao continue A declarao continue tem duas formas: unlabeled e labeled. Utilizamos uma declarao continue para saltar a repetio atual de declaraes for, while ou do-while. 9.3.1. Declarao unlabeled continue A forma unlabeled salta as instrues restantes de um lao e avalia novamente a expresso lgica que o controla. O exemplo seguinte conta a quantidade de vezes que a expresso "Beah" aparece no array. String names[] = {"Beah", "Bianca", "Lance", "Beah"}; int count = 0; for (int i=0; i < names.length; i++) { if (!names[i].equals("Beah")) { continue; // retorna para a prxima condio } count++; } System.out.println(count + " Beahs in the list");

70 82

9.3.2. Declarao labeled continue A forma labeled da declarao continue interrompe a repetio atual de um lao e salta para a repetio exterior marcada com o label indicado. outerLoop: for (int i=0; i<5; i++) { for (int j=0; j<5; j++) { System.out.println("Inside for(j) loop"); // mensagem1 if (j == 2) continue outerLoop; } System.out.println("Inside for(i) loop"); // mensagem2 } Neste exemplo, a mensagem 2 nunca ser mostrada, pois a declarao continue outerloop interromper este lao cada vez que j atingir o valor 2 do lao interno. 9.4. Declarao return A declarao return utilizada para sair de um mtodo. O fluxo de controle retorna para a declarao que segue a chamada do mtodo original. A declarao de retorno possui dois modos: o que retorna um valor e o que no retorna nada. Para retornar um valor, escreva o valor (ou uma expresso que calcula este valor) depois da palavra chave return. Por exemplo: return ++count; ou return "Hello"; Os dados so processados e o valor devolvido de acordo com o tipo de dado do mtodo. Quando um mtodo no tem valor de retorno, deve ser declarado como void. Use a forma de return que no devolve um valor. Por exemplo: return; Abordaremos as declaraes return nas prximas lies, quando falarmos sobre mtodos.

71

PRATICANDO! Digite o programa abaixo. Veja que brincadeira legal com o uso do continue.

Exerccios: 1. Execute o programa abaixo. Se faz o lao de 1 a 10 vezes, porque imprime somente at 5? Faa o teste passo a passo no algoritmo.
// BreakTeste.java // Lao 10 vezes import javax.swing.JOptionPane; public class BreakTest { public static void main( String args[] ) { String output = ""; int count; for ( count = 1; count <= 10; count++ ) { if ( count == 5 ) break; output += count + " "; } output += "\nLao = " + count; JOptionPane.showMessageDialog( null, output ); System.exit( 0 ); } }

82 72

2. Execute o programa abaixo. Faz-se o lao at de 1 a 9 vezes, o que ser impresso? Faa o teste passo a passo no algoritmo.
// ContinueTest.java import javax.swing.JOptionPane; public class ContinueTest { public static void main( String args[] ) { String output = ""; for ( int count = 1; count <= 10; count++ ) { if ( count == 5 ) continue; output += count + " "; }

73 82

Unidade 3
Arranjos e Argumentos

Resumo
Esta unidade tratar a forma de se ter acesso a conjunto de dados agrupados em um programa Java, atravs do estudo de arranjos homogneos e heterogneos elementares, destacando-se exemplos com vetores, matrizes. Argumentos tambm so apresentados como forma de transferncia de dados para os aplicativos. O principal objetivo conhecer as estruturas de dados bsicas constantes nos programas e saber empreg-las no memento da especificao do modo que o cdigo fique mais claro e otimizvel.

75 82

Sumrio
UNIDADE 3. ARRANJOS E ARGUMENTOS 10 Arranjos em Java 11 Argumentos em Java 75 77 83

76 82

10 ARRAY EM JAVA 10.1. Introduo a Array Em lies anteriores, discutimos como declarar diferentes variveis usando os tipos de dados primitivos. Na declarao de variveis, freqentemente utilizamos um identificador ou um nome e um tipo de dados. Para se utilizar uma varivel, deve-se cham-la pelo nome que a identifica. Por exemplo, temos trs variveis do tipo int com diferentes identificadores para cada varivel: int number1; int number2; int number3; number1 = 1; number2 = 2; number3 = 3; Como se v, inicializar e utilizar variveis pode torna-se uma tarefa tediosa, especialmente se elas forem utilizadas para o mesmo objetivo. Em Java, e em outras linguagens de programao, pode-se utilizar uma varivel para armazenar e manipular uma lista de dados com maior eficincia. Este tipo de varivel chamado de array.

Um array armazena mltiplos itens de um mesmo tipo de dado em um bloco contnuo de memria, dividindo-o em certa quantidade de posies. Imagine um array como uma varivel esticada que tem um nome que a identifica e que pode conter mais de um valor para esta mesma varivel. 10.2. Declarando Array Array precisa ser declarados como qualquer varivel. Ao declarar um array, defina o tipo de dados deste seguido por colchetes [] e pelo nome que o identifica. Por exemplo: int [] ages; ou colocando os colchetes depois do identificador. Por exemplo: int ages[]; 82 77

Depois da declarao, precisamos criar o array e especificar seu tamanho. Este processo chamado de construo (a palavra, em orientao a objetos, para a criao de objetos). Para se construir um objeto, precisamos utilizar um construtor. Por exemplo: // declarao int ages[]; // construindo ages = new int[100]; ou, pode ser escrito como: // declarar e construir int ages[] = new int[100]; No exemplo, a declarao diz ao compilador Java que o identificador ages ser usado como um nome de um array contendo inteiros, usado para criar, ou construir, um novo array contendo 100 elementos. Em vez de utilizar uma nova linha de instruo para construir um array, tambm possvel automaticamente declarar, construir e adicionar um valor uma nica vez. Exemplos: // criando um array de valores lgicos em uma varivel // results. Este array contm 4 elementos que so // inicializados com os valores {true, false, true, false} boolean results[] ={ true, false, true, false }; // criando um array de 4 variveis double inicializados // com os valores {100, 90, 80, 75}; double []grades = {100, 90, 80, 75}; // criando um array de Strings com identificador days e // tambm j inicializado. Este array contm 7 elementos S t r i n g d a y s [ ] = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"}; Uma vez que tenha sido inicializado, o tamanho de um array no pode ser modificado, pois armazenado em um bloco contnuo de memria. 10.3. Acessando um elemento do Array Para acessar um elemento do array, ou parte de um array, utiliza-se um nmero inteiro chamado de ndice. Um ndice atribudo para cada membro de um array, permitindo ao programa e ao programador acessar os valores individualmente quando necessrio. Os nmeros dos ndices so sempre inteiros. Eles comeam com zero e progridem seqencialmente por todas as posies at o fim do array. Lembre-se que os elementos dentro do array possuem ndice de 0 a tamanhoDoArray-1. 78 82

Por exemplo, dado o array ages que declaramos anteriormente, temos: // atribuir 10 ao primeiro elemento do array ages[0] = 10; // imprimir o ltimo elemento do array System.out.print(ages[99]); Lembre-se que o array, uma vez declarado e construdo, ter o valor de cada membro inicializado automaticamente. Conforme a seguinte tabela: Dicas de programao: 1. Normalmente, melhor inicializar, ou instanciar, um array logo aps declarlo. Por exemplo, a instruo: int []arr = new int[100]; prefervel, ao invs de: int [] arr; arr = new int[100]; 2. Os elementos de um array de n elementos tem ndices de 0 a n-1. Note que no existe o elemento arr[n]. A tentativa de acesso a este elemento causar uma exceo do tipo ArrayIndexOutOfB oundsException, pois o ndice deve ser at n-1. 3. No possvel modificar o tamanho de um array.

Entretanto, tipos de dados por referncia, como as Strings, no sero inicializados caracteres em branco ou com uma string vazia "", sero inicializados com o valor null. Deste modo, o ideal preencher os elementos do arrays de forma explcita antes de utiliz-los. A manipulao de objetos nulos pode causar a desagradvel surpresa de uma exceo do tipo NullPointerException, por exemplo, ao tentar executar algum mtodo da classe String, conforme o exemplo a seguir: public class ArraySample { public static void main(String[] args){ String [] nulls = new String[2]; System.out.print(nulls[0]); // Linha correta, mostra null System.out.print(nulls[1].trim()); // Causa erro } } O cdigo abaixo utiliza uma declarao for para mostrar todos os elementos de um array. public class ArraySample { public static void main(String[] args){ int[] ages = new int[100]; for (int i = 0; i < 100; i++) { System.out.print(ages[i]); } } } 79 82

Dicas de programao: 1. Quando criar laos com for para o processamento de um array, utilize o campo length como argumento da expresso lgica. Isto ir permitir ao lao ajustarse, automaticamente para tamanhos de diferentes arrays. 2. Declare o tamanho dos arrays utilizando variveis do tipo constante para facilitar alteraes posteriores. Por exemplo: final int ARRAY_SIZE = 1000; // declarando uma constante ... int[] ages = new int[ARRAY_SIZE];

10.4. Tamanho de Array Para se obter o nmero de elementos de um array, podese utilizar o atributo length. O atributo length de um array retorna seu tamanho, ou seja, a quantidade de elementos. utilizado como no cdigo abaixo: nomeArray.length Por exemplo, dado o cdigo anterior, podemos reescrevlo como: public class ArraySample { public static void main (String[] args) { int[] ages = new int[100]; for (int i = 0; i < ages.length; i++) { System.out.print(ages[i]); } } } 10.5. Arrays Multidimensionais Arrays multidimensionais so implementados como arrays dentro de arrays. So declarados ao atribuir um novo conjunto de colchetes depois do nome do array. Por exemplo: // array inteiro de 512 x 128 elementos int [][] twoD = new int[512][128]; // array de caracteres de 8 x 16 x 24 char [][][] threeD = new char[8][16][24]; // array de String de 4 linhas x 2 colunas String [][] dogs = {{"terry", "brown"}, {"Kristin", "white"}, {"toby", "gray"}, {"fido", "black"}}; Acessar um elemento em um array multidimensional semelhante a acessar elementos em um array de uma dimenso. Por exemplo, para acessar o primeiro elemento da primeira linha do array dogs, escreve-se: System.out.print(dogs[0][0]); Isso mostrar a String "terry" na sada padro. Caso queira mostrar todos os elementos deste array, escreve-se: for (int i = 0; i < dogs.length; i++) { for (int j = 0; j < dogs[i].length; j++) { System.out.print(dogs[i][j] + " "); } } 80 82

EXERCCIOS 1. Criar um array de Strings inicializado com os nomes dos sete dias da semana. Por exemplo: String days[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; Usando uma declarao while, imprima todo o contedo do array. Faa o mesmo para as declaraes do-while e for. 2. Usando as classes BufferedReader , Scanner ou JOptionPane, solicite 10 nmeros ao usurio. Utilize um array para armazenar o valor destes nmeros. Mostre o nmero de maior valor. 3. Dado o seguinte array multidimensional, que contm as entradas da agenda telefnica: String entry = {{"Florence", "735-1234", "Manila"}, {"Joyce", "983-3333", "Quezon City"}, {"Becca", "456-3322", "Manila"}}; mostre-as conforme o formato abaixo: Name : Florence Tel. # : 735-1234 Address: Manila Name : Joyce Tel. # : 983-3333 Address: Quezon City Name : Becca Tel. # : 456-3322 Address: Manila DESAFIOS: 1. O programa abaixo ler os argumentos na linha de comando e coloca no array de args. Altere o programa abaixo para mostrar as opes disponveis caso o usurio entre com argumentos invlidos.
public class Comand { public static void main(String[] args) { if (args[0].equals("-h")) System.out.print("Help,"); else if (args[0].equals("-g")) System.out.print("Go to do,"); for (int i = 1; i < args.length; i++) System.out.print(" " + args[i]); System.out.println("!"); } }

82 81

2. Escreva um programa para ler um conjuto de elementos, armazenar em arrays, classificar em ordem crescente e imprimir os elementos do array.

82

11 ARGUMENTOS EM JAVA 11.1. Argumentos de linha de comando Uma aplicao em Java aceita qualquer quantidade de argumentos passados pela linha de comando. Argumentos de linha de comando permitem ao usurio modificar a operao de uma aplicao a partir de sua execuo. O usurio insere os argumentos na linha de comando no momento da execuo da aplicao. Deve-se lembrar que os argumentos de linha de comando so especificados depois do nome da classe a ser executada. Por exemplo, suponha a existncia de uma aplicao Java, chamada Sort, que ordena cinco nmeros que sero recebidos. Essa aplicao seria executada da seguinte maneira: java Sort 5 4 3 2 1 Lembre-se que os argumentos so separados por espaos. Em linguagem Java, quando uma aplicao executada, o sistema repassa os argumentos da linha de comando para a o mtodo main da aplicao atravs de um array de String. Cada elemento deste array conter um dos argumentos de linha de comando passados. Lembre-se da declarao do mtodo main: public static void main(String[] args) { } Os argumento que so passados para o programa so salvos em um array de String com o identificador args. No exemplo anterior, os argumentos de linha de comando passados para a aplicao Sort estaro em um array que conter cinco strings: "5", "4", "3", "2" e "1". possvel conhecer o nmero de argumentos passados pela linha de comando utilizando-se o atributo length do array. Por exemplo: int numberOfArgs = args.length; Se o programa precisa manipular argumento de linha de comando numrico, ento, deve-se converter o argumento do tipo String, que representa um nmero, assim como "34", para um nmero. Aqui est a parte do cdigo que converte um argumento de linha de comando para inteiro: int firstArg = 0; if (args.length > 0) { firstArg = Integer.parseInt(args[0]); } Dicas de programao: 1. Antes de usar os argumentos de linha de comando, observe a quantidade de argumentos passados para a aplicao. Deste modo, nenhuma exceo ser disparada.

83

parseInt dispara uma exceo do tipo NumberFormatException se o contedo do elemento arg[0] no for um nmero. 11.2. Argumentos de linha de comando no NetBeans Para ilustrar a passagem de alguns argumentos para um projeto no NetBeans, vamos criar um projeto em Java que mostrar na tela o nmero de argumentos e o primeiro argumento passado. public class CommandLineExample { public static void main( String[] args ) { System.out.println( "Number of arguments=" + args.length); System.out.println( "First Argument="+ args[0]); } } PRATICANDO! Abra o NetBeans, crie um novo projeto e d o nome de CommandLineExample . Copie o cdigo mostrado anteriormente e o compile. Em seguida, siga estas etapas para passar argumentos para o programa, utilizando o NetBeans.

84

D um clique com o boto direito do mouse no cone CommandLineExample, conforme destacado na Figura acima. Um menu aparecer, conforme a Figura da pgina seguinte. Selecione a opo "Properties".

A janela "Project Properties" ir aparecer, conforme a Figura abaixo:

Acesse a opo Run ? Running Project. 85

Na caixa de texto dos argumentos, digite os argumentos que se quer passar para o programa. Neste caso, digitamos os argumentos 5 4 3 2 1. Pressione o boto OK.

86

Execute o projeto.

Como pode-se ver, a sada do projeto a quantidade de argumentos, que 5, e o primeiro argumento passado, que tambm 5.

87

EXERCCIOS 1. Utilizando os dados passados pelo usurio atravs dos argumentos de linha de comando, exiba os argumentos recebidos. Por exemplo, se o usurio digitar: java Hello world that is all o programa dever mostrar na tela: world that is all 2. Obtenha dois nmeros, passados pelo usurio usando argumentos de linha de comando, e mostre o resultado da soma, subtrao, multiplicao e diviso destes nmeros. Por exemplo, se o usurio digitar: java ArithmeticOperation 20 4 o programa dever mostrar na tela: sum = 24 subtraction = 16 multiplication = 80 division = 5 DESAFIO Altere o programa abaixo para receber os parmetros atravs da linha de comando.
import javax.swing.*; public class InputArgs { public static void main(String[] args) { String name = JOptionPane.showInputDialog ("What is your name?"); String input = JOptionPane.showInputDialog ("How old are you?"); int age = Integer.parseInt(input); System.out.println("Hello, " + name +

88

Unida de 4
Paradigma de programao Orientada a Objetos

Resumo
Esta unidade tem como meta apresentar os fundamentos do paradigma de programao orientada a objetos. Aborda o tema, caracterizando com exemplos uma linguagem orientada a objetos com Java. Apresentar os elementos inerentes como classes, objetos e mtodos. Mostra com exemplos, caractersticas que podem ser exploradas como herana polimorfismo e interface. Apresenta ainda com feito o tratamento de excees em linguagem OO como Java. So apresentados exemplos ilustrativos, exerccios propostos a serem vencidos pelos aprendizes. O objetivo conhecer fundamentalmente os recursos de programao orientada por objetos como uma ferramenta poderosa que pode gerar cdigos sofisticados e complexos. Nesta unidade o aprendiz ter a oportunidade a implementar os algoritmos de seu interesse usando a linguagem Java, para solidificar os conhecimentos adquiridos nas sub-unidades anteriores.
89

Sumriol
UNIDADE 4. PARADIGMA DE PROGRAMAO ORIENTADA A OBJETOS 12 Classes, Objetos e Mtodos 13 Definio de Classe em Java 14 Herana, Polimorfismo e Interface 15 Tratamento e Excees em Java

89 91 107 125 138

90

12. CLASSES, OBJETOS E MTODOS 12.1. Introduo Programao Orientada a Objeto Programao Orientada a Objetos (POO) refere-se ao conceito de objetos como elemento bsico das classes. O mundo fsico constitudo por objetos tais como carro, leo, pessoa, dentre outros. Estes objetos so caracterizados pelas suas propriedades (ou atributos) e seus comportamentos. Por exemplo, um objeto "carro" tem as propriedades, tipo de cmbio, fabricante e cor. O seu comportamento pode ser 'virar', 'frear' e 'acelerar'. Igualmente, podemos definir diferentes propriedades e comportamentos para um leo. Veja exemplos na Tabela abaixo:

Com tais descries, os objetos do mundo fsico podem ser facilmente modelados como objetos de software usando as propriedades como atributos e os comportamentos como mtodos. Estes atributos e mtodos podem ser usados em softwares de jogos ou interativos para simular objetos do mundo real! Por exemplo, poderia ser um objeto de 'carro' numa competio de corrida ou um objeto de 'leo' num aplicativo educacional de zoologia para crianas. 12.2. Classes e Objetos 12.2.1. Diferenas entre Classes e Objetos No mundo do computador, um objeto um componente de software cuja estrutura similar a um objeto no mundo real. Cada objeto composto por um conjunto de atributos (propriedades) que so as variveis que descrevem as caractersticas essenciais do objeto e, consiste tambm, num conjunto de mtodos (comportamentos) que descrevem como o objeto se comporta. Assim, um objeto uma coleo de atributos e mtodos relacionados. Os atributos e mtodos de um objeto Java so formalmente conhecidos como atributos e mtodos de objeto, para distinguir dos atributos e mtodos de classes, que sero discutidos mais adiante. A classe a estrutura fundamental na Programao Orientada a Objetos. Ela pode ser pensada como um gabarito, um prottipo ou, ainda, uma planta para a construo de um objeto. Ela consiste em dois tipos de elementos que so chamados atributos (ou propriedades) e mtodos. 91

Atributos especificam os tipos de dados definidos pela classe, enquanto que os mtodos especificam as operaes. Um objeto uma instncia de uma classe. Para diferenciar entre classes e objetos, vamos examinar um exemplo. O que temos aqui uma classe Carro que pode ser usada pra definir diversos objetos do tipo carro. Na tabela mostrada abaixo, Carro A e Carro B so objetos da classe Carro. A classe tem os campos nmero da placa, cor, fabricante e velocidade que so preenchidos com os valores correspondentes do carro A e B. O carro tambm tem alguns mtodos: acelerar, virar e frear.

Quando construdos, cada objeto adquire um conjunto novo de estado. Entretanto, as implementaes dos mtodos so compartilhadas entre todos os objetos da mesma classe. As classes fornecem o benefcio do Reutilizao de Classes (ou seja, utilizar a mesma classe em vrios projetos). Os programadores de software podem reutilizar as classes vrias vezes para criar os objetos. 12.2.2. Encapsulamento Encapsulamento um princpio que prope ocultar determinados elementos de uma classe das demais classes. Ao colocar uma proteo ao redor dos atributos e criar mtodos para prover o acesso a estes, desta forma estaremos prevenindo contra os efeitos colaterais indesejados que podem afet-los ao ter essas propriedades modificadas de forma inesperada. Podemos prevenir o acesso aos dados dos nossos objetos declarando que temos controle desse acesso. Aprenderemos mais sobre como Java implementa o encapsulamento quando discutirmos mais detalhadamente sobre as classes. 12.2.3. Atributos e Mtodos de Classe Alm dos atributos de objeto, tambm possvel definir atributos de classe, que so atributos que pertencem classe como um todo. Isso significa que possuem o mesmo valor para todos os objetos daquela classe. Tambm so chamados de atributos estticos. Para melhor descrever os atributos de classe, vamos voltar ao exemplo da classe Carro. 92

Suponha que a classe Carro tenha um atributo de classe chamado Contador. Ao mudarmos o valor de Contador para 2, todos os objetos da classe Carro tero o valor 2 para seus atributos Contador.

12.2.4. Instncia de Classe Para criar um objeto ou uma instncia da classe, utilizamos o operador new. Por exemplo, para criar uma instncia da classe String, escrevemos o seguinte cdigo: String str2 = new String("Hello world!"); ou, o equivalente: String str2 = "Hello world!";

O operador new aloca a memria para o objeto e retorna uma referncia para essa alocao. Ao criar um objeto, invoca-se, na realidade, o construtor da classe. O construtor um mtodo onde todas as inicializaes do objeto so declaradas e possui o mesmo nome da classe. 12.3. Mtodos 12.3.1. O que so mtodos e porque usar mtodos? Nos exemplos apresentados anteriormente, temos apenas um mtodo, o mtodo main(). Em Java, ns podemos definir vrios mtodos e podemos cham-los a partir de outros mtodos. Um mtodo um trecho de cdigo distinto que pode ser chamado por qualquer outro mtodo para realizar alguma funo especfica.

93

Mtodos possuem as seguintes caractersticas: Podem ou no retornar um valor Podem aceitar ou no argumentos Aps o mtodo encerrar sua execuo, o fluxo de controle retornado a quem o chamou O que necessrio para se criar mtodos? Porque no colocamos todas as instrues dentro de um grande mtodo? O foco destas questes chamado de decomposio. Conhecido o problema, ns o separamos em partes menores, que torna menos crtico o trabalho de escrever grandes classes. 12.3.2. Chamando Mtodos de Objeto e Enviando Argumentos Para ilustrar como chamar os mtodos, utilizaremos como exemplo a classe String. Pode-se usar a documentao da API Java para conhecer todos os atributos e mtodos disponveis na classe String. Posteriormente, iremos criar nossos prprios mtodos. Para chamar um mtodo a partir de um objeto, escrevemos o seguinte: nomeDoObjeto.nomeDoMtodo([argumentos]); Vamos pegar dois mtodos encontrados na classe String como exemplo:

Usando os mtodos: String str1 = "Hello"; char x = str1.charAt(0); // retornar o caracter H // e o armazenar no atributo x String str2 = "hello"; // aqui ser retornado o valor booleano true boolean result = str1.equalsIgnoreCase(str2); 12.3.3. Envio de Argumentos para Mtodos Em exemplos anteriores, enviamos atributos para os mtodos. Entretanto, no fizemos nenhuma distino entre os diferentes tipos de atributos que podem ser enviados como argumento para os mtodos. H duas formas para se enviar argumentos para um mtodo, o primeiro envio por valor e o segundo envio por referncia. 94

12.3.3.1. Envio por valor Quando ocorre um envio por valor, a chamada do mtodo faz uma cpia do valor do atributo e o reenvia como argumento. O mtodo chamado no modifica o valor original do argumento mesmo que estes valores sejam modificados durante operaes de clculo implementadas pelo mtodo. Por exemplo:

No exemplo dado, o mtodo test foi chamado e o valor de i foi enviado como argumento. O valor de i copiado para o atributo do mtodo j. J que j o atributo modificado no mtodo test, no afetar o valor do atributo i, o que significa uma cpia diferente do atributo. Como padro, todo tipo primitivo, quando enviado para um mtodo, utiliza a forma de envio por valor.

12.3.3.2. Envio por referncia Quando ocorre um envio por referncia, a referncia de um objeto enviada para o mtodo chamado. Isto significa que o mtodo faz uma cpia da referncia do objeto enviado. Entretanto, diferentemente do que ocorre no envio por valor, o mtodo pode modificar o objeto para o qual a referncia est apontando. Mesmo que diferentes referncias sejam usadas nos mtodos, a localizao do dado para o qual ela aponta a mesma. Como exemplo veremos a figura na pgina a seguir: 95

Dicas de programao: 1. Um erro comum sobre envio por referncia acontece quando criamos um mtodo para fazer trocas (swap) usando referncia. Note que Java manipula objetos 'por referncia', entretanto enviase a referncia para um mtodo 'por valor'. Como conseqncia, no se escreve um mtodo padro para fazer troca de valores (swap) entre objetos.

12.4. Chamando mtodos estticos Mtodos estticos so mtodos que podem ser invocados sem que um objeto tenha sido instanciado pela classe (sem utilizar a palavra-chave new). Mtodos estticos pertencem a classe como um todo e no ao objeto especifico da classe. Mtodos estticos so diferenciados dos mtodos de objeto pela declarao da palavra-chave static na definio do mtodo. Para chamar um mtodo esttico, digite: NomeClasse.nomeMtodoEsttico(argumentos); Alguns mtodos estticos, que j foram usados em nossos exemplos so: // Converter a String 10 em um atributo do tipo inteiro int i = Integer.parseInt("10"); // Retornar uma String representando um inteiro sem o sinal da // base 16 String hexEquivalent = Integer.toHexString(10); 96

12.5. Escopo de um atributo Alm do atributo ter um nome e um tipo, eletambm possui um escopo. O escopo determina onde o atributo acessvel dentro da classe. O escopo tambm determina o tempo de vida do atributo ou quanto tempo o atributo ir existir na memria. O escopo determinado pelo local onde o atributo declarado na classe. Para simplificar, vamos pensar no escopo como sendo algo existente entre as chaves {...}. A chave direita chamada de chave de sada do bloco (outer) e a chave esquerda chamada chave de entrada do bloco (inner). Ao declarar atributos fora de um bloco, eles sero visveis (usveis) inclusive pelas linhas da classe dentro do bloco. Entretanto, ao declarar os atributo dentro do bloco, no ser possvel utiliz-los fora do bloco. O escopo de um atributo dito local quando declarado dentro do bloco. Seu escopo inicia com a sua declarao e vai at a chave de sada do bloco.

Por exemplo, dado o seguinte fragmento de cdigo:

O cdigo acima representa cinco escopos indicado pelas letras. Dados os atributos i, j, k, m e n, e os cinco escopos A, B, C, D e E, temos os seguintes escopos para cada atributo: O escopo do atributo i A. O escopo do atributo j B. O escopo do atributo k C. O escopo do atributo m D. O escopo do atributo n E. 97

Dado dois mtodos: main e test teremos o seguinte exemplo:

ages[] - escopo A i em B - escopo B i em C escopo C E, no mtodo test, os escopos dos atributos so: arr[] - escopo D i em E - escopo E Quando atributos so declarados, o identificador deve ser nico no escopo. Isto significa que se voc tiver a seguinte declarao: { int test = 10; int test = 20; } o compilador ir gerar um erro pois deve-se ter um nome nico para o atributos dentro do bloco. Entretanto, possvel ter atributos definidos com o mesmo nome, se no estiverem declarados no mesmo bloco. Por exemplo: public class TestBlock { int test = 10; public void test() { System.out.print(test); int test = 20; System.out.print(test); } public static void main(String[] args) { TestBlock testBlock = new TestBlock(); testBlock.test(); } } 98

Dicas de programao: 1. Evite ter atributos declarados com o mesmo nome dentro de um mtodo para no causar confuso.8.

Quando a primeira instruo System.out.print for invocada, exibir o valor 10 contido na primeira declarao do atributo test. Na segunda instruo System.out.print, o valor 20 exibido, pois o valor do atributos test neste escopo. 12.6. Casting, Converso e Comparao de Objetos Nesta seo, vamos aprender como realizar um casting. Casting, ou typecasting, o processo de converso de um certo tipo de dado para outro. Tambm aprenderemos como converter tipos de dados primitivos para objetos e vice-versa. E, finalmente, aprenderemos como comparar objetos. 12.6.1. Casting de Tipos Primitivos Casting entre tipos primitivos permite converter o valor de um dado de um determinado tipo para outro tipo de dado primitivo. O casting entre primitivos comum para os tipos numricos. H um tipo de dado primitivo que no aceita o casting, o tipo de dado boolean. Como demonstrao de casting de tipos, considere que seja necessrio armazenar um valor do tipo int em um atributo do tipo double. Por exemplo: int numInt = 10; double numDouble = numInt; // cast implcito uma vez que o atributo de destino double, pode-se armazenar um valor cujo tamanho seja menor ou igual aquele que est sendo atribudo. O tipo convertido implicitamente. Quando convertemos um atributo cujo tipo possui um tamanho maior para um de tamanho menor, necessariamente devemos fazer um casting explcito. Esse possui a seguinte forma: (tipoDado)valor onde: tipoDado o nome do tipo de dado para o qual se quer converter o valor valor um valor que se quer converter. Por exemplo: double valDouble = 10.12; int valInt = (int)valDouble; //converte valDouble para o tipo int double x = 10.2; int y = 2; int result = (int)(x/y); //converte o resultado da operao para int Outro exemplo quando desejamos fazer um casting de um valor do tipo int para char. Um caractere pode ser usado como int porque para cada caractere existe um correspondente 99

numrico que representa sua posio no conjunto de caracteres. O casting (char)65 ir produzir a sada 'A'. O cdigo numrico associado letra maiscula A 65, segundo o conjunto de caracteres ASCII. Por exemplo: char valChar = 'A'; System.out.print( (int)valChar ); //casting explcito produzir 65 12.6.2. Casting de Objetos Para objetos, a operao de casting tambm pode ser utilizada para fazer a converso para outras classes, com a seguinte restrio: a classe de origem e a classe de destino devem ser da mesma famlia, relacionadas por herana; uma classe deve ser subclasse da outra. Veremos mais em lies posteriores sobre herana. Analogamente converso de valores primitivos para um tipo maior, alguns objetos no necessitam ser convertidos explicitamente. Em conseqncia de uma subclasse conter todas as informaes da sua superclasse, pode-se usar um objeto da subclasse em qualquer lugar onde a superclasse esperada. Por exemplo, um mtodo que recebe dois argumentos, um deles do tipo Object e outro do tipo Window. Pode-se enviar um objeto de qualquer classe como argumento Object porque todas as classes Java so subclasses de Object. Para o argumento Window, possvel enviar apenas suas subclasses, tais como Dialog, FileDialog, Frame (ou quaisquer de subclasses de suas subclasses, indefinidamente). Isso vale para qualquer parte da classe, no apenas dentro da chamadas do mtodo. Para um objeto definido como uma classe Window, possvel atribuir objetos dessa classe ou qualquer uma de suas subclasses para esse objeto sem o casting. O contrrio tambm verdadeiro. Uma superclasse pode usada quando uma subclasse esperada. Entretanto, nesse caso, o casting necessrio porque as subclasses contm mais mtodos que suas superclasses, e isso acarreta em perda de preciso. Os objetos das superclasses podem no dispor de todo o comportamento necessrio para agir como um objeto da subclasse. Por exemplo, se uma operao faz a chamada a um mtodo de um objeto da classe Integer, usando um objeto da classe Number, ele no ter muitos dos mtodos que foram especificados na classe Integer. Erros ocorrero se voc tentar chamar mtodos que no existem no objeto de destino. Para usar objetos da superclasse onde uma subclasse esperada, necessrio fazer o casting explcito. Nenhuma informao ser perdida no casting, entretanto, ganhar todos os atributos e mtodos que a subclasse define. Para fazer o casting de um objeto para outro, utiliza-se a mesma operao utilizada com os tipos primitivos: 100

Para fazer o casting: (nomeClasse)objeto onde: nomeClasse o nome da classe destino objeto a referncia para o objeto origem que se quer converter Uma vez que casting cria uma referncia para o antigo objeto de nomeClasse; ele continua a existir depois do casting.

O exemplo a seguir realiza um casting de um objeto da classe VicePresident para um objeto da classe Employee. VicePresident uma subclasse de Employee com mais informaes, supondo que tenha sido definido que a classe VicePresident tem mais privilgios que um Employee. Employee emp = new Employee(); VicePresident veep = new VicePresident(); emp = veep; // casting no necessrio de baixo para cima veep = (VicePresident)emp; // necessita do casting explcito 12.6.3. Convertendo Tipos Primitivos para Objetos e ViceVersa No se pode fazer sob qualquer circunstncia um casting de um objeto para um tipo de dado primitivo, ou vice-versa. Tipos primitivos e objetos so muito diferentes em Java e no se pode fazer o casting automaticamente entre os dois ou intercambiar o seu uso. Como alternativa, o pacote java.lang oferece classes que fazem a correspondncia para cada tipo primitivo: Float, Boolean, Byte, dentre outros. Muitas dessas classes tm o mesmo nome dos tipos de dados primitivos, exceto pelo fato que o nome dessas classe comeam com letra maiscula (Short ao invs de short, Double ao invs de double, etc). H duas classes que possuem nomes que diferem do correspondente tipo de dado primitivo: Character usado para o tipo char e Integer usado para o tipo int. Estas classes so chamadas de Wrapper Class. Verses anteriores a 5.0 de Java tratam os tipos de dados e suas Wrapper Class de forma muito diferente e uma classe no ser compilada com sucesso se for utilizado uma quando deveria usar a outra. Por exemplo: Integer ten = 10; Integer two = 2; System.out.println(ten + two); 101 Dicas de programao: 1. A classe Void representa vazio em Java. Deste modo, no existem motivos para ela ser usada na converso de valores primitivos e objetos. Ela um tratador para a palavra-chave void, que utilizada na assinatura de mtodos indicando que estes no retornam valor.

Usando as classes que correspondem a cada um dos tipos primitivos, possvel criar objetos que armazenam este mesmo valor. Por exemplo: // A declarao seguinte cria um objeto de uma classe Integer // com o valor do tipo int 7801 (primitivo -> objeto) Integer dataCount = new Integer(7801); // A declarao seguinte converte um objeto Integer para um // tipo de dado primitivo int. O resultado o valor 7801 int newCount = dataCount.intValue(); // Uma converso comum de se fazer de String para um tipo // numrico (objeto -> primitivo) String pennsylvania = "65000"; int penn = Integer.parseInt(pennsylvania); 12.6.4. Comparando Objetos Em lies prvias, aprendemos sobre operadores para comparar valores igualdade, negao, menor que, etc. Muitos desses operadores trabalham apenas com dados de tipo primitivo, no com objetos. Ao tentar utilizar outros tipos de dados, o compilador produzir erros. Uma exceo para esta regra so os operadores de igualdade: == (igual) e != (diferente). Quando aplicados a objetos, estes operadores no fazem o que se poderia supor. Ao invs de verificar se um objeto tem o mesmo valor de outro objeto, eles determinam se os dois objetos comparados pelo operador tm a mesma referncia. Por exemplo: String valor1 = new String; Integer dataCount = new Integer(7801); Para comparar objetos de uma classe e ter resultados apropriados, deve-se implementar e chamar mtodos especiais na sua classe. Um bom exemplo disso a classe String. possvel ter dois objetos String diferentes que contenham o mesmo valor. Caso se empregue o operador == para comparar objetos, estes sero considerados diferentes. Mesmo que seus contedos sejam iguais, eles no so o mesmo objeto. Para ver se dois objetos String tm o mesmo contedo, um mtodo chamado equals() utilizado. O mtodo compara cada caractere presente no contedo das Strings e retorna true se ambas strings tiverem o mesmo valor. 102

O cdigo seguinte ilustra essa comparao, class EqualsTest { public static void main(String[] args) { String str1, str2; str1 = "Free the bound periodicals."; str2 = str1; System.out.println("String1: " + str1); System.out.println("String2: " + str2); System.out.println("Same object? " + (str1 == str2)); Dicas de programao: 1. Porque no se pode System.out.println("String1: " + str1); ter a mesma literal System.out.println("String2: " + str2); quando mudamos System.out.println("Same object? " + (str1 == str2)); str2, a no ser quando S y s t e m . o u t . p r i n t l n ( " S a m e v a l u e ? " + utilizamos o new? str1.equals(str2)); Literais String so } otimizadas em Java; } se uma String criada utilizando uma A sada dessa classe a seguinte: literal e cria-se outra String com os mesmos String1: Free the bound periodicals. caracteres, Java tem String2: Free the bound periodicals. inteligncia suficiente Same object? true para retornar apenas a String1: Free the bound periodicals. posio em memria String2: Free the bound periodicals. do Same object? false primeiro objeto String Same value? True criado. Ou seja, ambas strings se Vamos entender o processo envolvido. referem ao mesmo objeto como se fosse String str1, str2; um apelido. Para str1 = "Free the bound periodicals."; obrigar ao Java criar str2 = str1; um novo objeto String, deve-se utilizar o operador new. str2 = new String(str1);

A primeira parte dessa classe declara dois atributos (str1 e str2) e atribui a literal "Free the bound periodicals." a str1, e depois atribui esse valor a str2. Como visto anteriormente, str1 e str2 agora apontam para o mesmo objeto, e o teste de igualdade prova isso. Em seguida, temos a seguinte instruo: str2 = new String(str1); 103

Na segunda parte da classe, cria-se um novo objeto String com o mesmo valor de str1 e faz-se a atribuio de str2 para esse novo objeto String. Agora temos dois diferentes tipos de objetos na str1 e str2, ambos com o mesmo contedo. Testando para ver se eles so o mesmo objeto usando o operador de igualdade obtemos a resposta esperada: false eles no so o mesmo objeto na memria. Utilizando o mtodo equals() recebemos a resposta esperada: true eles tem o mesmo contedo.

12.6.5. Determinando a Classe de um Objeto Existem duas maneiras de se descobrir a qual classe determinado objeto pertence: 1. Para obter o nome da classe: Utiliza-se o mtodo getClass() que retorna a classe do objeto (onde Class a classe em si). Esta, por sua vez, possui o mtodo chamado getName() que retorna o nome da classe. Por exemplo: String name = key.getClass().getName(); 2. Para testar se um objeto qualquer foi instanciado de uma determinada classe: Utiliza-se a palavra-chave instanceof. Esta palavra-chave possui dois operadores: a referncia para o objeto esquerda e o nome da classe direita. A expresso retorna um lgico dependendo se o objeto uma instncia da classe declarada ou qualquer uma de suas subclasses. Por exemplo: String ex1 = "Texas"; System.out.println(ex1 instanceof String); // retorna true String ex2; System.out.println(ex2 instanceof String); // retorna false

EXERCCIOS 1. Conceitue os termos, com suas prprias palavras,: a) Classe, b) Objeto, c) Instanciao, e) Atributo de objeto, f) Mtodo de objeto, g) Atributo de classe ou atributos estticas, h) Construtor, i ) Mtodo de classe ou mtodos estticos. 104

2. Identifique na figura da pgina seguinte os elementos: a) Classe, b) Objeto, c) Instncia, e) Mtodo, f) Atributo, g) Construtor, h) Mensagem, i) Argumento.

Class Computer Processador; Memory; System_Oper; Computer(args); Start(time ); Shutdown(time ); RunProgram(name);

Object Computer; Processador= PowerPc; Memory=2Gb; System_Oper=OS/2; Computer(args); Start(time ); Shutdown(time ); RunProgram(name );

2. Pipoy um novato na linguagem de programao Java. Ele apenas ouviu que existem Java APIs (Application Programming Interface) prontas para serem usadas em suas classes e ele est ansioso para fazer uns testes com elas. O problema que Pipoy no tem uma cpia da documentao Java e ele tambm no tem acesso Internet, deste modo, no h como ele ver as APIs java. Sua tarefa ajudar Pipoy a procurar as APIs. Voc deve informar as classes s quais os mtodos pertencem e como o mtodo deve ser declarado com um exemplo de uso deste. Por exemplo, se Pipoy quer saber qual o mtodo que converte uma String para int, sua resposta deve ser: Classe: Integer Declarao do Mtodo: public static int parseInt( String value ) Exemplo de Uso: String strValue = "100"; int value = Integer.parseInt( strValue ); Tenha certeza de que o fragmento de cdigo que voc escreveu em seu exemplo de uso compila e que produza o resultado correto. Enfim, no deixe Pipoy confuso. (Dica: Todos os mtodos esto no package java.lang). Caso haja mais de um mtodo para atender tarefa, utilize apenas um. Agora vamos iniciar a busca! Aqui esto alguns mtodos que Pipoy necessita: a) Procure pelo mtodo que verifica se uma String termina com um determinado sufixo. Por exemplo, se a String dada "Hello", o mtodo deve retornar true se o sufixo informado "lo", e false se o sufixo for "alp". b) Procure pelo mtodo que determina a representao do caractere para um dgito e base especficos. Por exemplo, se o dgito informado 15 e a base 16, o mtodo retornar o caractere 'F', uma vez que 'F' a representao hexadecimal para o nmero 15 em base 10. 105

c) Procure por um mtodo que retorna a parte inteira de um valor double. Por exemplo, se a entrada for 3.13, o mtodo deve retornar o valor 3. d) Procure por um mtodo que determina se um certo caractere um dgito. Por exemplo, se a entrada for '3', retornar o valor true. e) Procure por um mtodo que interrompe a execuo da Java Virtual Machine corrente. 3. A emprea MagSoft contrata desenvolvedores para trabalhar em projetos de software. Apresente um modelo de implementao em objetos que possa representar o sistema de controle de projetos da empresa. Determine as classes, atributos e mtodos.

DESAFIO O cdigo seguinte cria uma lista de objetos empregados associados a uma identificao. Perceba que nas classes empregado e empresa est declarado o mtodo main(). Compile execute as duas classes. Justique a execuo. Agora altere o cdigo para no permitir execuo da classe empregado e na criao de cada empregado incrementar o identificador automaticamente.

// classe Empresa public class Empresa public static void main(String[] args) { // fill the staff array with three Employee objects Employee[] staff = new Employee[3]; staff[0] = new Employee("Tom", 40000); staff[1] = new Employee("Dick", 60000); staff[2] = new Employee("Harry", 65000); // print out information about all Employee objects for (int i = 0; i < staff.length; i++) Employee e = staff[i]; e.setId(); System.out.println("name=" + e.getName() + ",id=" + e.getId() + ",salary=" + e.getSalary()); } int n = Employee.getNextId(); // calls static method System.out.println("Next available id=" + n); } } // classe Empregado class Employee { public Employee(String n, double s) { name = n; salary = s; id = 0; } public String getName() { return name; } public double getSalary() { return salary; } public int getId() { return id; } public void setId() { id = nextId; // set id to next available id nextId++; } public static int getNextId() { return nextId; // returns static field }

106

13. DEFINIO DE CLASSE EM JAVA 13.1. Definindo classes Antes de escrever sua classe, primeiro pense onde e como sua classe ser usada. Pense em um nome apropriado para a classe e liste todas as informaes ou propriedades que deseje que ela tenha. Liste tambm os mtodos que sero usados para a classe. Para definir uma classe, escrevemos: <modificador>* class <nome> { <declaraoDoAtributo>* <declaraoDoConstrutor>* <declaraoDoMtodo>* } onde: <modificador> um modificador de acesso, que pode ser usado em combinao com outros <nome> nome da sua classe <declaraoDoAtributo> atributos definidos para a classe <declaraoDoConstrutor> mtodo construtor <declaraoDoMtodo> mtodos da classe Nesta lio, criaremos uma classe que conter o registro de um estudante. Como j identificamos o objetivo da nossa classe, agora podemos nome-la. Um nome apropriado para nossa classe seria StudentRecord. Para definir nossa classe, escrevemos: public class StudentRecord { // adicionaremos mais cdigo aqui } onde: public modificador de acesso e significa que qualquer classe pode acessar esta class palavra-chave usada para criar uma classe StudentRecord identificador nico que identifica a classe 13.2. Declarando Atributos Para declarar um certo atributo para a nossa classe, escrevemos: <modificador>* <tipo> <nome> [= <valorInicial>]; 107 Dicas de programao: 1. Lembre-se de que, para a declarao da classe, o nico modificador de acesso vlido o public. De uso exclusivo para a classe que possuir o mesmo nome do arquivo externo.

Dicas de programao: 1. Pense em nomes apropriados para a sua classe. No a chame simplesmente de classe XYZ ou qualquer outro nome aleatrio. 2. Os nomes de classes devem iniciadas por letra MAISCULA. 3. O nome do arquivo de sua classe obrigatoriamente possui o MESMO NOME da sua classe pblica.

onde: modificador tipo de modificador do atributo tipo tipo do atributo nome pode ser qualquer identificador vlido valorInicial valor inicial para o atributo Relacionaremos a lista de atributos que um registro de estudante pode conter. Para cada informao, listaremos os tipos de dados apropriados que sero utilizados. Por exemplo, no seria ideal usar um tipo int para o nome do estudante ou String para a nota do estudante. Abaixo, por exemplo, temos algumas informaes que podemos adicionar ao registro do estudante: nome - String endereo - String idade - int nota de matemtica - double nota de ingls - double nota de cincias double Dicas de programao: 1. Declare todas os atributos de objeto na parte superior da declarao da classe. 2. Declare cada atributo em uma linha. 3. Atributos de objeto, assim como qualquer outro atributo devem iniciar com letra MINSCULA. 4. Use o tipo de dado apropriado para cada atributo declarado. 5. Declare atributos de objetos como private de modo que somente os mtodos da classe possam acess-los diretamente. Futuramente, possvel adicionar mais informaes. Para este exemplo, utilizaremos somente estas. 13.2.1. Atributos de Objeto Agora que temos uma lista de todos os atributos que queremos adicionar nossa classe, vamos adicion-los ao nosso cdigo. Uma vez que queremos que estes atributos sejam nicos para cada objeto (ou para cada estudante), devemos declar-los como atributos de objeto. Por exemplo: public class StudentRecord { private String name; private String address; private int age; private double mathGrade; private double scienceGrade; } onde: private significa que os atributos so acessveis apenas de dentro da classe. Outros objetos no podem acessar diretamente estes atributos.

108

13.2.2. Atributos de Classe ou Atributos Estticos Alm das atributos de objeto, podemos tambm declarar atributos de classe ou atributos que pertenam classe como um todo. O valor destes atributos o mesmo para todos os objetos da mesma classe. Suponha que queiramos saber o nmero total de registros criados para a classe. Podemos declarar um atributo esttico que armazenar este valor. Vamos cham-lo de studentCount. Para declarar um atributo esttico: public class StudentRecord { // atributos de objeto declarados anteriormente private static int studentCount; } usamos a palavra-chave static para indicar que um atributo esttico. Ento, nosso cdigo completo deve estar assim: public class StudentRecord { private String name; private String address; private int age; private double mathGrade; private double englishGrade; private double scienceGrade; private static int studentCount; } 13.3. Declarando Mtodos Antes de discutirmos quais mtodos que a nossa classe dever conter, vejamos a sintaxe geral usada para a declarao de mtodos. Para declararmos mtodos, escrevemos: <modificador>* <tipoRetorno> <nome>(<argumento>*) { <instrues>* } onde: <modificador> pode ser utilizado qualquer modificador de acesso <tipoRetorno> pode ser qualquer tipo de dado (incluindo void) <nome> pode ser qualquer identificador vlido <argumento> argumentos recebidos pelo mtodo separados por vrgulas. So definidos por: <tipoArgumento> <nomeArgumento> 109

13.3.1. Mtodos assessores Para que se possa implementar o princpio do encapsulamento, isto , no permitir que quaisquer objetos acessem os nossos dados de qualquer modo, declaramos campos, ou atributos, da nossa classe como particulares. Entretanto, h momentos em que queremos que outros objetos acessem estes dados particulares. Para que possamos fazer isso, criamos mtodos assessores. Mtodos assessores so usados para ler valores de atributos de objeto ou de classe. O mtodo assessor recebe o nome de get<NomeDoAtributo>. Ele retorna um valor. Para o nosso exemplo, queremos um mtodo que possa ler o nome, endereo, nota de ingls, nota de matemtica e nota de cincias do estudante. Vamos dar uma olhada na implementao deste: public class StudentRecord { private String name; : : public String getName() { return name; } } onde: public significa que o mtodo pode ser chamado por objetos externos classe String o tipo do retorno do mtodo. Isto significa que o mtodo deve retornar um valor de tipo String getName o nome do mtodo () significa que o nosso mtodo no tem nenhum argumento A instruo: return name; no mtodo, significa que retornar o contedo do atributo name ao mtodo que o chamou. Note que o tipo do retorno do mtodo deve ser do mesmo tipo do atributo utilizado na declarao return. O seguinte erro de compilao ocorrer caso o mtodo e o atributo de retorno no tenham o mesmo tipo de dados: StudentRecord.java:14: incompatible types found : int required: java.lang.String return name; ^ 1 error 110

Outro exemplo de um mtodo assessor o mtodo getAverage: public class StudentRecord { private String name; : : public double getAverage(){ double result = 0; result = (mathGrade+englishGrade+scienceGrade)/3; return result; } } O mtodo getAverage calcula a mdia das 3 notas e retorna o resultado. 13.3.2. Mtodos modificadores Para que outros objetos possam modificar os nossos dados, disponibilizamos mtodos que possam gravar ou modificar os valores dos atributos de objeto ou de classe. Chamamos a estes mtodos modificadores. Este mtodo escrito como set<NomeDoAtributoDeObjeto>. Vamos dar uma olhada na implementao de um mtodo modificador: public class StudentRecord { private String name; : : public void setName(String temp) { name = temp; } } onde: public significa que o mtodo pode ser chamado por objetos externos classe void significa que o mtodo no retorna valor setName o nome do mtodo (String temp) argumento que ser utilizado dentro do nosso mtodo A instruo: name = temp; atribuir o contedo de temp para name e, portanto, alterar os dados dentro do atributo de objeto name. Mtodos modificadores no retornam valores. Entretanto, eles devem receber um argumento com o mesmo tipo do atributo no qual esto tratando. 111

13.3.3. Mltiplos comandos return possvel ter vrios comandos return para um mtodo desde que eles no pertenam ao mesmo bloco. possvel utilizar constantes para retornar valores, ao invs de atributos. Por exemplo, considere o mtodo: public String getNumberInWords(int num) { String defaultNum = "zero"; if (num == 1) { return "one"; // retorna uma constante } else if( num == 2) { return "two"; // retorna uma constante } // retorna um atributo return defaultNum; } 13.3.4. Mtodos estticos Para o atributo esttico studentCount, podemos criar um mtodo esttico para obter o seu contedo. public class StudentRecord { private static int studentCount; public static int getStudentCount(){ return studentCount; } } onde: public significa que o mtodo pode ser chamado por objetos externos classe static significa que o mtodo esttico e deve ser chamado digitando-se [NomeClasse].[nomeMtodo] int o tipo do retorno do mtodo. Significa que o mtodo deve retornar um valor de tipo int getStudentCount nome do mtodo () significa que o mtodo no tem nenhum argumento Por enquanto, getStudentCount retornar sempre o valor zero j que ainda no fizemos nada na nossa classe para atribuir o seu valor. Modificaremos o valor de studentCount mais tarde, quando discutirmos construtores. 13.3.5. Exemplo de Cdigo Fonte para a classe StudentRecord Na pgina seguinte est o cdigo para a nossa classe StudentRecord: 112

Dicas de programao: 1. Nomes de mtodos devem iniciar com letra MINSCULA. 2. Nomes de mtodos devem conter verbos 3. Sempre faa documentao antes da declarao do mtodo. Use o estilo javadoc para isso

public class StudentRecord { private String name; private String address; private int age; private double mathGrade; private double englishGrade; private double scienceGrade; private static int studentCount; /** * Retorna o nome do estudante */ public String getName(){ return name; } /** * Muda o nome do estudante */ public void setName( String temp ){ name = temp; } // outros mtodos modificadores aqui .... /** * Calcula a mdia das classes de ingls, matemtica * e cincias */ public double getAverage(){ double result = 0; result = (mathGrade+englishGrade+scienceGrade)/3; return result; } /** * Retorna o nmero de ocorrncias em StudentRecords */ public static int getStudentCount(){ return studentCount; } } Aqui est um exemplo do cdigo de uma classe que utiliza a nossa classe StudentRecord. public class StudentRecordExample { public static void main( String[] args ){ // criar trs objetos para StudentRecord StudentRecord annaRecord = new StudentRecord(); StudentRecord beahRecord = new StudentRecord(); StudentRecord crisRecord = new StudentRecord(); // enviar o nome dos estudantes 113

annaRecord.setName("Anna"); beahRecord.setName("Beah"); crisRecord.setName("Cris"); // mostrar o nome de anna System.out.println(annaRecord.getName()); //mostrar o nmero de estudantes System.out.println("Count=" + StudentRecord.getStudentCount()); } } A sada desta classe : Anna Count = 0 13.4. this O objeto this usado para acessar atributos de objeto ou mtodos da classe. Para entender isso melhor, tomemos o mtodo setAge como exemplo. Suponha que tenhamos o seguinte mtodo para setAge: public void setAge(int age){ age = age; // No uma boa prtica } O nome do argumento nesta declarao age, que tem o mesmo nome do atributo de objeto age. J que o argumento age a declarao mais prxima do mtodo, o valor do argumento age ser usado. Na instruo: age = age; estamos simplesmente associando o valor do argumento age para si mesmo! Isto no o que queremos que acontea no nosso cdigo. A fim de corrigir esse erro, usamos o objeto this. Para utilizar o objeto this, digitamos: this.<nomeDoAtributo> O ideal reescrever o nosso mtodo do seguinte modo: public void setAge(int age){ this.age = age; }

Este mtodo ir atribuir o valor do argumento age para a atributo de objeto age do objeto StudentRecord.

114

13.5. Overloading de Mtodos Nas nossas classes, podemos necessitar de criar mtodos que tenham os mesmos nomes, mas que funcionem de maneira diferente dependendo dos argumentos que informamos. Esta capacidade chamada de overloading de mtodos. Overloading de mtodos permite que um mtodo com o mesmo nome, entretanto com diferentes argumentos, possa ter implementaes diferentes e retornar valores de diferentes tipos. Ao invs de inventar novos nomes todas as vezes, o overloading de mtodos pode ser utilizado quando a mesma operao tem implementaes diferentes. Por exemplo, na nossa classe StudentRecord, queremos ter um mtodo que mostre as informaes sobre o estudante. Entretanto, queremos que o mtodo print mostre dados diferentes dependendo dos argumentos que lhe informamos. Por exemplo, quando no enviamos qualquer argumento queremos que o mtodo print mostre o nome, endereo e idade do estudante. Quando passamos 3 valores double, queremos que o mtodo mostre o nome e as notas do estudante. Temos os seguintes mtodos dentro da nossa classe StudentRecord: public void print(){ System.out.println("Name:" + name); System.out.println("Address:" + address); System.out.println("Age:" + age); } public void print(double eGrade, double mGrade, double sGrade) System.out.println("Name:" + name); System.out.println("Math Grade:" + mGrade); System.out.println("English Grade:" + eGrade); System.out.println("Science Grade:" + sGrade); } Quando tentamos chamar estes mtodos no mtodo main, criado para a classe StudantRecordExample: public static void main(String[] args) { StudentRecord annaRecord = StudentRecord(); annaRecord.setName("Anna"); annaRecord.setAddress("Philippines"); annaRecord.setAge(15); annaRecord.setMathGrade(80); annaRecord.setEnglishGrade(95.5); annaRecord.setScienceGrade(100); // overloading de mtodos annaRecord.print(); annaRecord.print( annaRecord.getEnglishGrade(), annaRecord.getMathGrade(), annaRecord.getScienceGrade()); } 115 new

teremos a sada para a primeira chamada ao mtodo print: Name:Anna Address:Philippines Age:15 e, em seguida, a sada para a segunda chamada ao mtodo print: Name:Anna Math Grade:80.0 English Grade:95.5 Science Grade:100.0 Lembre-se sempre que mtodos overload possuem as seguintes propriedades: 1. o mesmo nome 2. argumentos diferentes 3. tipo do retorno igual ou diferente 13.6. Declarando Construtores Discutimos anteriormente o conceito de construtores. Construtores so importantes na criao de um objeto. um mtodo onde so colocadas todas as inicializaes. A seguir, temos as propriedades de um construtor: 1. Possuem o mesmo nome da classe 2. Construtor um mtodo, entretanto, somente as seguintes informaes podem ser colocadas no cabealho do construtor: Escopo ou identificador de acessibilidade (como public) Nome do construtor Argumentos, caso necessrio 3. No retornam valor 4. So executados automaticamente na utilizao do operador new durante a instanciao da classe. Para declarar um construtor, escrevemos: [modificador] <nomeClasse> (<argumento>*) { <instruo>* } 13.6.1. Construtor Padro (default) Toda classe tem o seu construtor padro. O construtor padro um construtor pblico e sem argumentos. Se no for definido um construtor para a classe, ento, implicitamente, assumido um construtor padro. Por exemplo, na nossa classe StudentRecord, o construtor padro definido do seguinte modo: 116

public StudentRecord() { } 13.6.2. Overloading de Construtores Como mencionamos, construtores tambm podem sofrer overloading, por exemplo, temos aqui quatro construtores: public StudentRecord() { // qualquer cdigo de inicializao aqui } public StudentRecord(String temp){ this.name = temp; } public StudentRecord(String name, String address) { this.name = name; this.address = address; } public StudentRecord(double mGrade, double eGrade, double sGrade) { mathGrade = mGrade; englishGrade = eGrade; scienceGrade = sGrade; } 13.6.3. Usando Construtores Para utilizar estes construtores, temos as seguintes instrues: public static void main(String[] args) { // criar trs objetos para o registro do estudante StudentRecord annaRecord = new StudentRecord("Anna"); StudentRecord beahRecord = new StudentRecord("Beah", "Philippines"); StudentRecord crisRecord = new StudentRecord(80,90,100); // algum cdigo aqui } Antes de continuarmos, vamos retornar o atributo esttico studentCount que declaramos agora a pouco. O objetivo de studentCount contar o nmero de objetos que so instanciados com a classe StudentRecord. Ento, o que desejamos incrementar o valor de studentCount toda vez que um objeto da classe StudentRecord instanciado. Um bom local para modificar e incrementar o valor de studentCount nos construtores, pois so sempre chamados toda vez que um objeto instanciado. Como no exemplo da pgina a seguir: 117

public StudentRecord() { studentCount++; // adicionar um estudante } public StudentRecord(String name) { studentCount++; // adicionar um estudante this.name = name; } public StudentRecord(String name, String address) { studentCount++; // adicionar um estudante this.name = name; this.address = address; } public StudentRecord(double mGrade, double eGrade, double sGrade) { studentCount++; // adicionar um estudante mathGrade = mGrade; englishGrade = eGrade; scienceGrade = sGrade; } 13.6.4. Utilizando o this() Chamadas a construtores podem ser cruzadas, o que significa ser possvel chamar um construtor de dentro de outro construtor. Usamos a chamada this() para isso. Por exemplo, dado o seguinte cdigo, public StudentRecord() { this("some string"); } public StudentRecord(String temp) { this.name = temp; } public static void main( String[] args ) { StudentRecord annaRecord StudentRecord(); }

new

Dado o cdigo acima, quando se executa a instruo do mtodo main, ser chamado o primeiro construtor. A instruo inicial deste construtor resultar na chamada ao segundo construtor. H algum detalhes que devem ser lembrados na utilizao da chamada ao construtor por this(): 1. A chamada ao construtor DEVE SEMPRE OCORRER NA PRIMEIRA LINHA DE INSTRUO 2. UTILIZADO PARA A CHAMADA DE UM CONSTRUTOR. A chamada ao this() pode ser seguida por outras instrues. 118

Como boa prtica de programao, ideal nunca construir mtodos que repitam as instrues. Buscamos a utilizao de overloading com o objetivo de evitarmos essa repetio. Deste modo, reescreveremos os construtores da classe StudentRecord para: public StudentRecord() { studentCount++; // adicionar um estudante } public StudentRecord(String name) { this(); this.name = name; } public StudentRecord(String name, String address) { this(name); this.address = address; } public StudentRecord(double mGrade, double eGrade, double sGrade) { this(); mathGrade = mGrade; englishGrade = eGrade; scienceGrade = sGrade; } 13.7. Pacotes So utilizados para agrupar classes e interfaces relacionadas em uma nica unidade (discutiremos interfaces mais tarde). Esta uma caracterstica poderosa que oferece um mecanismo para gerenciamento de um grande grupo de classes e interfaces e evita possveis conflitos de nome. 13.7.1. Importando Pacotes Para utilizar classes externas ao pacote da classe, necessrio importar os pacotes dessas classes. Por padro, todos as suas classes Java importam o pacote java.lang. por isso que possvel utilizar classes como String e Integer dentro da sua classe, mesmo no tendo importado nenhum pacote explicitamente. A sintaxe para importar pacotes como segue: import <nomeDoPacote>.<nomeDaClasse>; Por exemplo, necessitar utilizar a classe Color dentro do pacote awt, necessrio a seguinte instruo: import java.awt.Color; ou: import java.awt.*; 119

A primeira linha de instruo importa especificamente a classe Color enquanto que a seguinte importa todas as classes do pacote java.awt. Outra maneira de importar classes de outros pacotes atravs da referncia explcita ao pacote. Isto feito utilizando-se o nome completo do pacote para declarao do objeto na classe: java.awt.Color color; 13.7.2. Criando pacotes Para criar os nossos pacotes, escrevemos: package <nomeDoPacote>; Suponha que desejamos criar um pacote onde colocaremos a nossa classe StudentRecord juntamente com outras classes relacionadas. Chamaremos o nosso pacote de schoolClasses. A primeira coisa que temos que fazer criar uma pasta chamada schoolClasses. Em seguida, copiar para esta pasta todas as classes que pertenam a este pacote. Adicione a seguinte instruo no arquivo da classe, esta linha deve ser colocada antes da definio da classe. Por exemplo: package schoolClasses; public class StudentRecord { // instrues da classe } Pacotes podem ser aninhados. Neste caso, o interpretador espera que a estrutura de diretrios contendo as classes combinem com a hierarquia dos pacotes. 13.7.3. Definindo a varivel de ambiente CLASSPATH Suponha que colocamos o pacote schoolClasses sob o diretrio C:\. Precisamos que a classpath aponte para este diretrio de tal forma que quando executemos a classe, a JVM seja capaz de enxergar onde est armazenada. Antes de discutirmos como ajustar a varivel classpath, vamos ver um exemplo sobre o que aconteceria se esta no fosse ajustada. Suponha que sigamos os passos para compilar e executar a classe StudentRecord que escrevemos:

120

C:\schoolClasses>javac StudentRecord.java C:\schoolClasses>java StudentRecord Exception in thread "main" java.lang.NoClassDefFoundError: StudentRecord (wrong name: schoolClasses/StudentRecord) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at java.security.SecureClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.defineClass(Unknown Source) at java.net.URLClassLoader.access$100(Unknown Source) at java.net.URLClassLoader$1.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClassInternal(Unknown Source) Surge o erro NoClassDefFoundError, que significa que o Java desconhece onde procurar por esta classe. A razo disso que a sua classe StudentRecord pertence a um pacote denominado schoolClasses. Se desejamos executar esta classe, teremos que dizer ao Java o seu nome completo schoolClasses.StudentRecord. Tambm teremos que dizer JVM onde procurar pelos nossos pacotes, que, neste caso, no C:\. Para fazer isso, devemos definir a varivel classpath. Para definir a varivel classpath no Windows, digitamos o seguinte na linha de comando: C:\schoolClasses>set classpath=C:\ onde C:\ o diretrio onde colocamos os pacotes. Aps definir a varivel classpath, poderemos executar a nossa classe em qualquer pasta, digitando: C:\schoolClasses>java schoolClasses.StudentRecord Para sistemas baseados no Unix, suponha que as nossas classes estejam no diretrio usr/local/myClasses, escrevemos: export classpath=/usr/local/myClasses Observe que possvel definir a varivel classpath em qualquer lugar. possvel definir mais de um local de pesquisa; basta separ-los por ponto-evrgula (no Windows) e dois-pontos (nos sistemas baseados em Unix). Por exemplo: set classpath=C:\myClasses;D:\;E:\MyPrograms\Java e para sistemas baseados no Unix:

121

export classpath=/usr/local/java:/usr/myClasses 13.8. Modificadores de Acesso Quando estamos criando as nossas classes e definindo as suas propriedades e mtodos, queremos implementar algum tipo de restrio para se acessar esses dados. Por exemplo, ao necessitar que um certo atributo seja modificado apenas pelos mtodos dentro da classe, possvel esconder isso dos outros objetos que estejam usando a sua classe. Para implementar isso, no Java, temos os modificadores de acesso. Existem quatro diferentes tipos de modificadores de acesso: public, private, protected e default. Os trs primeiros modificadores so escritos explicitamente no cdigo para indicar o acesso, para o tipo default, no se utiliza nenhuma palavrachave. 13.8.1. Acesso padro Especifica que os elementos da classe so acessveis somente aos mtodos internos da classe e s suas subclasses. No h palavra chave para o modificador default; sendo aplicado na ausncia de um modificador de acesso. Por exemplo: public class StudentRecord { // acesso padro ao atributo int name; // acesso padro para o mtodo String getName(){ return name; } } O atributo de objeto name e o mtodo getName() podem ser acessados somente por mtodos internos classe e por subclasses de StudentRecord. Falaremos sobre subclasses em prximas lies. 13.8.2. Acesso pblico Especifica que os elementos da classe so acessveis tanto internamente quanto externamente classe. Qualquer objeto que interage com a classe pode ter acesso aos elementos pblicos da classe. Por exemplo: public class StudentRecord { // acesso pblico o atributo public int name; // acesso pblico para o mtodo public String getName(){ return name; } } 122

O atributo de objeto name e o mtodo getName() podem ser acessados a partir de outros objetos. 18.8.3. Acesso protegido Especifica que somente classes no mesmo pacote podem ter acesso aos atributos e mtodos da classe. Por exemplo: public class StudentRecord { //acesso protegido ao atributo protected int name; //acesso protegido para o mtodo protected String getName(){ return name; } } O atributo de objeto name e o mtodo getName() podem ser acessados por outros objetos, desde que o objetos pertenam ao mesmo pacote da classe StudentRecord. 13.8.4. Acesso particular Especifica que os elementos da classe so acessveis somente na classe que o definiu. Por exemplo: public class StudentRecord { // acesso particular ao atributo private int name; // acesso particular para o mtodo private String getName(){ return name; } } O atributo de objeto name e o mtodo getName() podem ser acessados somente por mtodos internos classe. EXERCCIOS 1. Sua tarefa criar uma classe que contenha um Registro de Agenda. A tabela 1 descreve as informaes que um Registro de Agenda deve conter: Dicas de programao: Normalmente, os atributos de objeto de uma classe devem ser declarados particulares e a classe pode fornecer mtodos assessores e modificadores para estes

123

Crie os seguintes mtodos: 1. Fornea todos os mtodos assessores e modificadores necessrios para todos os atributos. 2. Construtores. 2. Crie uma classe Agenda que possa conter entradas de objetos tipo Registro de Agenda (utilize a classe criada no primeiro exerccio). Devem ser oferecidos os seguintes mtodos para a agenda: 1. Adicionar registro 2. Excluir registro 3. Visualizar registros 4. Modificar um registro

DESAFIO A emprea MagSoft contrata desenvolvedores para trabalhar em projetos de software. Implemente uma soluo em Java para o controle do empregados e projetos usando pacote Java.

124

14. Herana, polimorfismo e interfaces


14.1. Herana Todas as classes, incluindo as que compem a API Java, so subclasses da classe Object. Um exemplo de hierarquia de classes mostrado com a figura. A partir de uma determinada classe, qualquer classe acima desta na hierarquia de classes conhecida como uma superclasse (ou classe Pai). Enquanto que qualquer classe abaixo na hierarquia de classes conhecia como uma subclasse (ou classe Filho).

Herana um dos principais princpios em orientao a objeto. Um comportamento (mtodo) definido e codificado uma nica vez em uma nica classe e este comportamento herdado por todas suas subclasses. Uma subclasse precisa apenas implementar as diferenas em relao a sua classe pai, ou seja, adaptar-se ao meio em que vive. 14.1.1. Definindo Superclasses e Subclasses Para herdar uma classe usamos a palavra-chave extends. Ilustraremos criando uma classe pai de exemplo. Suponha que tenhamos uma classe pai chamada Person. public class Person { protected String name; protected String address; /** * Construtor Padro */ public Person(){ System.out.println("Inside Person:Constructor"); name = ""; address = ""; } /** * Construtor com 2 parmetros */ public Person( String name, String address ){ 125

this.name = name; this.address = address; } /** * Mtodos modificadores e acessores */ public String getName(){ return name; } public String getAddress(){ return address; } public void setName( String name ){ this.name = name; } public void setAddress( String add ){ this.address = add; } } Os atributos name e address so declarados como protected. A razo de termos feito isto que queremos que estes atributos sejam acessveis s subclasses dessa classe. Se a declararmos com o modificador private, as subclasses no estaro aptas a us-los. Todas as propriedades de uma superclasse que so declaradas como public, protected e default podem ser acessadas por suas subclasses. Vamos criar outra classe chamada Student. E, como um estudante tambm uma pessoa, conclumos que iremos estender a classe Person, ento, poderemos herdar todas as propriedades existntes na classe Person . Para isto, escrevemos: public class Student extends Person { public Student(){ System.out.println("Inside Student:Constructor"); //Algum cdigo aqui } // Algum cdigo aqui }

O fluxo de controle mostrado na figura da pgina seguinte. 126

Quando a classe Student for instanciada, o construtor padro da superclasse Person invocado implicitamente para fazer as inicializaes necessrias. Aps isso, as instrues dentro do construtor da subclasse so executadas. Para ilustrar, considere o seguinte cdigo: public static void main( String[] args ){ Student anna = new Student(); } No cdigo, criamos um objeto da classe Student. O resultado da execuo deste programa : Inside Person:Constructor Inside Student:Constructor 14.1.2. super Uma subclasse pode, explicitamente, chamar um construtor de sua superclasse imediata. Isso feito utilizando uma chamada ao objeto super. Uma chamada ao super no construtor de uma subclasse ir resultar na execuo de um construtor especfico da superclasse baseado nos argumentos passados. Por exemplo, dada a seguinte instruo para a classe Student: public Student(){ super( "SomeName", "SomeAddress" ); System.out.println("Inside Student:Constructor"); } Este cdigo chama o segundo construtor de sua superclasse imediata (a classe Person) e a executa. Outro cdigo de exemplo mostrado na prxima pgina: 127

public Student(){ super(); System.out.println("Inside Student:Constructor"); } Este cdigo chama o construtor padro de sua superclasse imediata (a classe Person) e o executa. Devemos relembrar, quando usamos uma chamada ao objeto super: 1. A instruo super() DEVE SER A PRIMEIRA INSTRUO EM UM CONSTRUTOR. 2. As instrues this() e super() no podem ocorrer imultaneamente no mesmo construtor. O objeto super uma referncia aos membros da superclasse (assim como o objeto this da sua prpria classe). Por exemplo: public Student() { super.name = "person name"; // Nome da classe pai this.name = "student name"; // Nome da classe atual } 14.1.3. Override de Mtodos Se, por alguma razo, uma classe derivada necessita que a implementao de algum mtodo seja diferente da superclasse, o polimorfismo por override pode vir a ser muito til. Uma subclasse pode modificar um mtodo definido em sua superclasse fornecendo uma nova implementao para aquele mtodo. Supondo que tenhamos a seguinte implementao para o mtodo getName da superclasse Person: public class Person { ... public String getName(){ System.out.println("Parent: getName"); return name; } ... } Para realizar um polimorfismo por override no mtodo getName da subclasse Student, escrevemos: public class Student extends Person { ... public String getName(){ System.out.println("Student: getName"); return name; } ... 128

} Ento, quando invocarmos o mtodo getName de um objeto da classe Student, o mtodo chamado ser o de Student, e a sada ser: Student: getName possvel chamar o mtodo getName da superclasse, basta para isso: public class Student extends Person { ... public String getName() { super.getName(); System.out.println("Student: getName"); return name; } ... } Inserimos uma chamada ao objeto super e a sada ser: Parent: getName Student: getName 14.1.4. Mtodos final e Classes final Podemos declarar classes que no permitem a herana. Estas classes so chamadas classes finais. Para definir que uma classe seja final, adicionamos a palavra-chave final na declarao da classe (na posio do modificador). Por exemplo, desejamos que a classe Person no possa ser herdada por nenhuma outra classe, escrevemos: public final class Person { // Cdigo da classe aqui } Muitas classes na API Java so declaradas final para certificar que seu comportamento no seja herdado e, possivelmente , modificado. Exemplos, so as classes Integer, Double e Math. Tambm possvel criar mtodos que no possam ser modificados pelos filhos, impedindo o polimorfismo por override. Estes mtodos so o que chamamos de mtodos finais. Para declarar um mtodo final, adicionamos a palavra-chave final na declarao do mtodo (na posio do modificador). Por exemplo, se queremos que o mtodo getName da classe Person no possa ser modificado, escrevemos: public final String getName(){ return name; 129

} Caso o programador tente herdar uma classe final, ocorrer um erro de compilao. O mesmo acontecer ao se tentar fazer um override de um mtodo final. 14.2. Polimorfismo Considerando a classe pai Person e a subclasse Student do exemplo anterior, adicionaremos outra subclasse a Person, que se chamar Employee. Abaixo est a hierarquia de classes que ilustra o cenrio:

Podemos criar uma referncia do tipo da superclasse para a subclasse. Por exemplo: public static main( String[] args ) { Person ref; Student studentObject = new Student(); Employee employeeObject = new Employee(); ref = studentObject; //Person ref: ponteiro para um Student // algum cdigo aqui } Supondo que tenhamos um mtodo getName em nossa superclasse Person, iremos realizar uma modificao deste nas subclasses Student e Employee: public class Person { public String getName(){ System.out.println("Person Name:" + name); return name; } } public class Student extends Person { public String getName(){ System.out.println("Student Name:" + name); return name; } } public class Employee extends Person { public String getName(){ System.out.println("Employee Name:" + name); return name; 130

} } Voltando ao mtodo main, quando tentamos chamar o mtodo getName da referncia ref do tipo Person, o mtodo getName do objeto Student ser chamado. Agora, se atribuirmos ref ao objeto Employee, o mtodo getName de Employee ser chamado. public static main(String[] args) { Person ref; Student studentObject = new Student(); Employee employeeObject = new Employee(); ref = studentObject; //ponteiro de referncia para um Student String temp = ref.getName(); //getName de Student chamado System.out.println(temp); ref = employeeObject; // ponteiro de referncia Person para um // objeto Employee String temp = ref.getName(); // getName de Employee // classe chamada System.out.println(temp); } A capacidade de uma referncia mudar de comportamento de acordo com o objeto a que se refere chamada de polimorfismo. O polimorfismo permite que mltiplos objetos de diferentes subclasses sejam tratados como objetos de uma nica superclasse, e que automaticamente sejam selecionados os mtodos adequados a serem aplicados a um objeto em particular, baseado na subclasse a que ele pertena. Outro exemplo que demonstra o polimorfismo realizado ao passar uma referncia a mtodos. Supondo que exista um mtodo esttico printInformation que recebe como parmetro um objeto do tipo Person, pode-se passar uma referncia do tipo Employee e do tipo Student, porque so subclasses do tipo Person. public static main(String[] args) { Student studentObject = new Student(); Employee employeeObject = new Employee(); printInformation(studentObject); printInformation(employeeObject); } public static printInformation(Person p){ ...

131

} 14.3. Classes Abstratas Para criar mtodos em classes devemos, necessariamente, saber qual o seu comportamento. Entretanto, em muitos casos no sabemos como estes mtodos se comportaro na classe que estamos criando, e, por mera questo de padronizao, desejamos que as classes que herdem desta classe possuam, obrigatoriamente, estes mtodos. Por exemplo, queremos criar uma superclasse chamada LivingThing. Esta classe tem certos mtodos como breath, sleep e walk. Entretanto, existem tantos mtodos nesta superclasse que no podemos generalizar este comportamento. Tome por exemplo, o mtodo walk (andar). Nem todos os seres vivos andam da mesma maneira. Tomando os humanos como exemplo, os humanos andam sobre duas pernas, enquanto que outros seres vivos como os ces andam sobre quatro. Entretanto, existem muitas caractersticas que os seres vivos tm em comum, isto o que ns queremos ao criar uma superclasse geral.

Para realizarmos isto, teremos que criar uma superclasse que possua alguns mtodos com implementaes e outros no. Este tipo de classe chamada de classe abstrata. Uma classe abstrata uma classe que no pode gerar um objeto. Freqentemente aparece no topo de uma hierarquia de classes no modelo de programao orientada a objetos. Os mtodos nas classes abstratas que no tm implementao so chamados de mtodos abstratos. Para criar um mtodo abstrato, apenas escreva a assinatura do mtodo sem o corpo e use a palavra-chave abstract. Por exemplo: public abstract void someMethod(); Agora, vamos criar um exemplo de classe abstrata: public abstract class LivingThing { public void breath(){ System.out.println("Living Thing breathing..."); } public void eat(){ System.out.println("Living Thing eating..."); } /** * mtodo abstrato walk * Queremos que este mtodo seja criado pela * subclasse de LivingThing */ 132

public abstract void walk(); } Quando uma classe estende a classe abstrata LivingThing, ela obrigada a implementar o mtodo abstrato walk. Por exemplo: public class Human extends LivingThing { public void walk(){ System.out.println("Human walks..."); } } Se a classe Human no implementar o mtodo walk, ser mostrada a seguinte mensagem de erro de compilao: Human.java:1: Human is not abstract and does not override abstract method walk() in LivingThing public class Human extends LivingThing ^ 1 error 14.4. Interfaces Uma interface um tipo especial de classe que contm unicamente mtodos abstratos ou atributos finais. Interfaces, por natureza, so abstratas. Interfaces definem um padro e o caminho pblico para especificao do comportamento de classes. Permitem que classes, independente de sua localizao na estrutura hierrquica, implementem comportamentos comuns. 14.4.1. Porque utilizar Interfaces? Utilizamos interfaces quando queremos classes no relacionadas que implementem mtodos similares. Atravs de interfaces, podemos obter semelhanas entre classes no relacionadas sem forar um relacionamento artificial entre elas. Tomemos como exemplo a classe Line, contm mtodos que obtm o tamanho da linha e compara o objeto Line com objetos de mesma classe. Considere tambm que tenhamos outra classe, MyInteger, que contm mtodos que comparam um objeto MyInteger com objetos da mesma classe. Podemos ver que ambas classes tm os mesmos mtodos similares que os comparam com outros objetos do mesmo tipo, entretanto eles no so relacionados. Para se ter certeza de que essas classes implementem os mesmos mtodos com as mesmas assinaturas, utilizamos as interfaces. Podemos criar uma interface Relation que ter declarada algumas assinaturas de mtodos de comparao. A interface Relation pode ser implementada da seguinte forma: public interface Relation { public boolean isGreater(Object a, Object b); 133
Dicas de programao: Use classes abstratas para definir muitos tipos de comportamentos no topo de uma hierarquia de classes de programao orientada a objetos. Use suas subclasses para prover detalhes de implementao da classe abstrata.

public boolean isLess(Object a, Object b); public boolean isEqual(Object a, Object b); } Outra razo para se utilizar interfaces na programao de objetos revelar uma interface de programao de objeto sem revelar essas classes. Como veremos mais adiante, podemos utilizar uma interface como tipo de dados. Finalmente, precisamos utilizar interfaces como mecanismo alternativo para herana mltipla, que permite s classes em ter mais de uma superclasse. A herana mltipla no est implementada em Java. 14.4.2. Interface vs. Classe Abstrata A principal diferena entre uma interface e uma classe abstrata que a classe abstrata pode possuir mtodos implementados (reais) ou no implementados (abstratos). Na interface, todos os mtodos so obrigatoriamente abstratos e pblicos, tanto que para esta, a palavrachave abstract ou public opcional. 14.4.3. Interface vs. Classe Uma caracterstica comum entre uma interface e uma classe que ambas so tipos. Isto significa que uma interface pode ser usada no lugar onde uma classe esperada. Por exemplo, dadas a classe Person e a interface PersonInterface, as seguintes declaraes so vlidas: PersonInterface pi = new Person(); Person pc = new Person(); Entretanto, no se pode criar uma instncia de uma interface sem implement-la. Um exemplo disso : PersonInterface pi = new PersonInterface(); //ERRO DE //COMPILAO !!! Outra caracterstica comum que ambas, interfaces e classes, podem definir mtodos, embora uma interface no possa t-los implementados. J uma classe pode. 14.4.4. Criando Interfaces Para criarmos uma interface, utilizamos: [public] [abstract] interface <NomeDaInterface> { < [public] [final] <tipoAtributo> <atributo> = <valorInicial>; >* 134

< [public] [abstract] <nomeMetodo>(<parametro>*); >* }

<retorno>

Como exemplo, criaremos uma interface que define o relacionamento entre dois objetos de acordo com a "ordem natural" dos objetos: interface Relation { boolean isGreater(Object a, Object b); boolean isLess(Object a, Object b); boolean isEqual( Object a, Object b); } Para implementar esta interface, usaremos a palavra chave "implements". Por exemplo: /** * Esta classe define um segmento de linha */ public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2) { this.x1 = x1; this.x2 = x2; this.y2 = y2; this.y1 = y1; } public double getLength(){ double length = Math.sqrt((x2-x1)*(x2-x1)+(y2y1)*(y2-y1)); return length; } public boolean isGreater( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen > bLen); } public boolean isLess( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen < bLen); } public boolean isEqual( Object a, Object b){ double aLen = ((Line)a).getLength(); double bLen = ((Line)b).getLength(); return (aLen == bLen); } } 135

Quando a classe implementa uma interface, deve-se implementar todos os mtodos desta, caso contrrio ser mostrado o erro: Line.java:4: Line is not abstract and does not override abstract method isGreater(java.lang.Object,java.lang.Object) in Relation public class Line implements Relation ^ 1 error 14.4.5. Relacionamento de uma Interface para uma Classe Como vimos nas sees anteriores, a classe pode implementar uma interface e para isso prover o cdigo de implementao para todos os mtodos definidos na interface. Outro detalhe a se notar na relao entre uma interface e uma classe. A classe pode apenas estender uma nica superclasse, mas pode implementar diversas interfaces. Um exemplo de uma classe que implementa diversas interfaces: public class Person implements PersonInterface, LivingThing, WhateverInterface { //algumas linhas de cdigo } Outro exemplo de uma classe que estende de outra superclasse e implementa interfaces: public class ComputerScienceStudent extends Student implements PersonInterface, LivingThing { // algumas linhas de cdigo } Uma interface no parte de uma hierarquia de classes. Classes no relacionadas podem implementar a mesma interface. 14.4.6. Herana entre Interfaces Interfaces no so partes de uma hierarquia de classes. Entretanto, interfaces podem ter relacionamentos entre si. Por exemplo, suponha que tenhamos duas interfaces, StudentInterface e PersonInterface. Se StudentInterface estende PersonInterface, esta herda todos os mtodos declarados em PersonInteface. public interface PersonInterface { ... } public interface StudentInterface extends PersonInterface { 136 ... }

EXERCCIOS 1. Neste exerccio, queremos criar um registro mais especializado de Student que contm informaes adicionais sobre um estudante de Cincia da Computao. Sua tarefa estender a classe StudentRecord que foi implementada nas lies anteriores e acrescentar atributos e mtodos que so necessrios para um registro de um estudante de Cincia da Computao. Utilize override para modificar alguns mtodos da super 2. Crie uma classe abstrata chamada Shape com os mtodos abstratos getArea() e getName(). Escreva duas de suas subclasses Circle e Square. E acrescente mtodos adicionais a estas subclasses. classe StudentRecord, caso seja necessrio.

137

15. Tratamento bsico de excees


15.1. O que so Excees (Exception)? Uma exceo um evento que interrompe o fluxo normal de processamento de uma classe. Este evento um erro de algum tipo. Isto causa o trmino anormal da classe. Estes so alguns dos exemplos de excees que podem ter ocorridos em exerccios anteriores: ArrayIndexOutOfBoundsException, ocorre ao acessar um elemento inexistente de um array. NumberFormatException, ocorre ao enviar um parmetro no-numrico para o mtodo Integer.parseInt(). 15.2. Tratando Excees Para tratar excees em Java utilizamos a declarao trycatch-finally. O que devemos fazer para proteger as instrues passveis de gerar uma exceo, inser-las dentro deste bloco. A forma geral de um try-catch-finally : try{ // escreva as instrues passveis de gerar uma exceo // neste bloco }catch (<exceptionType1> <varName1>){ // escreva a ao que o seu programa far caso ocorra // uma exceo de um determinado }. . . }catch (<exceptionTypen> <varNamen>){ // escreva a ao que o seu programa far caso ocorra // uma exceo de um determinado tipo }finally { // escreva a ao que o seu programa executar caso ocorra // ou no um erro ou exceo } Excees geradas durante a execuo do bloco try podem ser detectadas e tratadas num bloco catch. O cdigo no bloco finally sempre executado, ocorrendo ou no a exceo.

A seguir so mostrados os principais aspectos da sintaxe da construo de um try-catchfinally: ? A notao de bloco obrigatria. ? Para cada bloco try, pode haver um ou mais blocos catch, mas somente um bloco finally. 138

? Um bloco try deve que ser seguido de PELO MENOS um bloco catch OU um bloco ? finally, ou ambos. ? Cada bloco catch define o tratamento de uma exceo. ? O cabealho do bloco catch recebe somente um argumento, que a exceo (Exception) que este bloco pretende tratar. ? A exceo deve ser da classe Throwable ou de uma de suas subclasses. Para um melhor entendimento, observe a figura 1 que demonstra o fluxo seguido pelo trycatch-finally:

Tomemos, por exemplo, uma classe que imprime o segundo argumento passado atravs da linha de comandos. Supondo que no h verificao no cdigo para o nmero de argumentos. public class ExceptionExample { public static void main( String[] args ) { System.out.println(args[1]); System.out.println("Finish"); } }

Ao executar esta classe sem informar nenhum argumento e, ao tentar acessar diretamente, conforme o exemplo descrito, o segundo argumento args[1], uma exceo obtida que interromper a execuo normal do programa, e a seguinte mensagem ser mostrada: 139

E x c e p t i o n i n t h r e a d " m a i n " java.lang.ArrayIndexOutOfBoundsException: 1 at ExceptionExample.main(ExceptionExample.java:5) Para prevenir que isto ocorra, podemos colocar o cdigo dentro de um bloco try-catch. O bloco finally opcional. Neste exemplo, no utilizaremos o bloco finally. public class ExceptionExample { public static void main( String[] args ){ try { System.out.println( args[1] ); }catch (ArrayIndexOutOfBoundsException exp) { System.out.println("Exception caught!"); } System.out.println("Finish"); } } Assim, quando tentarmos rodar o programa novamente sem a informao dos argumentos, a sada trataria a exceo e o fluxo do programa no seria interrompido, mostrando o resultado: Exception caught! Finish EXERCCIOS 1. 1. Capturando Excees 1 Dada a seguinte classe: public class TestException { public static void main(String[] args) { for (int i=0; true; i++) { System.out.println("args["+i+"]="+ args[i]); } System.out.println("Quiting..."); } } Compile e rode a classe TestException. E como sada ser: java TestExceptions one two three args[0]=one args[1]=two args[2]=three Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3 at TestExceptions.main(1.java:4) 140

Modifique a classe TestException para tratar esta exceo. A sada depois do tratamento da exceo dever ser: java TestExceptions one two three args[0]=one args[1]=two args[2]=three E x c e p t i o n java.lang.ArrayIndexOutOfBoundsException: 3 Quiting...

c a u g h t :

2. Capturando Excees 2 H uma boa chance de que algumas classes escritas anteriormentes tenham disparados excees. Como as excees no foram tratadas, simplesmente interromperam a execuo. Retorne a estes programas e implemente o tratamento de excees.

141

A01 EXERCCIOS ADICIONAIS


1. Agenda Telefnica
Escrever um programa que cria uma agenda telefnica na qual seja possvel acrescentar, excluir, visualizar e pesquisar os registros. O usurio deve ter a possibilidade de visualizar todos registros por ordem alfabtica ou por ordem crescente de nmeros de telefone. Na pesquisa por registros, o usurio deve ter a opo de pesquisar por nome ou por nmero de telefone. Na pesquisa pelo nome, o usurio deve ter uma opo em que possa selecionar se a pesquisa ser efetuada com base no primeiro ou ltimo nome. MENU PRINCIPAL 1 Adicionar registro na agenda telefnica 2 Excluir registro da agenda telefnica 3 Visualizar todos os registros a ordem alfabtica b ordem numrica crescente de nmero de telefone 4 Pesquisa de registros a por nome 1 pelo primeiro nome 2 pelo ltimo nome b por nmero de telefone 5 Sair Esse um exemplo da aplicao rodando: Adicionar registro na agenda telefnica Digite o Nome: Digite o nmero do Telefone: (* Se o registro j existir, avise o operador da existncia do registro) Visualizar todos os registros Mostra todos os registros em ordem alfabtica Mostra todos os registros em ordem crescente de nmero de telefone Pesquisa registros Pesquisa agenda telefnica por nome Pesquisa agenda telefnica pelo primeiro nome Pesquisa agenda telefnica pelo ltimo nome Pesquisa agenda telefnica por nmero do telefone Sair Fechar agenda telefnica

2. Caa-Minas
Este jogo uma verso simplificada do popular jogo de computador Caa-minas (minesweeper). Inicialmente, questionado se o usurio quer jogar numa grade de 5x5 ou numa grade de 10x10. Voc tem 2 arrays bidimensionais que contm informaes sobre a grade selecionada. Um registro desse array pode conter 0 ou 1. O valor 1 significa que existe uma bomba nessa localizao e o valor 0 se no existir. 142

Por exemplo, dado o seguinte array: int bombList5by5[][]={{0, 0, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 0, 1, 1}, {0, 1, 1, 0, 0}}; Dada a lista de bombas, temos 6 bombas nessa lista. As bombas esto localizadas nas clulas (linha,coluna), (0,2), (2,1), (3,3), (3,4), (4,1) e (4,2). Se o usurio escolhe uma clula que contenha uma bomba, o jogo acaba e todas as bombas so mostradas. Se o usurio escolhe uma clula que no contenha uma bomba, um nmero mostrado naquela posio indicando a quantidade de clulas vizinhas que contm bombas. O jogo dever terminar quando todas as clulas que no contenham bombas tiverem sido marcadas (jogador vence) ou quando o usurio seleciona uma bomba (jogador perde). Segue um exemplo de tela do jogo quando selecionada uma grade 5x5 que tenha o mesmo contedo do array bombList5by5 acima. Benvindo ao Caa-Minas! Escolha o tamanho da grade(Digite 1 para 5x5, Digite 2 para 10x10): 1 [][][][][] [][][][][] [][][][][] [][][][][] [][][][][] Digite linha e coluna da clula que voc quer abrir[linha coluna]: 1 1 [][][][][] [ ] [2] [ ] [ ] [ ] [][][][][] [][][][][] [][][][][] Digite linha e coluna da clula que voc quer abrir[linha coluna]: 3 2 [][][][][] [ ] [2] [ ] [ ] [ ] [][][][][] [ ] [ ] [4] [ ] [ ] [][][][][] Digite linha e coluna da clula que voc quer abrir[linha coluna]: 0 2 [ ] [ ] [X] [ ] [ ] [ ] [2] [ ] [ ] [ ] [][][][][] [ ] [ ] [4] [ ] [ ] [][][][][] Ooppps! Voc pisou numa bomba. Sinto muito, o jogo acabou e voc perdeu! 143

3. Converso Numrica
Criar uma calculadora cientfica que converta os nmeros digitados para as quatro representaes numricas: decimal, binrio, octal e hexadecimal. O projeto deve gerar o seguinte menu na tela. MENU PRINCIPAL: Por favor, selecione o tipo de converso: 1 Binrio para Decimal 2 Decimal para Octal 3 Octal para Hexadecimal 4 Hexadecimal para Binrio 5 Sair A seguinte tela deve ser mostrada quando uma das opes do menu for escolhida. Seleo 1: Digite um nmero binrio: 11000 11000 base 2 = 24 base 10 (volta para o menu principal) Seleo 2: Digite um nmero Decimal: 24 24 base 10 = 30 base 8 (volta para o menu principal) Seleo 3: Digite um nmero Octal: 30 30 base 8 = 18 base 16 (volta para o menu principal) Seleo 4: Digite um nmero Hexadecimal: 18 18 base 16 = 11000 base 2 Seleo 1: Digite um nmero Binrio: 110A Nmero binrio invlido! Digite um nmero binrio: 1 1 base 2 = 1 base 10 (volta para o menu principal) Usurio selecionou 5 Tchau!

144

Bibliografia
Livros textos: DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 6 Ed. Porto Alegre: Pearson, 2005. Livros de referncia: DEITEL, H. M. e DEITEL, P. J. JAVA: como programar. 3 Ed. Porto Alegre: Bookman, 2001. PRESSMAN, R. Software Engineering: A Pratctitioners Approach. 5 Ed. So Paulo, Mc Graw-Hill, 2000. SOMMERVILLE, Ian. Engenharia de Software. 8 Ed. Pearson, 2004. GONALVES, Edson. Dominando Netbeans Construa Aplicativos Java Tanto em Desktop, Como para Web.CIENCIA MODERN, 2007. BORATTI, Isaias Camilo. Programao Orientada A Objetos em Java. VISUAL BOOKS, 2007. BOENTE, Alfredo. Aprendendo a Programar em Java 2: Orientado a Objetos. Brasport. Rio de Janeiro, 2003. ASCENCIO, Ana Fernanda Gomes e CAMPOS, Edilene Aparecida Veneruchi. Fundamentos da Programao de Computadores - Algoritmos, Pascal, C/C++ E Java. Pearson, 2007. CADENHEAD, Rogers. Aprenda em 21 Dias Java 2. 4 Ed. Campus, 2005. RUBINSTEIN, Roberto. SERSON, Brasport, 2006. Certificao Java 5

151

Sobre o autor
Doutorando em Biotecnologia pelo programa RENORBIO (2006). Mestre em Cincias da Computao pela Universidade Federal de Minas Gerais (1997). Graduado em Fsica pela Universidade Federal do Piau (1991). Experincia em Computao e informtica, atuando principalmente nas reas de: redes de computadores, modelagem de sistemas e bioinformtica. Currculo Lattes: http://lattes.cnpq.br/5095626292200565

152

Vous aimerez peut-être aussi