FJOO Fundamentos Java e Orientação a Objetos [ versão em desenvolvimento ] www.algaworks.com Apostila do curso Fundamentos Java e Orientação a Objetos ALGAWORKS SOFTWARES E TREINAMENTOS FJOO – Fundamentos Java e Orientação a Objetos 3a Edição Setembro/2011 www.algaworks.com +55 (34) 3255-9898 [email protected] Av. Monsenhor Eduardo, 983, Sala 06 A, Bairro Bom Jesus Uberlândia-MG, CEP. 38400-748 www.algaworks.com softwares e treinamentos 2 Apostila do curso Fundamentos Java e Orientação a Objetos Sobre a empresa A AlgaWorks é uma empresa localizada em Uberlândia/MG, que trabalha para fornecer treinamentos em TI de qualidade e softwares que realmente funcionam. Estamos no mercado desde 2004 trabalhando com treinamentos e consultorias sobre a plataforma Java. Nossa missão Capacitar pessoas em tecnologias e metodologias de desenvolvimento de software e fornecer aplicativos na internet de baixo custo que contribuem para a organização da vida de milhares de usuários, micro e pequenas empresas de todo o mundo. Nossa visão Ser reconhecida como uma das principais empresas de treinamentos em TI do Brasil e como a principal exportadora de software web de baixo custo para indivíduos e pequenas empresas do mundo. Nossos valores Honestidade Transparência Respeito Excelência Simplicidade Origem de nosso nome "As algas produzem energia necessária ao seu próprio metabolismo através da fotossíntese ... As algas azuis foram os primeiros serem vivos a aparecerem na Terra, e acredita-se que tenham tido um papel fundamental na formação do oxigênio da atfosmera." A palavra em inglês “Works”, além de trabalho, pode ser traduzido como algo que funciona, que tem sucesso. AlgaWorks foi o nome dado para a nossa empresa, e quer dizer que: Queremos ser uma empresa independente, que através de nosso próprio esforço conseguimos produzir uma energia suficiente para a nossa sobrevivência; Não queremos depender de investidores externos que não agregam conhecimento ao negócio; Desejamos criar alianças com empresas, autônomos, estudantes e profissionais e transmitir todo o nosso conhecimento em tecnologia; Fornecemos softwares que funcionam e agregam valor ao negócio, sem complicações; www.algaworks.com softwares e treinamentos 3 Apostila do curso Fundamentos Java e Orientação a Objetos Tudo isso deve funcionar com sucesso para ajudar nossos clientes, parceiros, fornecedores, colaboradores e acionistas serem mais felizes. www.algaworks.com softwares e treinamentos 4 Apostila do curso Fundamentos Java e Orientação a Objetos Sobre esta apostila Esta apostila faz parte do material didático distribuído pela AlgaWorks para ministrar o curso Fundamentos Java e Orientação a Objetos. Apesar da distribuição desta apostila para fins não-comerciais ser permitida, recomendamos que você sempre prefira compartilhar o link da página de download (http://www.algaworks.com/treinamentos/apostilas) ao invés do arquivo, pois atualizamos nosso material didático constantemente para corrigir erros e incluir melhorias. Para você realmente aproveitar o conteúdo desta apostila e aprender a plataforma Java, é necessário que você já tenha conhecimento prévio de sistema operacionais básico (Windows ou Linux) e lógica de programação. Se você quiser se especializar ainda mais em Java ou outras tecnologias, sugerimos que faça os cursos presenciais na AlgaWorks, pois, além de usarmos este material didático ou outros com qualidade semelhante, você ficará por dentro das últimas novidades e terá a chance de aprender com a experiência de nossos instrutores. Licença desta obra O conteúdo desta apostila está protegido nos termos da licença Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported (http://creativecommons.org/licenses/by-nc-nd/3.0/deed.pt_BR) para a AlgaWorks Softwares, Treinamentos e Serviços Ltda, CNPJ 10.687.566/0001-97. Isso significa que você pode compartilhar (copiar, distribuir e transmitir) esta obra para uso não-comercial, desde que sempre atribua os créditos à AlgaWorks. É vedado a criação de materiais derivados, portanto, você não pode alterar, transformar ou criar algo em cima dessa obra. Para qualquer reutilização ou distribuição, você deve deixar claro a terceiros os termos da licença a que se encontra submetida esta obra. Qualquer das condições acima pode ser renunciada se você obtiver permissão da AlgaWorks. Para uso comercial, você deverá comprar os direitos de uso limitados a um número específico de alunos. Neste caso, fale com nossa área comercial. Encontrou erros ou gostaria de sugerir melhorias? Se você encontrar algum erro neste material ou tiver alguma sugestão, crítica ou elogio, por favor, envie um e-mail para [email protected]. www.algaworks.com softwares e treinamentos 5 Apostila do curso Fundamentos Java e Orientação a Objetos Sobre o autor Thiago Faria de Andrade ([email protected]) é fundador e diretor da AlgaWorks. Iniciou seu interesse por programação aos 14 anos, quando desenvolveu um software para entretenimento e se tornou um dos mais populares no Brasil e outros países de língua portuguesa. Graduado em Sistemas de Informação e certificado como programador Java pela Sun/Oracle (SCJP), Thiago trabalhou em consultorias para grandes empresas de Uberlândia/MG, co-fundou a OpenK Tecnologia e trabalhou como diretor de tecnologia e treinamentos nesta empresa por quase 6 anos. Fundou a AlgaWorks após adquirir 100% das cotas da OpenK Treinamentos, e no ano de 2010, possuía experiência profissional de mais de 10 anos, sendo 7 dedicados à tecnologia Java. Além de programar, Thiago ministra cursos, palestras e presta consultorias sobre Java para órgãos do governo, universidades, pequenas e grandes empresas e pessoas físicas, tendo acumulado aproximadamente 2.500 horas em salas de aulas e auditórios, até o ano de 2010. www.algaworks.com softwares e treinamentos 6 Apostila do curso Fundamentos Java e Orientação a Objetos Índice 1. Objetivo do curso ..................................................................................................................... 9 2. Como aprender Java? ............................................................................................................ 10 2.1. Faça cursos, leia muito e pratique ................................................................................. 10 2.2. Assine revistas e acesse fóruns de discussão ............................................................... 10 2.3. Não menospreze os exercícios ...................................................................................... 10 2.4. Não tenha vergonha em perguntar ................................................................................ 10 2.5. Desconecte-se dos aplicativos de mensagens instantâneas ......................................... 11 2.6. Concentre-se na aula ..................................................................................................... 11 2.7. Evite faltar ou chegar atrasado....................................................................................... 11 2.8. Não se assuste com a sopa de letrinhas ....................................................................... 11 3. A história do Java ................................................................................................................... 12 4. As plataformas Java ............................................................................................................... 13 4.1. A plataforma Java SE ..................................................................................................... 13 4.2. A plataforma Java EE ..................................................................................................... 13 4.3. A plataforma Java ME .................................................................................................... 14 4.4. Java Card, JavaFX e Java TV ........................................................................................ 14 4.5. Como Java evolui? ......................................................................................................... 15 5. Máquina virtual Java .............................................................................................................. 16 5.1. O que é JVM? ................................................................................................................. 16 5.2. A JVM faz o Java ficar lento? ......................................................................................... 18 6. Baixando, instalando e configurando ..................................................................................... 20 6.1. Preciso do JDK ou JRE? ................................................................................................ 20 6.2. Baixando o JDK da Oracle ............................................................................................. 20 6.3. Instalando o JDK no Windows........................................................................................ 22 6.4. Instalando o JDK no Linux .............................................................................................. 27 7. Fundamentos da linguagem ................................................................................................... 30 7.1. Vamos instalar a IDE agora?.......................................................................................... 30 7.2. Codificando o programa “oi mundo” ............................................................................... 30 7.3. Compilando e executando .............................................................................................. 31 7.4. Entendendo o que foi codificado .................................................................................... 32 7.5. Erros comuns dos marinheiros de primeira viagem ....................................................... 33 7.6. Comentários ................................................................................................................... 34 7.7. Seqüências de escape ................................................................................................... 35 7.8. Palavras reservadas ....................................................................................................... 36 7.9. Convenções de código ................................................................................................... 37 7.10. Trabalhando com variáveis ............................................................................................ 37 7.11. Nomeando variáveis ....................................................................................................... 39 7.12. Operadores aritméticos .................................................................................................. 40 7.13. Tipos primitivos ............................................................................................................... 41 7.14. Outros operadores de atribuição .................................................................................... 44 7.15. Conversão de tipos primitivos ........................................................................................ 45 7.16. Promoção aritmética ....................................................................................................... 48 7.17. Trabalhando com strings ................................................................................................ 50 7.18. Recebendo entrada de dados ........................................................................................ 52 7.19. Operadores de comparação e igualdade ....................................................................... 54 7.20. Estruturas de controle if, else if e else ........................................................................... 55 7.21. Programar ifs sem abrir e fechar blocos é legal? ........................................................... 57 7.22. Escopo de variáveis ....................................................................................................... 59 7.23. Operadores lógicos ........................................................................................................ 60 7.24. Estrutura de controle switch ........................................................................................... 63 7.25. Operador ternário ........................................................................................................... 65 7.26. Operadores de incremento e decremento ...................................................................... 66 7.27. Estrutura de controle while ............................................................................................. 68 7.28. Estrutura de controle do/while ........................................................................................ 68 7.29. Estrutura de controle for ................................................................................................. 69 7.30. Cláusulas break e continue ............................................................................................ 70 www.algaworks.com softwares e treinamentos 7 Apostila do curso Fundamentos Java e Orientação a Objetos 8. Próximos capítulos ................................................................................................................. 73 9. Sites Interessantes ................................................................................................................. 73 10. Livros Recomendados............................................................................................................ 74 www.algaworks.com softwares e treinamentos 8 Apostila do curso Fundamentos Java e Orientação a Objetos 1. Objetivo do curso As constantes evoluções da tecnologia exigem das pessoas um freqüente aperfeiçoamento de seus conhecimentos profissionais. No dia-a-dia, muitas pessoas não conseguem acompanhar as mudanças e novidades nas tecnologias. Para estes profissionais, a AlgaWorks oferece treinamentos personalizados, ministrados por pessoas com larga experiência no mercado de software. O conteúdo programático de nossos cursos se adequam à realidade, abordando os temas com aulas presenciais realizadas com muita prática. Tudo isso garante um investimento em TI que se traduz num diferencial competitivo para a empresa, pois sua equipe estará totalmente capacitada a extrair todo seu potencial. Este curso fornece aos profissionais conhecimentos básicos da linguagem Java, que é utilizada para sedimentar conceitos de orientação a objetos, com exemplos práticos desenvolvidos com a linguagem Java. Após a conclusão deste curso, você deverá estar apto a: Fazer o download das ferramentas necessárias para o desenvolvimento com a linguagem de programação Java; Entender e instalar o ambiente de desenvolvimento Java (Java SE); Entender e implementar classes e métodos utilizando a linguagem Java; Editar, compilar e executar aplicações Java; Entender os conceitos de desenvolvimento de aplicações orientado a objetos; Entender conceitos avançados de orientação a objetos, como o polimorfismo; Escrever um aplicativo Java simples, usando interface gráfica de usuário; Escrever programas que implementem os bons conceitos da orientação a objetos, como o encapsulamento. www.algaworks.com softwares e treinamentos 9 Apostila do curso Fundamentos Java e Orientação a Objetos 2. Como aprender Java? 2.1. Faça cursos, leia muito e pratique Você está no caminho certo para aprender Java e quem sabe se tornar um especialista nesta tecnologia. Fazer cursos, ler bons livros e apostilas são excelentes fontes para aprender qualquer tecnologia, mas só isso provavelmente não será suficiente. Aprender qualquer nova tecnologia exige dedicação, concentração e muita prática. Por isso, recomendamos fortemente que, ao estudar cada assunto deste curso, você faça todos os exercícios conforme solicitados durante as aulas. Mesmo que você consiga solucionar os exercícios, procure fazer novamente os mesmos exercícios ou outros semelhantes em casa, pois a repetição lhe ajudará bastante a fixar a sintaxe da linguagem e os conceitos realmente importantes. 2.2. Assine revistas e acesse fóruns de discussão Existem revistas especializadas que falam sobre desenvolvimento em Java, como a Java Magazine (www.javamagazine.com) e MundoJ (www.mundoj.com.br). Nós somos parceiros da MundoJ e indicamos que você a assine, mas se puder, ter as duas revistas chegando em sua casa não é nada mal. Sempre que tiver uma dúvida, além de poder contar com a ajuda de nossos instrutores, recomendamos que você acesse fóruns de discussão como o www.javafree.org e www.guj.com.br. Provavelmente sua dúvida já foi respondida nestes fóruns, por isso, antes de perguntar, faça uma pesquisa rápida. Se você tiver alguma pergunta que não conseguiu encontrar a resposta, não hesite em perguntar. 2.3. Não menospreze os exercícios Se você já tiver algum conhecimento em Java ou outras linguagens que possuam a sintaxe parecida, talvez você ache os primeiros exercícios desse curso simples e queira deixar de fazê-los. Nossa dica é: não menospreze os exercícios! Por mais simples que possam parecer para você, é importante que você os faça para descobrir as diferenças, encontrar problemas (e resolvê-los), exercitar sua criatividade e compilar e executar os códigos. 2.4. Não tenha vergonha em perguntar Tire suas dúvidas quando elas surgirem, não espere outra oportunidade para fazer isso! É comum alguns alunos ficarem com vergonha de fazer alguma pergunta. Nós recomendamos que você faça um esforço para superar esse “medo” e pergunte sempre que tiver alguma dúvida. Nós reconhecemos que ninguém nasce sabendo, e as perguntas dos alunos enriquecem muito mais o curso. Não desperdice a chance de estar com o instrutor disponível para lhe ajudar no que for preciso. www.algaworks.com softwares e treinamentos 10 Apostila do curso Fundamentos Java e Orientação a Objetos 2.5. Desconecte-se dos aplicativos de mensagens instantâneas Evite perder o foco durante as aulas. O uso de programas de mensagens instantâneas, como MSN, Skype e Google Talk são os grandes vilões para você perder todo o investimento que está fazendo. Se possível, permaneça desconectado de qualquer aplicativo que possa lhe tirar a atenção. 2.6. Concentre-se na aula Concentre-se no que o instrutor está explicando. Apesar de nos esforçarmos para preparar uma apostila completa para você, o instrutor sempre explicará os assuntos baseados em suas experiências profissionais. Se você desviar a atenção, pode deixar de aprender coisas muito valiosas para o seu futuro. Pode parecer estranho, mas muitos alunos desviam a atenção estudando. Isso mesmo! Enquanto o instrutor explica sobre algum assunto, alguns alunos empolgados podem querer fazer exercícios para se adiantarem ou pesquisar sobre algum recurso da tecnologia na internet. Apesar de ser um bom sinal (pois indica que o aluno aprendeu com facilidade), recomendamos que tome muito cuidado com essa atitude, pois como mencionado anteriormente, você pode estar perdendo informação importante para sua formação. 2.7. Evite faltar ou chegar atrasado Tente não faltar nas aulas e chegue sempre no horário. Os conteúdos de nossos cursos são bastante intensos, o que quer dizer que, em uma aula de 4 horas, ensinamos muitos conceitos e recursos da tecnologia. Se você perder uma aula ou uma parte dela, terá que se esforçar para recuperar o conteúdo perdido. Apesar de isso ser possível e sempre estarmos disponíveis através de e-mail ou na sala de aula para ajudar você, nada substitui as aulas que ministramos. No caso de cursos à distância, faça as aulas com regularidade para não ficar muito tempo sem contato com as tecnologias. 2.8. Não se assuste com a sopa de letrinhas É muito comum, principalmente em Java, as tecnologias serem identificadas por siglas de poucas letras, e talvez essa seja uma grande barreira que as pessoas que querem aprender Java têm que enfrentar. Quem quer começar a aprender Java é sobrecarregado com siglas como: JDK, JVM, JEE, JSE, JME, J2SE, J2EE, J2ME, J2SDK, JSP, JSF, EL, JSTL, JPA, EJB, JTA, XML, DI, IoC, CoC e outras milhares de letrinhas. Mantenha a calma e não entre em pânico! Concentre-se em aprender cada coisa de uma vez. Você não é obrigado a conhecer todas as siglas para aprender Java, embora no futuro, se você continuar estudando sempre, vai pelo menos saber para que serve cada uma delas. www.algaworks.com softwares e treinamentos 11 Apostila do curso Fundamentos Java e Orientação a Objetos 3. A história do Java Em 1991, a Sun Microsystems financiou uma pesquisa corporativa interna com o codinome Green, acreditando que a próxima área importante seriam os dispositivos eletrônicos inteligentes destinados ao consumidor final. O projeto resultou no desenvolvimento de uma linguagem baseada em C e C++ que seu criador, James Gosling, chamou de Oak (carvalho) em homenagem a uma árvore que dava para a janela do seu escritório na Sun. Descobriu-se mais tarde que já havia uma linguagem de computador chamada Oak, e quando uma equipe da Sun visitou uma cafeteria local, o nome Java (cidade de origem de um tipo de café importado) foi sugerido e pegou. O projeto Green demonstrou a linguagem através de um controle interativo voltado para TV a cabo. Era muita inovação para a época, e o mercado para dispositivos eletrônicos inteligentes destinados ao consumidor final não estava se desenvolvendo tão rapidamente como a Sun tinha previsto. Pior ainda, um contrato importante pelo qual a Sun competia fora concedido a outra empresa. Então, o projeto estava em risco de cancelamento. Por pura sorte, a World Wide Web explodiu em popularidade em 1993 e as pessoas da Sun viram o imediato potencial de utilizar Java para criar páginas da Web com o chamado conteúdo dinâmico (applets). Isso deu nova vida ao projeto. Em maio de 1995, a Sun anunciou Java formalmente em uma conferência importante. Normalmente, um evento como esse não teria gerado muita atenção. Entretanto, Java gerou interesse imediato na comunidade comercial por causa do fenomenal interesse pela World Wide Web. No ano de 2009, durante uma forte crise financeira, a Oracle comprou a Sun, com promessas de continuar inovando e investindo no Java e demais produtos da Sun. Atualmente Java está presente em mais de 4,5 bilhões de dispositivos. A plataforma é utilizada para criar páginas da web com conteúdo interativo e dinâmico, para desenvolver aplicativos corporativos de grande porte, aprimorar a funcionalidade de servidores da World Wide Web, fornecer aplicativos para dispositivos destinados ao consumidor final e para muitas outras finalidades. www.algaworks.com softwares e treinamentos 12 Apostila do curso Fundamentos Java e Orientação a Objetos 4. As plataformas Java O universo Java é composto por uma gama de plataformas, baseadas na idéia de que um software deveria ser capaz de rodar em diferentes máquinas, sistemas e dispositivos. Por diferentes dispositivos entendemos: computadores, servidores, notebooks, handhelds, PDAs (Palm), celulares, cartões inteligentes (smart cards), TVs, geladeiras e tudo mais o que for possível. As principais plataformas do mundo Java são: Java SE, Java EE, Java ME, Java Card, JavaFX e Java TV. Vamos conhecer um pouco de cada uma nos próximos tópicos deste capítulo. 4.1. A plataforma Java SE A Java SE (Java Platform, Standard Edition) é a versão básica, destinada ao desenvolvimento da maior parte das aplicações desktop que rodam nas estações de trabalho. Se você está perdido e não sabe o que baixar no site da Oracle para começar a aprender Java, esta é a plataforma que você precisa. A Java SE é uma rica plataforma que oferece um completo ambiente para o desenvolvimento de aplicações para clientes e servidores. Ela é também a base de outras plataformas. A Oracle distribui a Java SE na forma de um SDK (Software Development Kit). O pacote do SDK, também conhecido como JDK (Java Development Kit), vem com ferramentas para compilação, execução, debugging, geração de documentação (javadoc), empacotador de componentes, bibliotecas comuns e etc. Neste curso nós usaremos esta plataforma, pois é a base para qualquer desenvolvedor Java. 4.2. A plataforma Java EE A Java EE (Java Platform, Enterprise Edition) é uma plataforma padrão para desenvolver aplicações Java de grande porte e/ou para a internet, que inclui bibliotecas e funcionalidades para implementar software Java distribuído, baseado em componentes modulares que executam em servidores de aplicações e que suportam escalabilidade, segurança, integridade e outros requisitos de aplicações corporativas ou de grande porte. A plataforma Java EE possui uma série de especificações (tecnologias) com objetivos distintos, por isso é considerada uma plataforma guarda-chuva. Entre as especificações da Java EE, as mais conhecidas são: Servlets: são componentes Java executados no servidor para gerar conteúdo dinâmico para a web, como HTML e XML. JSP (JavaServer Pages): uma especialização de Servlets que permite que aplicações web desenvolvidas em Java sejam mais fáceis de manter. É similar às tecnologias como ASP e PHP, porém mais robusta por ter todas as facilidades da plataforma Java. www.algaworks.com softwares e treinamentos 13 Apostila do curso Fundamentos Java e Orientação a Objetos JSF (JavaServer Faces): é um framework web baseado em Java que tem como objetivo simplificar o desenvolvimento de interfaces (telas) de sistemas para a web, através de um modelo de componentes reutilizáveis. A proposta é que os sistemas sejam desenvolvidos com a mesma facilidade e produtividade que se desenvolve sistemas desktop (até mesmo com ferramentas que suportam clicar-e-arrastar componentes). JPA (Java Persistence API): é uma API padrão do Java para persistência de 2 dados que usa um conceito de mapeamento objeto-relacional. Essa tecnologia traz alta produtividade para o desenvolvimento de sistemas que necessitam de integração com banco de dados. Só para citar, essa API possibilita que você desenvolva aplicações usando banco de dados sem precisar escrever uma linha sequer de SQL. EJB (Enterprise Java Beans): são componentes que executam em servidores de aplicação e possuem como principais objetivos fornecer facilidade e produtividade no desenvolvimento de componentes distribuídos, transacionados, seguros e portáveis. 1 4.3. A plataforma Java ME A Java ME (Java Platform, Micro Edition) é uma plataforma que possibilita a criação de sistemas embarcados em dispositivos compactos, como celulares, PDAs, controles remotos, etc. A plataforma inclui interfaces visuais flexíveis e suporta o desenvolvimento de aplicações seguras e portáveis. 4.4. Java Card, JavaFX e Java TV A tecnologia Java Card permite que aplicações Java sejam executadas com segurança em cartões inteligentes ou outros dispositivos similares. É muito usada em cartões SIM (chips de telefones celulares) e cartões de bancos. Em cartões SIM, por exemplo, a tecnologia possibilita o armazenamento do identificador do cliente na operadora de telefonia, preferências, agenda de telefones, etc. A plataforma JavaFX é usada para desenvolver aplicações ricas (no sentido de bonitas e interativas) para a internet, que podem ser executadas em uma ampla variedade de dispositivos conectados, como em ambientes desktop, internet (browser), telefones celulares e TVs. A Java TV fornece APIs para desenvolvimento de aplicações que são executadas em set-up boxes (receptores de TV digital), players de Blu-ray e outros dispositivos de mídia digital. 1 Framework – um tipo especial de biblioteca de software que fornece APIs para que sejam desenvolvidos sistemas usando uma estrutura padrão para um ambiente de desenvolvimento específico. 2 Persistência de dados – códigos desenvolvidos para tratar da persistência de dados são responsáveis pelo armazenamento de informações não-voláteis (recuperáveis), como em bancos de dados ou arquivos. www.algaworks.com softwares e treinamentos 14 Apostila do curso Fundamentos Java e Orientação a Objetos 4.5. Como Java evolui? A plataforma Java e todas as tecnologias relacionadas evoluem através da força da comunidade mundial. Para que isso funcione, existe uma entidade chamada JCP (Java Community Process), que organiza e formaliza o processo de definição de uma nova tecnologia ou da atualização de uma tecnologia existente. Para cada nova idéia de tecnologia ou de atualização, é criada uma JSR (Java Specification Request), que nada mais é que um documento que descreve as propostas de como a tecnologia deve funcionar. Para iniciar uma JSR, além da idéia inicial do que deve ser feito e qual o problema que se pretende resolver, são nomeados alguns líderes e vários especialistas no assunto, podendo ser pessoas físicas ou empresas. Esses colaboradores conduzem os trabalhos através de reuniões e processos de revisão e votação, até que a versão final seja alcançada. Ao término de uma JSR, tem-se uma documentação completa sobre o funcionamento da tecnologia, uma implementação de referência na forma de código-fonte e um TCK (Technology Compatibility Kit), que é um conjunto de testes que possibilita a validação de um produto desenvolvido para saber se está em conformidade com a especificação (JSR). Baseadas nas JSRs (especificações), empresas ou comunidades de todo o mundo podem construir produtos (implementações) e oferecer como alternativas aos já existentes, se diferenciando pela qualidade, suporte, documentação e preço. www.algaworks.com softwares e treinamentos 15 Apostila do curso Fundamentos Java e Orientação a Objetos 5. Máquina virtual Java 5.1. O que é JVM? Imagine que você queira escrever um discurso para uma reunião que você vai participar com representantes do Japão, Estados Unidos e Espanha. Esses representantes não sabem falar português, por isso, você terá que aprender a língua deles para se comunicar. É um trabalho possível, porém trabalhoso. O que você poderia fazer para otimizar seu trabalho? O que acha de contratar tradutores que podem falar o seu idioma mais japonês, inglês ou espanhol? Se você fizer isso, estará economizando muito do seu tempo, pois precisará focar apenas no seu texto em português, sem se preocupar com traduções e detalhes de cada língua. É como se fosse uma terceirização do trabalho de tradução para idiomas específicos! www.algaworks.com softwares e treinamentos 16 Apostila do curso Fundamentos Java e Orientação a Objetos O funcionamento de software funciona quase assim. Quando você desenvolve e compila um sistema usando a linguagem C, por exemplo, temos o seguinte cenário para um mesmo sistema que deve funcionar em vários sistemas operacionais: Nessas linguagens de programação, o código-fonte é compilado em código de máquina, que é específico para um SO (sistema operacional) e arquitetura de processador. Isso quer dizer que o binário gerado conhece todos os detalhes do SO para fazer o software funcionar. Se quisermos que o software seja executado em múltiplos sistemas operacionais ou com tipos de processadores diferentes, precisamos compilar novamente nosso código-fonte. Parece simples, mas não é só isso! Muitas vezes os programadores usam recursos específicos do SO dentro do código-fonte, como bibliotecas nativas de interfaces gráficas ou de gerenciamento de memória, por exemplo. Se este for o caso, uma simples compilação não resolve o problema, precisando ter múltiplos projetos com códigos-fonte para cada SO. www.algaworks.com softwares e treinamentos 17 Apostila do curso Fundamentos Java e Orientação a Objetos Com Java, você não precisa se preocupar com nada disso! Graças a JVM (Java Virtual Machine ou Máquina Virtual Java), você pode codificar uma única vez e rodar em diferentes sistemas operacionais. Quando compilamos um código-fonte Java, um arquivo chamado de bytecode é gerado. Ele é um arquivo intermediário que não é legível aos programadores (na verdade alguns nerds conseguem ler) e também não é executável pro si só (o SO não sabe do que se trata esse arquivo). Apenas a JVM consegue entender o bytecode e traduzir as instruções contidas dentro dele em instruções nativas do sistema operacional. Dessa forma, um único arquivo compilado (bytecode) pode ser executado em qualquer sistema operacional, desde que você possua a JVM compatível com ele. Por exemplo, se você quiser executar um sistema desenvolvido no Windows, basta ter uma JVM para Windows instalada em seu computador, mas se tiver um cliente que use Linux, simplesmente instale uma JVM para Linux. Você não precisa fazer mais nada além disso. Na verdade, a JVM é muito mais que um simples tradutor. Como o próprio nome diz, é uma máquina virtual, ou seja, uma imitação de um computador que consegue gerenciar a pilha de execução, uso de memória, processamento, segurança, etc. 5.2. A JVM faz o Java ficar lento? Ao contrário do que se parece, a JVM não faz as aplicações desenvolvidas em Java ficarem lentas, mas turbinam elas para que fiquem em alguns casos até mais rápidas que aplicações nativas desenvolvidas em C. Isso é possível graças ao Hotspot, uma tecnologia de otimização dinâmica que trabalha para aumentar a performance da JVM em tempo de execução. www.algaworks.com softwares e treinamentos 18 Apostila do curso Fundamentos Java e Orientação a Objetos Quando codificamos um programa na linguagem C, por exemplo, as otimizações são realizadas em tempo de compilação, enquanto em Java isso é feito Just in Time (JIT), ou seja, no exato momento que é necessário. Isso é vantajoso, pois a JVM consegue fazer estatísticas de execução do código e otimizar a execução de pontos isolados enquanto a aplicação roda. www.algaworks.com softwares e treinamentos 19 Apostila do curso Fundamentos Java e Orientação a Objetos 6. Baixando, instalando e configurando 6.1. Preciso do JDK ou JRE? Para desenvolver em Java, precisamos baixar e instalar o JDK (Java Development Kit) da plataforma Java SE. Um kit de desenvolvimento Java possui aplicativos para compilar e debugar seus códigos-fonte, além de diversas outras ferramentas úteis a desenvolvedores de sistemas. O JDK também possui uma JRE (Java Runtime Environment). JRE é o ambiente de execução da plataforma Java. Usuários de sistemas desenvolvidos em Java precisam instalar apenas a JRE, pois ela possui uma JVM e bibliotecas básicas do Java. Por exemplo, para você usar o software para declaração de imposto de renda desenvolvido pela Receita Federal do Brasil ou para digitar sua senha de acesso em sites de alguns bancos, você precisará do Java instalado. Isso quer dizer que você precisa de pelo menos da JRE, pois o software já foi desenvolvido e ele só precisa ser executado no seu computador. 6.2. Baixando o JDK da Oracle Graças ao modelo que o Java é desenvolvido, através de especificações, o próprio kit de desenvolvimento e a JVM podem ser fornecidos por diferentes empresas. Nós usaremos o JDK da Oracle, que pode ser baixado em http://java.oracle.com. Ao acessar este endereço, clique no link “Java SE”, na seção “Top Downloads”. A Oracle fará sugestões para que você possa baixar também outras plataformas ou a IDE de desenvolvimento NetBeans. Neste momento você não precisa de nada disso, por isso, clique no botão para obter apenas o Java. www.algaworks.com softwares e treinamentos 20 Apostila do curso Fundamentos Java e Orientação a Objetos Agora você deve selecionar o seu sistema operacional e arquitetura do processador. Se estiver usando um computador com o sistema operacional rodando em 64-bit, você pode selecionar alguma opção que termine com “x64”, mas a opção padrão (32-bit) também deve funcionar. Não esqueça de concordar com a licença da Oracle para fazer o download. www.algaworks.com softwares e treinamentos 21 Apostila do curso Fundamentos Java e Orientação a Objetos Agora clique no link em destaque para iniciar o download. 6.3. Instalando o JDK no Windows Para instalar o JDK no Windows, você já deve ter baixado o arquivo no site da Oracle, conforme explicado na seção anterior. Não vamos cobrir aqui a instalação de kits de desenvolvimento de outros fornecedores. Encontre o arquivo de instalação do JDK e dê um duplo clique nele. O nome desse arquivo poderia ser, por exemplo, “jdk-6uXX-windows-i586.exe”, onde 6 é o número da versão do Java e XX o número do update (atualização). Ao abrir a primeira tela, clique em “Next”. A próxima tela permite selecionar outros recursos que podem ser instalados junto com as ferramentas de desenvolvimento. Clique em “Next” e aguarde o processo de instalação. www.algaworks.com softwares e treinamentos 22 Apostila do curso Fundamentos Java e Orientação a Objetos A ferramenta de instalação lhe perguntará se você quer instalar também a JRE. Clique em “Next” e aguarde o término da instalação, depois, clique em “Finish”. Agora nós precisamos configurar algumas variáveis de ambiente para que as ferramentas de desenvolvimento funcionem adequadamente. www.algaworks.com softwares e treinamentos 23 Apostila do curso Fundamentos Java e Orientação a Objetos No Windows 7, localize a opção “Computador” no menu “Iniciar” e clique com o botão direito sobre ela. Clique sobre a opção “Propriedades”. Clique no menu “Configurações avançadas do sistema”, no menu lateral direito. Clique no botão “Variáveis de ambiente”. www.algaworks.com softwares e treinamentos 24 Apostila do curso Fundamentos Java e Orientação a Objetos Vamos criar uma nova variável de ambiente do Windows. Para isso, clique no botão “Novo”. www.algaworks.com softwares e treinamentos 25 Apostila do curso Fundamentos Java e Orientação a Objetos No campo “Nome da variável”, digite JAVA_HOME, e no campo “Valor da variável”, digite o caminho onde você instalou o JDK, por exemplo, C:\Program Files\Java\jdk1.6.0_21. Clique no botão OK para finalizar a inclusão dessa variável. Repita esse processo de criação de variável, porém agora com o nome da variável igual a CLASSPATH e valor igual a . (ponto). Por último, encontre uma variável já existente chamada PATH e clique no botão “Editar”. www.algaworks.com softwares e treinamentos 26 Apostila do curso Fundamentos Java e Orientação a Objetos Cuidado para não apagar o conteúdo dessa variável, pois ela é usada pelo sistema operacional. Inclua ;%JAVA_HOME%\bin ao final dela. Preste atenção, pois você não pode deixar de incluir o ponto e vírgula antes de %JAVA_HOME%\bin. Se você não esqueceu ou errou nenhum passo, o ambiente básico com o JDK deve estar funcionando. Para conferir, abra o prompt de comando (cmd.exe) e digite: javac -version Você deve conseguir visualizar algo parecido com a tela acima. Se receber uma mensagem dizendo que o comando não é reconhecido, refaça todos os passos novamente, pois provavelmente você errou em alguma coisa. 6.4. Instalando o JDK no Linux O processo de instalação do JDK no Linux depende da distribuição que você usa. No Ubuntu ou outras distribuições similares, a instalação pode ser feita pelo gerenciador de pacotes. Neste caso, você não precisa fazer download do arquivo de instalação do JDK, pois o comando que vamos executar já faz isso através de repositórios que estão na internet. É muito fácil instalar o JDK da Oracle no Ubuntu. Acesse o terminal e digite: sudo apt-get install sun-java6-jdk www.algaworks.com softwares e treinamentos 27 Apostila do curso Fundamentos Java e Orientação a Objetos Digite Y, tecle Enter e aguarde o download. Quando todos os recursos forem baixados, você precisará aceitar os termos da licença para continuar. Selecione a opção “OK” e depois “Yes”. Depois disso, é só aguardar a instalação dos componentes do JDK. Se o gerenciador de pacotes do Ubuntu dizer que não foi possível encontrar e instalar o JDK, tente digitar os seguintes comandos: sudo add-apt-repository ppa:sun-java-community-team/sun-java6 sudo apt-get update sudo apt-get install sun-java6-jdk Para conferir se está funcionando, digite javac -version no terminal. Você deve conseguir visualizar algo parecido com a tela abaixo. www.algaworks.com softwares e treinamentos 28 Apostila do curso Fundamentos Java e Orientação a Objetos É recomendado que você instale também o pacote com o código-fonte do JDK. Ele será útil para quando estivermos usando uma ferramenta de desenvolvimento (IDE), pois a partir dos códigos-fonte, a IDE conseguirá nos ajudar melhor com os nomes dos parâmetros e as documentações de classes, métodos, etc. Para instalar esse pacote, digite: sudo apt-get install sun-java6-source Se precisar instalar o JDK em outra distribuição do Linux, talvez o gerenciador de pacotes usado pelo sistema operacional possa fazer isso para você. Caso você queira instalar manualmente (em qualquer distribuição, inclusive no Ubuntu), você pode baixar o arquivo de instalação diretamente do site da Oracle e executá-lo. Neste caso, você precisará configurar as variáveis de ambiente, como JAVA_HOME, CLASSPATH e PATH. www.algaworks.com softwares e treinamentos 29 Apostila do curso Fundamentos Java e Orientação a Objetos 7. Fundamentos da linguagem 7.1. Vamos instalar a IDE agora? Quem está começando a aprender uma nova linguagem, é normal que já queira instalar uma ferramenta para ajudar na edição do código-fonte, mas nós não vamos fazer isso agora. É necessário que você aprenda a sintaxe da linguagem Java antes de contar com a ajuda de uma IDE. Nós usaremos um editor de texto sem muitos recursos, pois assim você cometerá erros e terá a chance de corrigi-los, o que no processo de aprendizado é fundamental. Se estiver usando Windows, você poderá usar o famoso bloco de notas, mas caso queira um pouco mais de recursos (como abrir vários arquivos em abas e visualizar o códigofonte com destaques em cores), recomendamos o Notepad++ (http://notepad-plus-plus.org). Fique tranqüilo, pois quando precisamos de mais produtividade, iremos apresentar ferramentas para desenvolvimento e adotar uma para continuar os estudos. 7.2. Codificando o programa “oi mundo” Quando você aprende qualquer linguagem de programação, normalmente o primeiro programa que desenvolve é o mais simples possível. Na maioria das vezes ele é chamado de “Olá mundo” ou “Hello World”. Para fazer um pouco diferente, chamamos nosso primeiro programa de “Oi Mundo”. O primeiro programa é importante para aprendermos a estrutura básica que usaremos nos próximos exemplos, o processo de compilação e execução e também para resolver erros comuns de principiantes. Veja abaixo o código-fonte de um programa simples que imprime na saída padrão (console) a mensagem “Oi mundo”. class OiMundo { public static void main(String[] args) { System.out.println("Oi mundo"); } } Para começar a programar em Java, crie uma pasta para você colocar todos os exemplos e exercícios do curso. Inicie o seu editor de texto favorito (como o Notepad++) e digite o código do exemplo acima. Por enquanto, não se preocupe com o significado do que escrevemos, pois você aprenderá cada coisa na hora certa. Você deve digitar o código exatamente como foi apresentado no exemplo, inclusive letras maiúsculas e minúsculas, pois a linguagem Java é case-sensitive. www.algaworks.com softwares e treinamentos 30 Apostila do curso Fundamentos Java e Orientação a Objetos Quando terminar de digitar tudo, salve o arquivo com o nome OiMundo.java. Preste atenção novamente às letras maiúsculas e minúsculas do nome do arquivo e também na extensão, que deve ser .java. 7.3. Compilando e executando Agora vamos compilar nosso primeiro programa. O processo de compilação é o que transforma o código-fonte em bytecode (aquele que só a JVM consegue interpretar). Entre no prompt de comando do Windows (ou terminal no Linux), acesse a pasta onde você salvou o arquivo OiMundo.java e digite: javac OiMundo.java O javac é o programa do JDK responsável por compilar um arquivo com código-fonte Java. Se funcionar, o programa ficará silencioso (não aparecerá nenhuma mensagem de sucesso). Se der alguma coisa de errado, você ficará sabendo, pois podem surgir várias mensagens estranhas no terminal (quando você aprender melhor, não será mais tão estranha assim). Para confirmar se o arquivo foi compilado, você pode listar todos os arquivos da pasta usando o comando dir se for Windows ou ls se for Linux. Se um novo arquivo chamado OiMundo.class aparecer, é porque você teve sucesso ao compilar seu primeiro programa. O arquivo com extensão .class é o bytecode gerado (executável). Se você for curioso (a), poderá tentar abri-lo usando um editor de texto. Como disse, só a JVM consegue interpretá-lo (além de, claro, alguns nerds de plantão). Agora que você já tem o programa compilado, para executá-lo, digite o comando: java OiMundo Preste atenção novamente para as letras maiúsculas e minúsculas. www.algaworks.com softwares e treinamentos 31 Apostila do curso Fundamentos Java e Orientação a Objetos Se funcionar, você deve ver a mensagem “Oi mundo” no seu terminal, como a imagem acima. Apenas para ter certeza que você entendeu, o que acabamos de executar no último passo foi o arquivo OiMundo.class (mas veja que não podemos colocar a extensão dele quando vamos executá-lo). Você poderia ter apagado ou movido o arquivo OiMundo.java que mesmo assim a execução teria sucesso, pois nesse momento apenas o bytecode é lido e executado. 7.4. Entendendo o que foi codificado Vamos estudar um pouco sobre o que codificamos no primeiro programa. Não entraremos em detalhe em tudo para não confundir, mas fique tranqüilo que você aprenderá tudo ainda neste curso. A primeira linha do arquivo declarou um nome de classe. Como ainda não estudamos o que é uma classe (veremos isso em Orientação a Objetos), chamaremos de “programa”, portanto, a primeira linha declarou o programa com o nome “OiMundo”. A abertura e fechamento das chaves indicam um bloco de código. Tudo que estiver lá dentro pertence ao programa OiMundo. class OiMundo { } Dentro do bloco de código do programa, criamos um método chamado main. Como ainda não estudamos o que é um método em orientação a abjetos, podemos chamá-lo de procedimento ou função (como preferir). O método main é necessário para que nosso programa seja executado quando digitamos o comando java OiMundo. Este método é o ponto de entrada do programa, por isso, ele será executado automaticamente quando solicitarmos a execução do programa. www.algaworks.com softwares e treinamentos 32 Apostila do curso Fundamentos Java e Orientação a Objetos O nome do método não pode ser alterado, pois apesar de não pertencer à sintaxe da linguagem, é um padrão do Java que significa um ponto inicial de um programa desenvolvido. O bloco de código delimitado pelas chaves deve possuir uma ou mais linhas com a programação do que o sistema deve fazer. public static void main(String[] args) { } Em nosso exemplo, nosso programa apenas imprime “Oi mundo” na tela. Para fazer isso, usamos o método System.out.println. Todo texto (string) em Java é delimitado por aspas duplas, e toda instrução (comando) deve terminar com um ponto e vírgula. Note também que o texto “Oi mundo” está entre parênteses, que indica o início e término de um parâmetro do método. System.out.println("Oi mundo"); O nome do arquivo precisou ser exatamente OiMundo.java. Em Java, o nome do programa (classe) deve coincidir com o nome do arquivo, portanto, se seu programa chamasse QueroAprenderJava, o seu arquivo com o código-fonte deveria ter o nome QueroAprenderJava.java. 7.5. Erros comuns dos marinheiros de primeira viagem Marinheiros de primeira viagem costumam cometer erros comuns, pois a linguagem Java é bastante restritiva. Vejamos alguns erros que você pode cometer e como corrigi-los: 1. Ao compilar, aparece o erro: OiMundo.java:3: cannot find symbol symbol : class string Você digitou string com a letra “s” em minúsculo. O correto é: public static void main(String[] args) 2. Ao compilar, aparece o erro: package system does not exist Você digitou system com a letra “s” em minúsculo. O correto é: System.out.println("Oi mundo"); 3. Ao compilar, aparece o erro: ';' expected www.algaworks.com softwares e treinamentos 33 Apostila do curso Fundamentos Java e Orientação a Objetos Você esqueceu de finalizar a instrução com um ponto e vírgula. Veja: System.out.println("Oi mundo"); 4. Ao compilar, aparece o erro (ou algo parecido): class x is public, should be declared in a file named x.java Você mudou o nome do programa, mas não mudou o nome do arquivo adequadamente, ou esqueceu de colocar as iniciais do nome do programa em letras maiúsculas: class OiMundo 5. Ao executar, aparece o erro (ou algo parecido): Exception in thread "main" java.lang.NoClassDefFoundError: x (wrong name: X) Você digitou o nome do programa sem levar em consideração as letras maiúsculas e minúsculas. Digite o comando java OiMundo com as iniciais do nome do programa usando letras maiúsculas maiúsculas. 6. Ao compilar, aparece o erro (ou algo parecido): Exception ... "main" java.lang.NoClassDefFoundError: OiMundo A variável de ambiente CLASSPATH de seu computador não está configurada ou está incorreta. Verifique se executou todos os passos de instalação e configuração corretamente. 7.6. Comentários Comentários são textos que podem ser incluídos no código-fonte normalmente para descrever como determinado programa ou bloco de código funciona. Os comentários são ignorados pelo compilador, por isso, eles não modificam o comportamento do programa. Em Java, você pode comentar blocos de códigos inteiros ou apenas uma linha. Para comentar uma única linha, faça como no exemplo a seguir: class OiMundo { public static void main(String[] args) { // imprime uma mensagem na saída padrão System.out.println("Oi mundo"); } } Para comentar um bloco de código, use /* */ para abrir e fechar. Veja um exemplo: www.algaworks.com softwares e treinamentos 34 Apostila do curso Fundamentos Java e Orientação a Objetos class OiMundo { public static void main(String[] args) { /* Esta linha será ignorada pelo compilador. System.out.println("Esta instrução será ignorada também"); E esta linha também. */ System.out.println("Oi mundo"); } } 7.7. Seqüências de escape Seqüências de escape são combinações de caracteres iniciadas por \ (contra barra) e usadas para representar caracteres de controle, aspas, quebras de linha, etc. Para ficar melhor entendido, vamos fazer um teste. O exemplo abaixo tenta imprimir a mensagem Oi “Maria” (com o nome “Maria” entre aspas duplas). class ExemploEscape { public static void main(String[] args) { System.out.println("Oi "Maria""); } } Ao tentarmos compilar, temos um belo erro (não tão belo assim): O problema aqui é que o compilador Java não conseguiu entender o que significa a palavra “Maria”. Se você prestar atenção, notará que a segunda aspa fechou a primeira, e a quarta fechou a terceira logo após o nome “Maria”. Você percebeu que não existem aspas envolvendo o nome “Maria”? www.algaworks.com softwares e treinamentos 35 Apostila do curso Fundamentos Java e Orientação a Objetos E se quisermos dizer ao compilador que “Maria” é um texto, mas que as aspas que envolvem o nome também são textos? Eis que usamos uma seqüência de escape. System.out.println("Oi \"Maria\""); A seqüência \" diz ao compilador que a aspa deve ser considerada como um texto, e não como um delimitador de String. Agora nosso programa deve compilar e rodar normalmente. Ao executar nosso programa, as aspas que envolvem o nome aparecem na saída padrão: Existem várias outras sequencias de escape, sendo que as mais conhecidas são: \n para nova linha \\ para uma barra invertida \" para aspas duplas 7.8. Palavras reservadas As palavras-chave são palavras especiais, reservadas em Java, que têm significados para o compilador, que as usa para determinar o que seu código-fonte está tentando fazer. Você não poderá usar as palavras-chave como identificadores (nomes) de classes, métodos ou variáveis. As palavras-chave reservadas estão listadas a seguir: abstract boolean break byte case catch char class const Continue default do double else extends Final finally float for goto if Implements import instanceof int interface long Native new package private protected public Return short static strictfp Super switch synchronized this throw throws transient try Void while assert enum www.algaworks.com softwares e treinamentos volatile 36 Apostila do curso Fundamentos Java e Orientação a Objetos Você aprenderá a maioria das palavras-chave da listagem acima no momento que for adequado, por isso, não se preocupe em memorizá-las. Apesar de goto e const serem palavras-chave reservadas, elas não possuem significado para o compilador. Na verdade, se você tentar usá-las, receberá um erro ao compilar seu código-fonte. 7.9. Convenções de código Ao desenvolver em Java, encorajamos você a usar as convenções de codificação da linguagem Java, fornecido oficialmente pela Oracle. Esse padrão é usado internamente pela Oracle no desenvolvimento do próprio Java e por praticamente todas as empresas do mundo que desenvolver algum software sério em Java. O documento completo, que aborda apenas forma de escrita, nomes de arquivos, classes, variáveis, identação, comentários, métodos e organização do código-fonte, pode ser lido em: http://www.oracle.com/technetwork/java/codeconv-138413.html As vantagens em utilizar esse padrão é que, além de você estar programando usando o mesmo estilo de código-fonte de todo o mundo, as convenções também facilita a manutenção no futuro por outros desenvolvedores e até mesmo por você, pois aumenta a legibilidade do código-fonte. Sempre que acharmos necessário, citaremos algumas convenções de código para você já ir se acostumando. Para começar, é muito comum, praticamente uma regra, que os nomes de seus programas (classes) usem uma prática chamada CamelCase. Isso significa que as iniciais das palavras em uma frase que nomeia seu programa devem ser iniciadas com letras maiúsculas e unidas sem espaços. Por exemplo, se você tiver um programa responsável por gerar notas fiscais, um nome válido seria GeradorNotaFiscal, mas não seria correto, de acordo com esta prática, usar os nomes Geradornotafiscal, geradornotafiscal ou Gerador_Nota_Fiscal. Veja: class GeradorNotaFiscal { } 7.10. Trabalhando com variáveis Em linguagens de programação, variáveis são nomes simbólicos dados a informações alocadas na memória do computador. As variáveis são definidas, atribuídas e acessadas ou calculadas através do código-fonte do programa. Durante a execução de um programa, os conteúdos das variáveis podem mudar através de algum processamento. Em Java, as variáveis devem ser declaradas com um tipo fixo para poder ser usadas. Isso quer dizer que, uma variável do tipo inteiro, por exemplo, não poderá ser alterada para um tipo real (decimal). www.algaworks.com softwares e treinamentos 37 Apostila do curso Fundamentos Java e Orientação a Objetos Para começar, vamos declarar uma variável chamada quantidade do tipo int. O tipo int é capaz de armazenar apenas valores inteiros negativos ou positivos. Veja: int quantidade; // declarando variável inteiro A variável acima foi apenas declarada, isso quer dizer que não atribuímos nenhum valor para ela. Para fazermos isso, usamos o operador = (igual) seguido por um número inteiro. quantidade = 10; // atribuindo o valor 10 Agora a variável quantidade possui o valor 10. Se precisarmos alterar o valor da variável quantidade, podemos atribuir um novo valor a ela. Vamos dizer que a variável deve possuir o valor 15. quantidade = 15; // atribuindo o valor 15 É muito comum precisarmos mostrar o valor de uma variável na tela do usuário. Para fazermos isso de uma forma bem simples, podemos usar System.out.println passando como parâmetro o nome da variável. // imprimindo o valor da variável System.out.println(quantidade); Veja como ficou este exemplo completo. Incluímos mais uma instrução de impressão da variável quantidade entre a atribuição do valor 10 e do valor 15 para podermos ver o valor da variável antes de depois de ser modificada. class Variaveis1 { public static void main(String[] args) { int quantidade; quantidade = 10; System.out.println(quantidade); quantidade = 15; System.out.println(quantidade); } } Se você quiser economizar uma linha de código, pode declarar e atribuir a variável na mesma linha, como no exemplo abaixo: int quantidade = 10; // declarando e atribuindo www.algaworks.com softwares e treinamentos 38 Apostila do curso Fundamentos Java e Orientação a Objetos Veja como ficaria no exemplo completo. class Variaveis1 { public static void main(String[] args) { int quantidade = 10; System.out.println(quantidade); quantidade = 15; System.out.println(quantidade); } } 7.11. Nomeando variáveis As variáveis em Java podem conter letras, dígitos, _ (underscore) e $ (dólar), porém elas não podem ser iniciadas por um dígito e não podem ser palavras reservadas. Veja alguns nomes de variáveis válidos: int int int int int int int quantidade; // pode ser toda em letras minúsculas quantidade_alunos; // pode ter underscore QUANTIDADE; // pode ser toda em letras maiúsculas QuantidadeAlunos; // pode ter letras maiúsculas e minúsculas $quantidade; // pode iniciar com dólar _quantidade; // pode iniciar com underscore quantidade_alunos_nota_10; // pode ter dígitos Agora alguns nomes de variáveis inválidos (que nem compila): int 2alunos; // não pode iniciar com dígitos int quantidade alunos; // não pode ter espaços int new; // new é uma palavra reservada do Java Apesar de a linguagem suportar letras maiúsculas e minúsculas, underscore, dólar e dígitos nos nomes das variáveis, a convenção de código Java diz que elas devem ser nomeadas com a inicial em letra minúscula e as demais iniciais das outras palavras em letras maiúsculas. Veja alguns exemplos: int int int int quantidadeAlunos; quantidadeAlunosNota10; numeroDeAlunosAprovados; totalAlunosReprovados; As declarações de variáveis abaixo estão corretas para o compilador, mas não está de acordo com o padrão de código usado mundialmente, por isso, evite-as a todo custo. int int int int quantidade_alunos; QuantidadeAlunosNota10; NUMERODEALUNOSAPROVADOS; Total_Alunos_Reprovados; www.algaworks.com softwares e treinamentos 39 Apostila do curso Fundamentos Java e Orientação a Objetos É uma boa prática escrever as palavras completas quando vamos declarar variáveis em Java. Abreviações devem ser usadas somente se forem muito conhecidas no domínio do negócio. Por exemplo, você evitar: int int int int qtAlu; quantAlunNt10; nAlunosAprov; totAlunosRep; Essas regras não servem apenas para a linguagem Java, mas existe uma cultura muito forte entre os bons programadores Java que prezam pela clareza do código, e um nome de variável mal definido pode atrapalhar muito a legibilidade do código. 7.12. Operadores aritméticos Existem 5 operadores aritméticos em Java que podemos usar para efetuar cálculos matemáticos. Uma operação pode ser de adição (+), subtração (-), multiplicação (*), divisão (/) ou módulo (%). Só para lembrar quem faltou nas aulas de matemática no colégio, módulo é o resto da divisão entre dois números. Outras operações como exponenciação (potência), raiz quadrada e outras são fornecidas de maneiras diferentes (que estudaremos mais adiante). Vejamos um exemplo simples usando as 5 operações aritméticas: int int int int int soma = 2 + 10; subtracao = 6 - 10; multiplicacao = 8 * 3; divisao = 8 / 2; resto = 7 % 2; System.out.println(soma); System.out.println(subtracao); System.out.println(multiplicacao); System.out.println(divisao); System.out.println(resto); Os resultados das operações acima são: 12, -4, 24, 4 e 1. No último exemplo, calculamos valores literais (digitados “na mão”). Podemos ainda calcular valores de variáveis, tornando o programa muito mais dinâmico. int notaAluno1 = 99; int notaAluno2 = 80; int notaAluno3 = 53; int totalGeral = notaAluno1 + notaAluno2 + notaAluno3; System.out.println(totalGeral); Pense rápido! Qual será o resultado da operação acima? www.algaworks.com softwares e treinamentos 40 Apostila do curso Fundamentos Java e Orientação a Objetos Puxa vida... você pensou rápido. O resultado é exatamente 232. Para praticar um pouco mais, queremos agora descobrir qual é a média de notas dos 3 alunos que temos. O que você acha que acontece se dividirmos por 3? int totalGeral = notaAluno1 + notaAluno2 + notaAluno3 / 3; A idéia é muito boa. Para descobrirmos a média de notas de 3 alunos, basta somarmos todas as notas e dividir por 3, mas como fizemos no exemplo acima, estamos dividindo a última nota por 3, e não o resultado da somatória de todas as notas. Por isso, o resultado dessa operação é 196. Para ficar correto, temos que agrupar a somatória usando parênteses, assim, dizemos ao compilador que queremos realizar a operação de soma antes da divisão. int totalGeral = (notaAluno1 + notaAluno2 + notaAluno3) / 3; Agora sim, o resultado da operação ficará correto, resultando na média de 77 pontos por aluno. Nada mal. 7.13. Tipos primitivos Nos exemplos anteriores, vimos como usar variáveis para armazenar apenas valores inteiros. Agora vamos estudar como criar variáveis para armazenar valores do tipo pontoflutuante (com casas decimais). Por exemplo, vamos declarar uma variável e atribuir um valor com o preço de um produto: double precoProduto = 9.43; O tipo double é capaz de armazenar valores reais, que possuem casas decimais, mas também pode armazenar números inteiros. Outro tipo primitivo bastante usado é o boolean. O tipo booleano pode armazenar os valores verdadeiro ou falso (true ou false). Por exemplo: boolean alunoMatriculado = true; // recebe valor “verdadeiro” boolean clienteBloqueado = false; // recebe valor “falso” Os valores literais true e false são palavras reservadas do Java. Não é válido atribuir números a uma variável booleana. Não existe nenhuma referência entre um valor booleano e os números 0 e 1 ou qualquer outro número, como em outras linguagens que talvez você já conheça, por isso, o código abaixo é inválido e não compila: www.algaworks.com softwares e treinamentos 41 Apostila do curso Fundamentos Java e Orientação a Objetos boolean alunoMatriculado = 1; // não compila boolean clienteBloqueado = 0; // não compila Uma variável booleana pode receber como valor uma expressão com operadores de comparação ou igualdade, mas estudaremos isso em breve. Depois de aprender como usar tipos inteiros, reais e booleanos, vamos conhecer mais sobre outros tipos primitivos do Java. Os tipos de dados básicos (tipos primitivos) da linguagem Java são: boolean, char, byte, short, int, long, float e double. A tabela abaixo mostra os tipos primitivos e a capacidade de armazenamento de cada um. Tipo Tamanho (bits) Menor valor Maior valor boolean 1 false true char 16 0 2 -1 byte 8 -2 short 16 -2 int 32 -2 long 64 -2 float 32 - - double 64 - - 16 7 2 -1 7 15 2 -1 31 2 -1 63 2 -1 15 31 63 Como pode ver na tabela dos tipos primitivos do Java, o tipo boolean ocupa apenas 1-bit para armazenar um valor booleano, ou seja, este tipo precisa apenas de uma da menor unidade de armazenamento na computação. Uma variável do tipo char ocupa 16-bit, ou seja, 2 bytes (cada byte tem 8 bits) para armazenar um valor que representa um caractere. Veja abaixo alguns exemplos de declaração e atribuição de variáveis do tipo char: char turmaAluno1 = 'A'; char tipoCliente = '2'; char simbolo = '@'; System.out.println(turmaAluno1); System.out.println(tipoCliente); System.out.println(simbolo); O tipo char não pode ser usado para armazenar um texto. Na verdade, este tipo é capaz de armazenar apenas um caractere. Nós aprenderemos o tipo String ainda neste curso para armazenar textos (com mais de 1 caractere, naturalmente). Os tipos byte e short são tipos numéricos inteiros com uma capacidade de armazenamento menor que o tipo int. Para saber exatamente o menor e maior número que www.algaworks.com softwares e treinamentos 42 Apostila do curso Fundamentos Java e Orientação a Objetos cada tipo suporta, basta fazer o cálculo da potência, conforme apresentado na tabela. Por exemplo, o menor valor do tipo byte é -27, ou seja, -128, e o maior é 27 - 1, ou seja, 127. O tipo long é um tipo numérico inteiro (longo) com capacidade de armazenamento superior ao tipo int. Para se ter uma idéia, o tipo long é capaz de armazenar o valor máximo igual a 9223372036854775807, enquanto o int suporta até o número 2147483647. No exemplo abaixo, declaramos e atribuímos uma variável para armazenar o número total de habitantes na cidade de Uberlândia/MG. Esta variável poderia ser do tipo int, mas já que estamos falando de long, exageramos um pouco no exemplo e declaramos como um inteiro longo. long populacaoUberlandia = 650000; System.out.println(populacaoUberlandia); O código acima funciona, não temos nenhum problema com ele. Agora veja o código abaixo: long populacaoMundial = 7000000000; // não compila System.out.println(populacaoMundial); O último exemplo não compila! Pode parecer estranho, mas isso acontece porque o número 7000000000 não é compatível com o tipo int. Espere... mas não estávamos usando um tipo int, e sim um long. Certo?... Sim e não, certo e errado! Quando atribuímos um valor literal (digitado manualmente no código-fonte) a uma variável do tipo long, o valor literal é por natureza do tipo int, ou seja, os literais numéricos inteiros são do tipo int por padrão, a não ser se usarmos um pequeno truque. Veja como é fácil: long populacaoMundial = 7000000000L; // compila! System.out.println(populacaoMundial); A única diferença do último exemplo para o que não compila é a letra L após o número 7000000000. Ao incluir a letra L ao final de um número literal, indicamos ao compilador que queremos que o número seja interpretado como um tipo long, e não um int. Capcioso, não? Os tipos float e double são os únicos tipos ponto-flutuante, que são capazes de armazenar números reais (com casas decimais). Enquanto o tipo float possui 32-bit de precisão, o double possui 64-bit. Já vimos como declarar variáveis do tipo double, agora tentaremos fazer o mesmo com o tipo float. float saldoConta = 1030.43; // não compila System.out.println(saldoConta); O código acima não compila porque todo literal decimal em Java é por padrão do tipo double (independente do valor). Por isso, precisamos mais uma vez tirar uma “carta na www.algaworks.com softwares e treinamentos 43 Apostila do curso Fundamentos Java e Orientação a Objetos manga”! Para fazer o código compilar e rodar como desejamos, precisamos apenas incluir a letra F após o número 1030.43. float saldoConta = 1030.43F; // compila! System.out.println(saldoConta); A letra F diz ao compilador que queremos que o número seja entendido como um valor do tipo float, e não double. Os tipos float e double não devem ser usados para armazenar valores que devem ser precisos, como valores monetários. Para isso, nós vamos aprender outro tipo (que não é primitivo) mais a frente chamado BigDecimal. Até lá, você pode usar float e double para o que precisar, e você não será penalizado por nós. 7.14. Outros operadores de atribuição Você já sabe para que serve o operador de atribuição = (igual), pois já usamos em vários exemplos anteriores. Agora vamos estudar outros operadores de atribuição que combinam com operadores aritméticos. Para começar, vejamos um exemplo do operador +=, que atribui um valor à variável somando o valor da própria variável com o número (ou variável) à direita do operador. int total = 10; total += 3; System.out.println(total); O código acima imprime na tela o número 13. A linha total += 3 é o mesmo que total = total + 3. Então porque usar essa forma abreviada? A resposta é óbvia... simplesmente para abreviar. Outros operadores de atribuição básicos da linguagem Java são -=, *=, /= e %=. Veja um exemplo usando todos eles. int total = 10; total += 3; // soma total com 3 System.out.println(total); total -= 1; // substrai total com 1 System.out.println(total); total *= 2; // multiplica total por 2 System.out.println(total); total /= 4; // divide total por 4 System.out.println(total); total %= 5; // resto de total dividido por 5 System.out.println(total); Existem outros operadores de atribuição em Java para manipulação de bits, o que não é nosso foco neste curso. www.algaworks.com softwares e treinamentos 44 Apostila do curso Fundamentos Java e Orientação a Objetos 7.15. Conversão de tipos primitivos Durante a programação de um sistema, pode surgir a necessidade de atribuir a uma variável o valor de outra, porém de tipos diferentes. Isso é chamado de casting (conversão), pois antes da atribuição, um processo de conversão de um tipo para o outro deve ser realizado pela JVM. Vejamos o seguinte exemplo: // declaramos a variável x do tipo long long x = 10; // agora tentamos atribuir x a y, do tipo int int y = x; // não compila O código acima não compila, pois não é possível atribuir x à y. Pode parecer estranho, pois x possui o valor 10, que é perfeitamente compatível com o tipo int (lembre-se que int possui um limite máximo até o número 2147483647). Porque então não compila? Não tem como o compilador saber que a variável x possui o valor 10, pois como o próprio nome diz, é uma variável! Quem garante que x não possa ter um valor absurdamente longo, que não cabe em um int? Por isso, para garantir que nada vai dar de errado em tempo de execução de seu programa, o compilador Java nos ajuda evitando que nosso programa seja compilado. Para clarear um pouco mais, imagine o seguinte: um tipo long possui capacidade de 64 bits. É como se existissem 64 pequenos espaços na memória do computador para armazenar um valor. Mesmo que o número seja bastante pequeno, todos os espaços sempre serão ocupados. Já um tipo int possui a capacidade de 32 bits. Usando a mesma analogia, são como 32 pequenos espaços na memória para armazenar um valor. Agora imagine que você não saiba qual valor possui dentro das variáveis (o compilador não sabe) e responda: você consegue colocar com segurança o valor que tem na variável do tipo long dentro da variável do tipo int? Se você entendeu bem e analisou os fatos friamente, com certeza respondeu que “não”. É impossível saber com certeza se o valor do tipo long caberá na variável do tipo int. Mas Java é uma linguagem muito poderosa, e por isso não nos deixaria na mão. Se você tiver certeza ou precisar muito fazer essa conversão milagrosa, poderá forçar um casting, ou seja, você pode dizer ao compilador Java: “tudo bem, eu tenho mais que 18 anos e assumo todos os riscos que isso possa trazer”. Veja como é fácil: www.algaworks.com softwares e treinamentos 45 Apostila do curso Fundamentos Java e Orientação a Objetos long x = 10; // agora compila, mas os riscos são todos seus int y = (int) x; System.out.println(y); Graças à instrução de casting que incluímos, a variável x será convertida para int e atribuída à i. Neste caso, não existirá nenhum efeito colateral, pois o código é bastante simples e estamos vendo que o valor de x é realmente 10, porém no mundo real muitas vezes essa não é a situação, portanto, muito cuidado nessa hora. E se ignorarmos as forças maiores e solicitarmos um casting de uma variável do tipo long tão longa que não cabe em um int? Um exemplo diz mais que mil palavras. Vejamos: long x = 9300000035L; // o valor mudará absurdamente (cuidado) int y = (int) x; System.out.println(y); A execução do código acima imprimirá na tela o número 710065443. O que tem haver esse número com 9300000035? Nada... é verdade, mas assumimos todos os riscos, forçamos o casting da variável x e aconteceu o pior, o valor da variável x não coube em um tipo int, e por isso perdemos o valor original e ganhamos um outro que não queríamos. Neste caso, o correto a fazer seria não fazer! Isso mesmo, o correto seria não fazer o casting, pois como bons programadores nós deveríamos saber que a variável x poderia em algum momento ter um valor tão longo ao ponto de não ser possível fazer a conversão com segurança. Mas porque o valor mudou para outro totalmente diferente? Porque estávamos usando muitos dos 64 “espaços” (bits) do tipo long, e a conversão eliminou vários destes “espaços” para fazer caber dentro do tipo int. Quando fazemos isso, estamos perdendo bits que representam o número original, e por isso é natural que o resultado seja outro bem diferente. Outra situação bastante comum que necessitamos fazer casting é de variáveis do tipo int para long. Veja um exemplo: int y = 102344; long x = y; // casting feito automaticamente System.out.println(x); O código acima compila e executa sem problemas. Quando tivermos um tipo int e desejarmos atribuir a outra variável do tipo long, podemos fazer isso sem correr riscos, por isso, não é necessário instruir ao compilador que você quer que seja feita uma conversão (ele fará automaticamente). www.algaworks.com softwares e treinamentos 46 Apostila do curso Fundamentos Java e Orientação a Objetos As conversões de tipos float para double e vice-versa acontecem da mesma forma que para os tipos int e long. Veja um exemplo: double a = 20.5; // você assume os riscos desta conversão float b = (float) a; System.out.println(b); float c = 934.5f; // conversão automática double d = c; System.out.println(d); Como o tipo double possui 64 bits, é necessário deixar explícito a conversão para float, pois existem riscos de perder informação, já o contrário (de float para double) você não precisa dizer que existirá uma conversão, pois o Java fará isso de forma implícita para você. Outra situação comum acontece quando precisamos atribuir valores de tipos pontoflutuante para variáveis inteiras. O exemplo abaixo é uma tentativa de fazer isso: double largura = 100; int tamanho = largura; // não compila O último exemplo não compila, pois o compilador não assume o risco de converter o valor de uma variável do tipo double (ou float) para uma variável do tipo int, long ou qualquer outra inteira. Mesmo sabendo que o conteúdo da variável largura seria perfeitamente representada dentro da variável tamanho, o coitado do compilador não consegue identificar isso. Se quisermos realmente assumir todos os riscos, precisamos deixar explícita a conversão: double largura = 100; int tamanho = (int) largura; // agora sim, compila! System.out.println(tamanho); No caso do exemplo acima, está visível que não haverá nenhum problema. Mas e o código abaixo? O que acontecerá? double largura = 100.37; int tamanho = (int) largura; // compila, mas perdemos precisão System.out.println(tamanho); A execução do exemplo acima imprimirá na tela o número 100. Isso acontece porque fizemos a conversão de double para int, mas dessa vez perdemos precisão. O número www.algaworks.com softwares e treinamentos 47 Apostila do curso Fundamentos Java e Orientação a Objetos 100.37 não pôde ser representado como um inteiro, e por isso ele foi “truncado”, ou seja, o valor decimal foi eliminado sem dó nem piedade. Se você precisar fazer casting de tipos diferentes ao que estudamos, veja a imagem abaixo e siga algumas dicas. No sentido das flechas, a conversão é implícita, ou seja, aquela que você não precisa escrever nada (e mesmo assim acontecerá automaticamente). No sentido contrário ao das flechas, a conversão deve ser explícita, ou seja, você deve escrever no código-fonte que deseja assumir os riscos. 7.16. Promoção aritmética Quando calculamos duas variáveis ou valores do tipo int, por exemplo, o resultado é do tipo int. int x = 10; int y = 5; int z = x + y; System.out.println(z); Se realizarmos um cálculo com duas variáveis ou valores do tipo long, o resultado é do tipo long. long x = 10; long y = 5; long z = x * y; System.out.println(z); Agora, se realizarmos uma operação entre uma variável do tipo int com uma variável do tipo long, podemos atribuir o resultado em um tipo int? int x = 10; long y = 5; int z = x * y; // não compila! System.out.println(z); www.algaworks.com softwares e treinamentos 48 Apostila do curso Fundamentos Java e Orientação a Objetos Não, não... não podemos! Quando realizamos operações aritméticas entre variáveis de tipos diferentes, o resultado será igual ao maior tipo, e isso se chama promoção aritmética. Como long tem maior capacidade de armazenamento que int, o resultado é do tipo long, por isso, seria correto atribuirmos em uma variável desse tipo. int x = 10; long y = 5; long z = x * y; // agora compila, pois o resultado é long System.out.println(z); Para sabermos exatamente qual o tipo resultante em uma operação aritmética, basta olharmos a tabela de tipos primitivos estudada anteriormente. O tipo com a maior capacidade em bits será o tipo do resultado do cálculo. A exceção a essa regra é quando realizamos uma operação entre números de tipos inteiros (int, long, etc) e ponto-flutuante (float ou double). long x = 10; float y = 9.34; long z = x * y; // não compila System.out.println(z); O exemplo acima não compila, pois o resultado de uma operação entre float e long é float. Apesar de long ter 64 bits e float ter 32 bits, float leva a vantagem por ser ponto-flutuante, portanto, o correto seria atribuir o resultado dessa operação em um tipo float. long x = 10; float y = 9.34; float z = x * y; // compila System.out.println(z); Por último, apenas para você refletir um pouco, tente descobrir o que será impresso na tela com o código abaixo: int x = 3; int y = 2; float z = x / y; System.out.println(z); O exemplo é bem simples, estamos simplesmente tentando dividir x por y, ou seja, 3 por 2. A grande questão é que estamos dividindo dois números inteiros, portanto, o resultado também será do tipo inteiro. Se você acha que aparecerá na tela o valor 1.5 (3 dividido por 2 é 1.5), se enganou! Nós veremos 1.0 ao executar esse código. Apesar de atribuirmos o resultado em um tipo float (que suporta casas decimais), o cálculo é feito usando duas variáveis do tipo int, portanto, o resultado também é do tipo int. Se não quisermos perder os valores decimais do resultado da operação, podemos ter pelo menos uma das variáveis que participam do cálculo do tipo float. www.algaworks.com softwares e treinamentos 49 Apostila do curso Fundamentos Java e Orientação a Objetos int x = 3; float y = 2; float z = x / y; System.out.println(z); Agora sim, o resultado que veremos na tela será 1.5, pois x é promovido a float no momento da operação. Se não existir essa possibilidade (de mudar o tipo da variável para float), podemos fazer um casting de x ou y para float antes de realizar o cálculo. int x = 3; int y = 2; float z = x / (float) y; // o casting acontece antes do cálculo System.out.println(z); O resultado continua sendo 1.5, pois convertermos o valor de y para float, obrigando x a ser promovido também para float durante a operação aritmética. 7.17. Trabalhando com strings Para apresentarmos um texto na tela usando Java, tudo que precisamos fazer é colocá-lo entre aspas duplas dentro de um System.out.println. System.out.println("Oi galera do bem"); Se precisarmos juntar um texto com o valor de uma variável, podemos concatená-los. Na linguagem Java, usamos o símbolo + (mais) para fazer isso. int x = 10; int y = 5; int z = x + y; // adição System.out.println("Resultado: " + z); // concatenação Quando usamos o + em textos, ele é entendido pelo compilador como concatenação, e não adição. No exemplo acima, poderíamos eliminar a variável z e efetuar o cálculo diretamente no println. Veja abaixo uma tentativa de fazer isso: int x = 10; int y = 5; System.out.println("Resultado: " + x + y); www.algaworks.com softwares e treinamentos 50 Apostila do curso Fundamentos Java e Orientação a Objetos A execução do último exemplo exibirá na tela “Resultado: 105”, pois o valor da variável x é concatenado com o valor da variável y. Isso acontece porque o compilador verifica que existe um texto sendo concatenado com a variável x, e faz o mesmo para a variável y. Agora veja outro exemplo: int x = 10; int y = 5; System.out.println(x + y + " foi o resultado"); Você apostaria que o código acima imprime na tela “15 foi o resultado”? Apesar de parecer estranho, é isso que acontece. Neste caso, as variáveis x e y são somadas, e não concatenadas. Isso acontece porque o compilador só começa a concatenar a partir do momento que encontra um texto. E se quisermos efetuar o cálculo de x com y depois que um texto foi digitado, como na primeira situação? Basta incluirmos a operação entre parênteses para dizer ao compilador que a operação tem precedência. int x = 10; int y = 5; System.out.println("Resultado: " + (x + y)); Agora o resultado será “Resultado: 15”. Para declarar variáveis que contenham textos, usamos o tipo String. String nome = "Maria"; Apesar de o tipo String ser nativo da linguagem Java, ele não é um tipo primitivo. Por enquanto você não precisa se preocupar com isso. Nós aprofundaremos mais sobre o tipo String mais adiante. No exemplo abaixo, declaramos a variável nome do tipo String e idade do tipo int, e depois imprimimos na tela uma mensagem concatenando o nome e a idade mais outros textos para formar uma frase completa. String nome = "Maria"; int idade = 30; System.out.println(nome + " tem " + idade + " anos"); O resultado na tela é “Maria tem 30 anos”. www.algaworks.com softwares e treinamentos 51 Apostila do curso Fundamentos Java e Orientação a Objetos 7.18. Recebendo entrada de dados Até agora, criamos exemplos usando variáveis com valores definidos diretamente no código-fonte (literais), sem entrada de dados pelo usuário. Está na hora de evoluir nossos códigos e aprender como solicitar informações ao usuário durante a execução do programa. A forma mais simples de fazer isso em Java é usando uma classe chamada Scanner. Por enquanto, não se preocupe com o que é uma classe e nem o que é essa tal de Scanner. Concentre-se apenas em como deve ser feito para obter o resultado esperado e tenha paciência, pois você aprenderá tudo sobre classes nos capítulos sobre Orientação a Objetos. import java.util.Scanner; public class EntradaDeDados { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.println("Digite seu nome"); String nome = entrada.nextLine(); System.out.println("Oi " + nome); } } O exemplo acima solicita a entrada de dados e aguarda uma resposta do usuário. Ao digitar alguma informação (no caso, o seu nome), o valor digitado é atribuído à variável nome e depois impresso uma mensagem com o nome concatenado. www.algaworks.com softwares e treinamentos 52 Apostila do curso Fundamentos Java e Orientação a Objetos Para usar a classe Scanner, temos que importá-la em nosso código-fonte. Para fazer isso, basta incluir a linha abaixo no topo do arquivo do código-fonte. import java.util.Scanner; Novamente, não há motivos para se preocupar, pois você aprenderá sobre importações mais adiante. Apenas faça isso! Declaramos uma variável nomeada como entrada do tipo Scanner. Esse tipo não é um tipo primitivo, mas não precisa nem dizer que você aprenderá sobre isso mais pra frente, certo? Scanner entrada = new Scanner(System.in); Finalmente, para solicitar a entrada de um texto, invocamos o método nextLine() através da variável entrada. String nome = entrada.nextLine(); Neste momento, o programa ficará paralisado aguardando o usuário digitar alguma coisa. Quando a tecla Enter for pressionada, o conteúdo informado será atribuído à variável nome. A classe Scanner possui vários métodos para obter dados já convertidos em tipos específicos. No segundo exemplo, usamos dois novos métodos para obter entrada de dados dos tipos int e double. O programa solicitará, além do nome do usuário, o peso e altura e fará o cálculo do Índice de Massa Corporal (IMC). Scanner entrada = new Scanner(System.in); System.out.print("Nome: "); // obtém entrada do tipo String String nome = entrada.nextLine(); www.algaworks.com softwares e treinamentos 53 Apostila do curso Fundamentos Java e Orientação a Objetos System.out.print("Peso: "); // obtém entrada do tipo int int peso = entrada.nextInt(); System.out.print("Altura: "); // obtém entrada do tipo double double altura = entrada.nextDouble(); double imc = peso / (altura * altura); System.out.println("IMC de " + nome + ": " + imc); Usamos System.out.print (e não println) para exibir as mensagens que solicitam dados ao usuário. A diferença de print com println é que o primeiro não exibe quebra de linha. Dessa forma, o usuário pode digitar os dados na frente da mensagem. Não tente chamar o método nextLine() depois de ter chamado nextInt() ou nextDouble() através da mesma variável do Scanner, pois isso não funciona bem. Se precisar, crie duas variáveis do tipo Scanner para solucionar esse problema. 7.19. Operadores de comparação e igualdade Operadores de comparação e de igualdade são usados para realizar comparações de conteúdos de variáveis ou valores literais. Os resultados das comparações sempre resultam em valores booleanos. Os operadores de comparação disponíveis são > (maior), >= (maior ou igual), < (menor) e <= (menor ou igual), e os operadores de igualdade são == (igual) e != (diferente). O exemplo abaixo usa todos estes operadores. boolean boolean boolean boolean boolean boolean maior = b > a; // 'b' é maior que 'a'? maiorOuIgual = b >= a; // 'b' é maior ou igual a 'a'? menor = a < b; // 'a' é menor que 'b'? menorOuIgual = a <= 10; // 'a' é menor ou igual a '10'? igual = a == b - c; // 'a' é igual a 'b' menos 'c'? diferente = a != c; // 'a' é diferente de 'c'? www.algaworks.com softwares e treinamentos 54 Apostila do curso Fundamentos Java e Orientação a Objetos System.out.println(maior); System.out.println(maiorOuIgual); System.out.println(menor); System.out.println(menorOuIgual); System.out.println(igual); System.out.println(diferente); Coincidentemente, todas as comparações acima resultam no valor booleano true (verdadeiro). Perceba que na quarta linha incluímos um valor literal para fazer a comparação, e na quinta linha fizemos uma operação aritmética subtraindo duas variáveis antes de realizar a comparação. Fizemos isso só para exercitarmos um pouco mais a linguagem Java. Já que falamos de operadores de igualdade, vale a pena falarmos do operador unário ! (ponto de exclamação). Este operador serve para negar um valor booleano ou uma expressão booleana. Se tivermos uma variável booleana com true atribuído a ela, podemos negar a própria variável para o valor passar a valer false. boolean bloqueado = true; bloqueado = !bloqueado; // passa a valer false Podemos também negar uma expressão que possui um operador de comparação. Por exemplo: boolean resultado = !(b > a); // ruim, mas válido O código acima compara se b é maior que a e inverte o resultado. É o mesmo que fazer b <= a, porém com uma legibilidade um pouco pior (pois exige mais raciocínio para entender o código). 7.20. Estruturas de controle if, else if e else Qualquer bom programa deve ser capaz de tomar decisão durante sua execução, seguindo caminhos diferentes de acordo a lógica do sistema. Como em muitas linguagens de programação, em Java, usamos a instrução if (se) para controlar um fluxo básico. No exemplo abaixo, melhoramos um pouco o código-fonte que calcula o IMC de uma pessoa para exibir uma mensagem caso seu peso esteja abaixo do ideal. Para saber se o peso está abaixo do ideal, precisamos verificar se o resultado do cálculo do IMC é menor que 18.5. Scanner entrada = new Scanner(System.in); System.out.print("Nome: "); String nome = entrada.nextLine(); System.out.print("Peso: "); int peso = entrada.nextInt(); www.algaworks.com softwares e treinamentos 55 Apostila do curso Fundamentos Java e Orientação a Objetos System.out.print("Altura: "); double altura = entrada.nextDouble(); double imc = peso / (altura * altura); if (imc < 18.5) { System.out.println("Abaixo do peso ideal."); } Veja que usamos uma instrução if para comparar se a variável imc é menor que 18.5, através da expressão imc < 18.5. if (imc < 18.5) { System.out.println("Abaixo do peso ideal."); } A instrução if deve receber uma expressão booleana agrupada por parênteses. No exemplo acima, a chamada de System.out.println só será executada caso o valor da variável imc seja menor que 18.5. Se o cálculo do IMC não for menor que 18.5, queremos que uma nova condição seja verificada para identificar se o peso do usuário é o ideal. Para isso, usamos a instrução else if (senão se), que recebe uma expressão booleana e é analisada apenas se a primeira instrução if for falsa. if (imc < 18.5) { System.out.println("Abaixo do peso ideal."); } else if (imc < 25) { System.out.println("Peso ideal."); } Agora, caso o IMC do usuário não seja menor que 18.5, verificamos se é menor que 25 (ou seja, maior que 18.5 e menor que 25) e imprimimos outra mensagem dizendo que o peso é ideal. Finalizamos nosso programa incluindo outras condições que indicam o grau de obesidade de uma pessoa. Veja no último caso que usamos a instrução else (caso contrário ou senão). Caso nenhuma das condições expressadas no if e nos else ifs forem verdadeiras, o bloco de código de else será executado. if (imc < 18.5) { System.out.println("Abaixo do peso ideal."); } else if (imc < 25) { System.out.println("Peso ideal."); } else if (imc < 30) { System.out.println("Acima do peso."); } else if (imc < 35) { System.out.println("Obesidade grau I."); } else if (imc < 40) { System.out.println("Obesidade grau II."); } else { System.out.println("Obesidade grau III."); www.algaworks.com softwares e treinamentos 56 Apostila do curso Fundamentos Java e Orientação a Objetos } A instrução else não recebe nenhuma expressão booleana, pois ela será executada apenas se todas as instruções anteriores forem falsas. 7.21. Programar ifs sem abrir e fechar blocos é legal? Existe a possibilidade modificar o código-fonte do último exemplo programado sem mudar o comportamento do programa, eliminando as aberturas e fechamentos de blocos (chaves). if (imc < 18.5) System.out.println("Abaixo do peso ideal."); else if (imc < 25) System.out.println("Peso ideal."); else if (imc < 30) System.out.println("Acima do peso."); else if (imc < 35) System.out.println("Obesidade grau I."); else if (imc < 40) System.out.println("Obesidade grau II."); else System.out.println("Obesidade grau III."); O resultado é o mesmo, e, apesar de parecer que o código está mais limpo e bonito, existe um risco muito grande quando programamos assim. Imagina se precisamos adicionar uma nova mensagem a ser exibida para o usuário quando o grau de obesidade for III, poderíamos tentar incluir uma linha que deve ser executada na instrução else. if (imc < 18.5) System.out.println("Abaixo do peso ideal."); else if (imc < 25) System.out.println("Peso ideal."); else if (imc < 30) System.out.println("Acima do peso."); else if (imc < 35) System.out.println("Obesidade grau I."); else if (imc < 40) System.out.println("Obesidade grau II."); else System.out.println("Obesidade grau III."); System.out.println("Muito cuidado com seu peso."); Ao executar esse programa, se o IMC for acima de 40 (nível máximo de obesidade), as mensagens aparecerão como esperado, como se o nosso sistema estivesse funcionando corretamente. www.algaworks.com softwares e treinamentos 57 Apostila do curso Fundamentos Java e Orientação a Objetos Agora se executamos o programa novamente (sem fazer qualquer alteração) e informarmos um peso ideal para uma determinada altura, veja que algo de errado acontece. A mensagem “Muito cuidado com seu peso” apareceu para alguém que tem peso ideal, e essa não era nossa intenção. O problema é que, quando não usamos as chaves para abrir e fechar blocos, nos enganamos facilmente. Sem as chaves, cada instrução if, else if ou else faz referência apenas para a primeira instrução logo em seguida. O último exemplo é como se tivéssemos feito: ... else System.out.println("Obesidade grau III."); System.out.println("Muito cuidado com seu peso."); Ou ainda: ... else { System.out.println("Obesidade grau III."); } System.out.println("Muito cuidado com seu peso."); www.algaworks.com softwares e treinamentos 58 Apostila do curso Fundamentos Java e Orientação a Objetos Por existir essa “facilidade” de errar, é recomendado que você evite programar if/else if/else sem usar blocos. 7.22. Escopo de variáveis O escopo de variáveis define em qual parte do programa a variável pode ser referenciada através de seu nome. Para usarmos uma variável, ela deve ser declarada antes, mas só isso não é suficiente. Deve-se observar se a variável não foi declarada em um bloco mais interno que o código que está tentando usá-la. O código-fonte abaixo é um exemplo que nem mesmo compila: Scanner entrada = new Scanner(System.in); System.out.print("Idade: "); int idade = entrada.nextInt(); boolean podeDirigir = idade >= 18; if (!podeDirigir) { System.out.print("Nome do pai: "); // variável nomePai está sendo declarada apenas para o // o bloco deste if String nomePai = entrada.next(); } System.out.println("Voce pode dirigir? "); if (podeDirigir) { System.out.println("Sim, claro."); } else { // não compila! variável nomePai não está acessível System.out.println("Nao, se fizer isso, seu pai " + nomePai + " vai preso."); } O código acima não compila porque a variável nomePai ficaria visível apenas para o bloco do if (!podeDirigir) { ... }. www.algaworks.com softwares e treinamentos 59 Apostila do curso Fundamentos Java e Orientação a Objetos Quando criamos variáveis em Java, elas ficam acessíveis apenas dentro do bloco o qual ela foi declarada e seus sub-blocos. Para o exemplo anterior compilar, precisaríamos declarar a variável nomePai fora do bloco do if, deixando-a visível para todo o método main do programa. String nomePai = ""; if (!podeDirigir) { System.out.print("Nome do pai: "); nomePai = entrada.next(); } Agora o programa pode ser compilado e executado. 7.23. Operadores lógicos Nos últimos exemplos, usamos as regras da Organização Mundial de Saúde para calcular o IMC. Existem outras regras mais detalhadas, como os da NHANES II survey (USA 3 1976-1980) , que indicam aos seguintes critérios para adultos: Condição IMC em mulheres IMC em homens Abaixo do peso Menor que 19.1 Menor que 20.7 No peso ideal Entre 19.1 e 25.8 Entre 20.8 e 26.4 Um pouco acima do peso Entre 25.9 e 27.3 Entre 26.5 e 27.8 Acima do peso ideal Entre 27.4 e 32.3 Entre 27.9 e 31.1 Obeso Maior que 32.3 Maior que 31.1 3 Overweight definition using body mass index. Steven B. Halls, MD. http://www.halls.md/body-massindex/overweight.htm www.algaworks.com softwares e treinamentos 60 Apostila do curso Fundamentos Java e Orientação a Objetos Como você pôde ver, essas regras são um pouco mais complicadas, pois são diferentes entre homens e mulheres. Apesar disso, um programador experiente não deve sentir dificuldade para programá-las. Existem diversas formas de codificar um programa que esses critérios. Uma forma seria aninhar (agrupar) ifs, colocando um bloco dentro de outro. System.out.print("Nome: "); String nome = entrada.nextLine(); System.out.print("Peso: "); int peso = entrada.nextInt(); System.out.print("Altura: "); double altura = entrada.nextDouble(); System.out.print("Sexo (1 para 'M' ou outro numero para 'F'): "); char sexo = entrada.nextShort() == 1 ? 'M' : 'F'; double imc = peso / (altura * altura); if (sexo == 'F') { if (imc < 19.1) { System.out.println("Abaixo do peso."); } else if (imc <= 25.8) { System.out.println("Peso ideal."); } // e continua... } else { if (imc < 20.7) { System.out.println("Abaixo do peso."); } else if (imc <= 26.4) { System.out.println("Peso ideal."); } // e continua... } No exemplo acima, pedimos que usuário informe seu sexo, sendo que deve ser digitado o número 1 para que o sistema entenda que o sexo é masculino ou qualquer outro código se for feminino. System.out.print("Sexo (1 para 'M' ou outro numero para 'F'): "); char sexo = entrada.nextShort() == 1 ? 'M' : 'F'; Quando colocamos ifs dentro de ifs, estamos dizendo que o if mais interno só será avaliado caso o primeiro seja verdadeiro. if (sexo == 'F') { // só será avaliado se sexo for Masculino if (imc < 19.1) { System.out.println("Abaixo do peso."); } else if (imc <= 25.8) { www.algaworks.com softwares e treinamentos 61 Apostila do curso Fundamentos Java e Orientação a Objetos System.out.println("Peso ideal."); } // e continua... } Antes que nos esquecemos, estamos em um tópico sobre operadores lógicos! O último exemplo nada tem haver com isso, mas foi apenas uma motivação para falarmos agora sobre esses operadores. Ao invés de incluirmos ifs dentro de ifs, podemos usar o operador lógico “E”, que é representado por &&. if (sexo == 'F' && imc < 19.1) { System.out.println("Abaixo do peso."); } else if (sexo == 'F' && imc <= 25.8) { System.out.println("Peso ideal."); } else if (sexo == 'F' && imc <= 27.3) { System.out.println("Um pouco acima do peso."); } else if (sexo == 'F' && imc <= 32.3) { System.out.println("Acima do peso ideal."); } else if (sexo == 'F') { System.out.println("Obeso."); } else if (sexo == 'M' && imc < 20.7) { System.out.println("Abaixo do peso."); } else if (sexo == 'M' && imc <= 26.4) { System.out.println("Peso ideal."); } else if (sexo == 'M' && imc <= 27.8) { System.out.println("Um pouco acima do peso."); } else if (sexo == 'M' && imc <= 31.1) { System.out.println("Acima do peso ideal."); } else if (sexo == 'M') { System.out.println("Obeso."); } O operador lógico && avalia as expressões do lado esquerdo e direito e retorna apenas um resultado booleano. Para a expressão completa ser verdadeira, tanto o lado direito como o lado esquerdo devem ser verdadeiras, mas para que a expressão completa seja falsa, pelo menos um lado deve ser falso. Ainda existe o operador lógico “OU”, representado por ||. Podemos ainda mudar o código-fonte de nosso exemplo para usá-lo. if ((sexo == 'F' && imc < 19.1) || (sexo == 'M' && imc < 20.7)) { System.out.println("Abaixo do peso."); } else if ((sexo == 'F' && imc <= 25.8) || (sexo == 'M' && imc <= 26.4)) { System.out.println("Peso ideal."); } else if ((sexo == 'F' && imc <= 27.3) || (sexo == 'M' && imc <= 27.8)) { System.out.println("Um pouco acima do peso."); } else if ((sexo == 'F' && imc <= 32.3) || (sexo == 'M' && imc <= 31.1)) { System.out.println("Acima do peso ideal."); } else { System.out.println("Obeso."); } www.algaworks.com softwares e treinamentos 62 Apostila do curso Fundamentos Java e Orientação a Objetos Veja que usando o operador ||, conseguimos diminuir bastante a quantidade de linhas de programação, porém deixamos as expressões booleanas dos ifs mais complexas, pois agrupamos duas expressões que usam o operador && dentro de outra que usa o operador ||. O operador lógico || avalia as expressões dos dois lados e retorna um único resultado booleano. Para que a expressão completa seja verdadeira, pelo menos um lado deve ser verdadeiro. Não existe uma regra geral que define o que é melhor, usar ifs dentro de ifs ou aumentar a complexidade das expressões booleanas. Normalmente, o que for mais simples de ser lido é o melhor. 7.24. Estrutura de controle switch A estrutura de controle switch recebe um valor inteiro (ou que possa ser convertido implicitamente para inteiro) e vários casos (possíveis caminhos de decisão). O primeiro caso que estiver de acordo com o valor passado para o switch inicia a execução das instruções do caso. Vamos construir um programa que solicita o número final da placa de um veículo ao usuário e informa a data do vencimento do IPVA. Por enquanto, para simplificar, vamos programar apenas as opções de placas que terminam com os números “1” e “2”. public class PagamentoIpva { public static void main(String[] args) { Scanner entrada = new Scanner(System.in); System.out.print("Digite o final da placa: "); int finalPlaca = entrada.nextInt(); switch (finalPlaca) { case 1: System.out.println("Vencimento dia 11 de Janeiro"); case 2: System.out.println("Vencimento dia 12 de Janeiro"); } } } Se executarmos o exemplo acima e digitarmos o número “2”, visualizamos na tela a data de vencimento, como esperávamos. www.algaworks.com softwares e treinamentos 63 Apostila do curso Fundamentos Java e Orientação a Objetos Agora vamos executar o programa novamente e informar o número “1”. Veja o resultado: O programa executou as instruções do primeiro e segundo caso! Isso não é um erro, mas um detalhe sobre o funcionamento do switch. Quando um caso encontra o valor igual ao passado para o switch, todas as instruções a partir desse caso são executadas, independente se os valores dos casos não têm nada haver com o valor do switch. Se quisermos evitar isso, precisamos incluir a instrução break no fim de cada caso. Assim, a execução do switch é interrompida e as demais linhas de outros casos não são executadas. switch (finalPlaca) { case 1: System.out.println("Vencimento dia 11 de Janeiro"); break; case 2: System.out.println("Vencimento dia 12 de Janeiro"); break; } Agora podemos compilar e executar o programa novamente. www.algaworks.com softwares e treinamentos 64 Apostila do curso Fundamentos Java e Orientação a Objetos Nada acontece se informarmos um número que não existe um caso para ele (todos os casos são ignorados). Se precisarmos executar alguma coisa quando nenhum caso for encontrado, podemos usar o default. O default é um bloco padrão, que é executado quando nenhum caso é satisfeito. Geralmente o colocamos no final do switch, mas pode ser incluído em qualquer ordem. switch (finalPlaca) { case 1: System.out.println("Vencimento dia 11 de Janeiro"); break; case 2: System.out.println("Vencimento dia 12 de Janeiro"); break; default: System.out.println("Vencimento sem data, desculpe."); } Ao compilarmos e executarmos o programa e digitar um número que não satisfaz nenhum caso, por exemplo, “9”, veja que agora o caso default é processado. 7.25. Operador ternário O algoritmo abaixo solicita ao usuário a idade e exibe uma mensagem dizendo se a idade é classificada como adulto ou criança/adolescente. Para fazer isso, usamos apenas o que aprendemos até agora. www.algaworks.com softwares e treinamentos 65 Apostila do curso Fundamentos Java e Orientação a Objetos Scanner entrada = new Scanner(System.in); System.out.print("Digite sua idade: "); int idade = entrada.nextInt(); String indicacao = ""; if (idade >= 18) { indicacao = "adulto"; } else { indicacao = "criança/adolescente"; } System.out.println("Resultado: " + indicacao); O operador ternário é uma forma simples de reduzir linhas de código com instruções if. O operador permite que um valor seja atribuído a uma variável baseado em uma expressão booleana. O exemplo abaixo faz o mesmo que o último código-fonte, porém usando o operador ternário: Scanner entrada = new Scanner(System.in); System.out.print("Digite sua idade: "); int idade = entrada.nextInt(); String indicacao = (idade >= 18) ? "adulto" : "criança/adolescente"; System.out.println("Resultado: " + indicacao); O operador ternário possui a seguinte sintaxe: expressão booleana ? valor caso verdadeiro : valor caso falso; Também é possível usar operadores ternários aninhados. O exemplo abaixo atribui à variável indicacao o valor “adulto”, “criança” ou “adolescente”, dependendo do valor da variável idade. String indicacao = (idade >= 18) ? "adulto" : (idade <= 12 ? "criança" : "adolescente"); O uso de operadores ternários aninhados pode deixar o código ilegível, por isso, para manter uma boa reputação, não é recomendado que se faça isso. 7.26. Operadores de incremento e decremento Os operadores de incremento e decremento também são conhecidos como acréscimo e decréscimo. Esses operadores aumentam ou diminuem o valor de uma variável em exatamente uma unidade. Eles são compostos por dois sinais ++ (adição) ou -- (subtração). www.algaworks.com softwares e treinamentos 66 Apostila do curso Fundamentos Java e Orientação a Objetos O exemplo abaixo incrementa a variável idade em uma unidade, mudando o valor de 10 para 11. int idade = 10; idade++; A instrução idade++ é uma versão mais simples dos exemplos abaixo: // é o mesmo que idade = idade + 1; // e também idade += 1; É importante entender que a forma pós-fixada (com ++ depois do nome da variável) incrementa o valor após usar a variável. No exemplo abaixo, a variável novaIdade será atribuída com o valor 10 e logo em seguida o valor da variável idade será incrementado em uma unidade, mudando seu valor para 11. int idade = 10; // novaIdade recebe 10 e idade é incrementada para 11 int novaIdade = idade++; Existe também a forma pré-fixada (com ++ antes do nome da variável), que incrementa o valor antes de usar a variável. No próximo exemplo, a variável idade será incrementada e terá o valor igual a 11 antes de atribuir um valor para novaIdade, que também ficará com valor 11. int idade = 10; // idade é incrementada para 11 e novaIdade recebe 11 int novaIdade = idade++; Assim como existe o operador de incremento, você pode usar o operador de decremento para diminuir o valor da variável em uma unidade, podendo ser da forma pós-fixa ou pré-fixa. int idade = 10; // novaIdade recebe 10 e idade é decrementada para 9 int novaIdade = idade--; // idade é decrementada para 8 e outra recebe 8 int outraIdade = --idade; www.algaworks.com softwares e treinamentos 67 Apostila do curso Fundamentos Java e Orientação a Objetos Os operadores de incremento e decremento são usados principalmente para controlar loops (laços), onde é necessário um contador para saber quantas vezes o bloco do laço foi executado. 7.27. Estrutura de controle while O while é uma das formas de fazer loops (laços) em Java. Loops são usados para executar um bloco de código diversas vezes, dependendo de uma condição ser verdadeira. O exemplo abaixo imprime todos os números em um intervalo informado pelo usuário. Scanner entrada = new Scanner(System.in); System.out.print("Digite o numero inicial: "); int numeroInicial = entrada.nextInt(); System.out.print("Digite o numero final: "); int numeroFinal = entrada.nextInt(); int numeroAtual = numeroInicial; while (numeroAtual <= numeroFinal) { System.out.println(numeroAtual); numeroAtual++; } O bloco de código dentro do while será executado enquanto o valor da variável numeroAtual for menor ou igual ao valor da variável numeroFinal. Veja que usamos o operador de incremento para adicionar à variável numeroAtual uma unidade a cada execução do bloco de código do loop. 7.28. Estrutura de controle do/while O loop do tipo do/while é parecido com o while, com a diferença que a condição do laço é testada somente após a execução do bloco de código. Por isso, o bloco de código do loop é executado pelo menos uma vez. O exemplo abaixo solicita ao usuário a entrada de um número, sendo que se for digitado 0, o laço é encerrado (de acordo com a condição), mas se outro número for digitado, uma somatória é feita e o programa imprime o valor acumulado. Scanner entrada = new Scanner(System.in); int valor = 0; int soma = 0; do { System.out.print("Digite 0 para sair ou qualquer " + "numero para somar: "); valor = entrada.nextInt(); www.algaworks.com softwares e treinamentos 68 Apostila do curso Fundamentos Java e Orientação a Objetos soma += valor; System.out.println("Soma: " + soma); } while (valor != 0); Ao compilar e imprimir o programa, note que o bloco de código do do/while é executado pelo menos uma vez. Na execução abaixo, informamos o número 0 e saímos do laço imediatamente. Na execução a seguir, informamos vários números antes de digitar o valor 0, por isso o laço foi executado diversas vezes. 7.29. Estrutura de controle for Uma das estruturas de controle mais usadas para fazer laços é o for, pois ela fornece uma forma fácil de iterar (percorrer) em um intervalo de valores. A forma básica da instrução for é a seguinte: for (iniciação; condição; incremento) { // bloco de código do loop } A expressão de iniciação é executada uma única vez assim que o loop é iniciado. Normalmente é declarada uma variável de controle com um valor inicial. www.algaworks.com softwares e treinamentos 69 Apostila do curso Fundamentos Java e Orientação a Objetos A expressão de condição é semelhante às outras estruturas de controle. Você deve incluir uma expressão booleana que definirá a permanência ou término do laço. Essa expressão é analisada a cada iteração do loop. A última expressão, de incremento, é executada após cada iteração do laço, e normalmente é usada para modificar o valor da variável de controle, seja incrementando ou decrementando. Vamos a um exemplo: Scanner entrada = new Scanner(System.in); System.out.print("Ultimo numero: "); int numeroFinal = entrada.nextInt(); for (int i = 1; i <= numeroFinal; i++) System.out.println(i); } O código acima executa o laço for e imprime números de 1 até um valor informado pelo usuário. Note que uma variável de controle i foi declarada na seção de iniciação, avaliada na condição e incrementada na seção de incremento. 7.30. Cláusulas break e continue Quando trabalhamos com loops, pode surgir a necessidade de abandonar a execução do laço antes mesmo que a condição booleana seja falsa. Neste caso, devemos usar a cláusula break. O exemplo abaixo solicita ao usuário um número (divisor) e imprime na tela de 100 até um número anterior ao primeiro múltiplo do valor informado (desde que seja até o número 200). Scanner entrada = new Scanner(System.in); System.out.print("Digite um numero: "); int divisor = entrada.nextInt(); for (int i = 100; i <= 200; i++) { if (i % divisor == 0) { break; } System.out.println(i); } System.out.println("Fim do programa."); Na execução abaixo, informamos o número 8 e o programa exibiu os valores de 100 a 103, pois o número 104 é o primeiro múltiplo de 8 dentro do intervalo de 100 a 200. A cláusula break interrompeu o loop, mas não o programa. www.algaworks.com softwares e treinamentos 70 Apostila do curso Fundamentos Java e Orientação a Objetos Outra necessidade que pode surgir durante o uso de laços é o abandono de apenas a iteração atual, mas não do loop. A cláusula responsável por fazer isso é a continue. O exemplo abaixo é parecido com o anterior, porém ele imprime na tela todos os números entre 100 e 120, com exceção dos múltiplos do número informado. Scanner entrada = new Scanner(System.in); System.out.print("Digite um numero: "); int divisor = entrada.nextInt(); for (int i = 100; i <= 120; i++) { if (i % divisor == 0) { continue; } System.out.println(i); } System.out.println("Fim do programa."); Executamos o programa e informamos o número 2. Veja que foram exibidos apenas os números ímpares (não múltiplos de 2). Quando você está trabalhando com um laço dentro de outro, a chamada das cláusulas break e continue abandonam o laço ou a iteração do laço mais interno, a não ser que um rótulo seja especificado. Se precisar disso, pesquise na internet sobre cláusulas break e www.algaworks.com softwares e treinamentos 71 Apostila do curso Fundamentos Java e Orientação a Objetos continue rotuladas. O melhor seria você não usar essas cláusulas rotuladas e pensar em alguma lógica mais simples, pois elas podem deixar seu código-fonte difícil de ser compreendido. www.algaworks.com softwares e treinamentos 72 Apostila do curso Fundamentos Java e Orientação a Objetos 8. Próximos capítulos Esta apostila está incompleta (em desenvolvimento). http://www.algaworks.com/ead para acompanhar as novas versões. Acesse o site 9. Sites Interessantes Blog da AlgaWorks http://www.algaworks.com/blog Java.NET http://www.java.net Grupo de Usuários Java http://www.guj.com.br JEE Brasil http://www.jeebrasil.com.br JavaFree – Se é Java, é Free! http://www.javafree.com.br Portal Java http://www.portaljava.com.br MundoOO http://www.mundooo.com.br www.algaworks.com softwares e treinamentos 73 Apostila do curso Fundamentos Java e Orientação a Objetos 10. Livros Recomendados Java Como Programar Autor: Deitel, Harvey M. / Deitel, Paul J. Editora: Pearson / Prentice Hall ISBN: 8576050196 Idioma: Português Páginas: 1152 Publicação: 2005 Edição: 6 Use a Cabeça! Java Autor: Sierra, Kathy / Bates, Bert Editora: Alta Books ISBN: 8576080842 Idioma: Português Páginas: 496 Publicação: 2005 Edição: 1 www.algaworks.com softwares e treinamentos 74