Prévia do material em texto
Orientação a objetos em Java – JOO 2016 v1 LogusTI – Treinamento em Informática Tel (61) 3244 - 5000 WhatsApp (61) 9 8548-0058 SCS QD 02 BL C n 252 BRASÍLIA – DF www.logusti.com.br logusti@logusti.com.br JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 2 LogusTI A LogusTI nasceu da necessidade de oferecer novos treinamentos na área de Tecnologia da Informação em Brasília, visto que este segmento é escasso na Capital Federal. A excelência dos serviços prestados pela LogusTI está apoiada em profissionais especializados, processos estabelecidos e uma larga experiência em seus profissionais. O capital humano é um elemento chave na estratégia de atuação da empresa, que investe continuamente na atualização e capacitação de seus profissionais, propiciando um ambiente encorajador para serem os melhores naquilo que fazem. A alta qualidade dos serviços prestados aliada ao compromisso em gerar resultados e proporcionar maior vantagem competitiva a seus clientes tem propiciado a LogusTI relacionamentos duradouros e bem sucedidos com empresas de diversos segmentos de mercado. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 3 Sobre o autor Gleidson Porto Bacharel em Ciência da Computação, Pós-graduação em Sistemas Orientados a Objetos, MBA em Gestão Estratégica de TI pela FGV e Mestre em Gestão Estratégica das Organizações. Tem experiência na área de Ciência da Computação, com ênfase Fábrica de Software, Engenharia de Software e Governança Estratégica de TI; Atuou como Gerente de Projetos Estratégicos de TI na CAPGEMINI/CPMBRAXIS, a maior empresa de TI europeia e sétima maior do mundo, nas operações do Ministério de Ciência e Tecnologia, Caixa Econômica Federal, Brasiltelecom, Oi e Embratur. Atuou como Coordenador de TI pela Stefanini IT Solutions, maior empresa de TI brasileira, em operações de missão crítica de TI na BrasilTelecom. Atuou também professor de Informática da EIBNET – Escola de Informática de Brasília com mais de 15.000 horas de treinamentos em JAVA, SCRUM, COBIT, APF, RUP e ITIL. Foi professor de ensino superior de TI no Instituto Fátima em Brasília – DF durante 6 anos. Hoje atua como coordenador da divisão de Desenvolvimento de Software da autarquia pública CFM - Conselho Federal de Medicina e professor de ensino superior da Faculdade JK. Atua também como instrutor da LogusTI. Possui as certificações internacionais IBM Certified Solution Designer - Sun Certified Java Programmer, IBM Rational Unified Process V7.0, COBIT, ITIL Foundation Certified e ScrumMaster Certified pela ScrumAlliance. https://www.linkedin.com/in/gleidson-porto-06817637/ gleidsonporto@gmail.com http://lattes.cnpq.br/6540446452817806 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 4 Sumário 1 INTRODUÇÃO .............................................................................................................................................. 8 1.3 História da Linguagem Java ......................................................................................................................... 9 2 A LINGUAGEM JAVA ................................................................................................................................. 10 2.1 Java ......................................................................................................................................................... 10 2.2 Máquina Virtual ......................................................................................................................................... 10 2.3 Garbage Collection ................................................................................................................................... 11 2.4 Instalando o Java ...................................................................................................................................... 12 2.4.1 Instalando o JDK .................................................................................................................................... 12 2.4.2 Configurando o Java no Windows ........................................................................................................... 13 2.4.3 Confirmando a instalação e configuração do Java .................................................................................... 15 2.5 Compilando e executando o primeiro programa .......................................................................................... 15 3 AMBIENTE INTEGRADO DE DESENVOLVIMENTO - ECLIPSE ................................................................... 17 3.1 O Eclipse .................................................................................................................................................. 17 3.2 Característica e Ferramentas ..................................................................................................................... 17 3.3 Instalando o Eclipse .................................................................................................................................. 18 3.4 Conhecendo o Eclipse ............................................................................................................................... 18 4 SINTAXE DA LINGUAGEM JAVA................................................................................................................ 20 4.1 Delimitadores em Java .............................................................................................................................. 20 4.2 Identificadores e palavras reservadas......................................................................................................... 21 4.3 Declarando variáveis em Java ................................................................................................................... 23 4.5 - Convenções de codificação ..................................................................................................................... 26 4.6 Exercícios........................................................................................................................................ 27 5 EXPRESSÕES ............................................................................................................................................ 28 5.1 Operadores lógicos e aritméticos ............................................................................................................... 28 5.2 Concatenação de Strings com o operador + ............................................................................................... 29 Alguns métodos úteis em dados do tipo String:................................................................................................. 29 5.3 Promoção e Casting .................................................................................................................................. 30 5.4 Operadores de deslocamento (>>, <<, >>>)................................................................................................ 31 5.5 Circuitos lógicos ........................................................................................................................................ 31 5.6 Exercícios........................................................................................................................................ 32 6 FLUXO DE CONTROLE .............................................................................................................................. 33 6.1 Ramificação if,else ................................................................................................................................... 33 6.2 Ramificação switch ................................................................................................................................... 34 6.3 Repetição for ............................................................................................................................................ 35 6.4 Repetição while ........................................................................................................................................ 36 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 5 6.5 Comandos especiais de controle de fluxo: break, continue e label ................................................................ 37 6.6 Lendo valores do teclado ........................................................................................................................... 38 6.7 Exercícios................................................................................................................................................. 38 7 AGRUPAMENTO DE DADOS (ARRAYS)..................................................................................................... 39 7.1 Declarando e criando Arrays ...................................................................................................................... 39 7.2 Modificando o conteúdo de um array .......................................................................................................... 41 7.3 Acessando o conteúdo de um array ........................................................................................................... 41 7.4 Percorrendo um Array ............................................................................................................................... 42 7.5.1 Ordenando um Array .............................................................................................................................. 43 7.5.2 Duplicando um Array .............................................................................................................................. 43 7.5.3 Preenchendo um Array ........................................................................................................................... 43 7.6 Arrays multidimensionais ........................................................................................................................... 44 7.7 Array esparso ........................................................................................................................................... 44 7.8 Exercícios........................................................................................................................................ 45 8 ORIENTAÇÃO A OBJETOS(OO) BÁSICA ................................................................................................... 46 8.1 Fundamentos da Programação Orientada a Objetos ................................................................................... 46 8.2. Paradigma Orientado por Objetos ............................................................................................................. 46 8.3 Principais conceitos de POO...................................................................................................................... 46 8.3.1 Objetos .................................................................................................................................................. 46 8.3.2 Atributos e métodos................................................................................................................................ 48 8.3.3 Classes ................................................................................................................................................. 49 8.3.3 Instanciação........................................................................................................................................... 50 8.4 - Exercício - Conceitos OO ........................................................................................................................ 51 8.5 – Classes e Objetos em Java ..................................................................................................................... 52 8.5.1 Criando objetos em Java ........................................................................................................................ 52 8.5.2 Referências ........................................................................................................................................... 53 8.5.3 Manipulando Atributos ............................................................................................................................ 54 8.5.4 Valores Padrão ...................................................................................................................................... 54 8.6 Exercícios Complementares ...................................................................................................................... 56 9 OO - HERANÇA, POLIMORFISMO E INTERFACES .................................................................................... 57 9.1 Objetos e Construtor ................................................................................................................................. 57 9.2 Herança ................................................................................................................................................... 57 9.3 Polimorfismo ............................................................................................................................................. 59 9.3.1 Polimorfismo - Sobreescrita .................................................................................................................... 60 9.3.2 Polimorfismo – Sobrecarga ..................................................................................................................... 61 9.4 Exercício - Polimorfismo ............................................................................................................................ 62 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 6 9.5 Interfaces ................................................................................................................................................. 63 10 OO - CLASSES ABSTRATAS.................................................................................................................... 65 11 MODIFICADORES JAVA ........................................................................................................................... 66 11.1 Introdução .............................................................................................................................................. 66 11.2 Modificadores de Acesso ......................................................................................................................... 66 11.2.1 Private ................................................................................................................................................. 67 11.2.2 Protected ............................................................................................................................................. 68 11.2.3 Public .................................................................................................................................................. 69 11.2.4 Default (padrão) ................................................................................................................................... 69 11.3 Outros Modificadores ..............................................................................................................................69 11.3.1 Final .................................................................................................................................................... 69 11.3.2Abstract ................................................................................................................................................ 70 11.3.3 Static ................................................................................................................................................... 70 11.3.4 Transient ............................................................................................................................................. 71 11.3.5 Synchronized ....................................................................................................................................... 71 11.3.6 Volatile ................................................................................................................................................ 71 11.3.7 Native .................................................................................................................................................. 71 11.4 Encapsulamento ..................................................................................................................................... 71 11.4.1 Métodos Getters e Setters .................................................................................................................... 72 11.5 Exercício ................................................................................................................................................ 73 12 EXCEÇÕES – CONTROLANDO OS ERROS .............................................................................................. 75 12.1 Tratamento de exceções ......................................................................................................................... 75 12.2 Erros e Exceções de runtime ................................................................................................................... 77 12.3 Propagando exceções ............................................................................................................................. 77 12.4 Definindo e gerando exceçoes ................................................................................................................. 78 12.5 Hierarquia de exceções Java ................................................................................................................... 79 13 THREADS .......................................................................................................................................... 81 13.1 Conceito de Threads ............................................................................................................................... 81 13.2 Ciclo de Vida de uma Thread ................................................................................................................... 82 13.2.1 Criando Threads................................................................................................................................... 82 13.2.2 Iniciando Threads ................................................................................................................................. 83 13.2.3 Fazendo Thread Esperar ...................................................................................................................... 83 13.2.4 Finalizando Threads ............................................................................................................................. 83 13.2.5 Verificando se Threads estão Executando/Pronta/Esperando ou Novas/Mortas........................................ 83 13.3 Implementando Threads em java ............................................................................................................. 83 13.4 Escalonamento de Threads ..................................................................................................................... 85 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 7 13.5 Exercícios ............................................................................................................................................... 88 14 API JAVA - JAVA.IO ................................................................................................................................ 89 14.1 Classe InputStream ................................................................................................................................. 89 14.2 Lendo um arquivo ................................................................................................................................... 90 14.3 OutputStream ......................................................................................................................................... 92 14.4 Reader ................................................................................................................................................... 92 14.5 Writer ..................................................................................................................................................... 92 14.6 Buffers.................................................................................................................................................... 93 14.7 Exercícios ............................................................................................................................................... 94 15 COLLECTIONS FRAMEWORK .................................................................................................................. 95 15.1 – Introdução............................................................................................................................................ 95 15.2 – Tipos de Coleções ................................................................................................................................ 95 15.2.1 – Lista.................................................................................................................................................. 98 15.2.2 – Conjunto ........................................................................................................................................... 99 15.2.3 – Mapas............................................................................................................................................... 99 15.3 – Exercício ............................................................................................................................................ 101 RESPOSTAS DO EXERCÍCIOS.................................................................................................................... 102 REFERÊNCIAS ............................................................................................................................................ 137 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 8 1 INTRODUÇÃO 1.1 Sobre a LogusTI A LogusTI nasceu da necessidade de oferecer novos treinamentos na área de Tecnologia da Informação em Brasília, visto que este segmento é escasso na Capital Federal. A excelência dos serviços prestados pela LogusTI está apoiada em profissionais especializados, processos estabelecidos e uma larga experiência em seus profissionais. O capital humano é um elemento chave na estratégia de atuação da empresa, que investe continuamente na atualização e capacitação de seus profissionais, propiciando um ambiente encorajador para serem os melhores naquilo que fazem. A alta qualidade dos serviços prestados aliada ao compromisso em gerar resultados e proporcionarmaior vantagem competitiva a seus clientes tem propiciado a LogusTI relacionamentos duradouros e bem sucedidos com empresas de diversos segmentos de mercado. O principal objetivo da LogusTI é promover treinamentos de máxima qualidade que relacionados às principais tecnologias utilizadas pelas empresas. Por meio desses treinamentos, seus alunos se tornam capacitados para atuar no mercado de trabalho. 1.2 Objetivo O objetivo fundamental dos treinamentos da LogusTI é transmitir os conhecimentos necessários para que os seus alunos possam atuar no mercado de trabalho na área de Tecnologia da Informação. A plataforma Java é a mais utilizada no desenvolvimento de software no mundo. Para utilizar os recursos oferecidos por essa plataforma de forma eficiente, é necessário possuir conhecimento sólido em orientação a objetos. Assim sendo, esta apostila da LogusTI tem como intuito ensinar Java de uma maneira simples e objetiva. Esperamos que você aproveite esse material, e que ele possa contribuir positivamente para construção do conhecimento acerca da programação Java. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 9 1.3 História da Linguagem Java Java é uma linguagem de programação interpretada orientada a objetos desenvolvida na década de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems, adquirida pela Oracle. Diferente das linguagens de programação convencionais, que são compiladas para código nativo, a linguagem Java é compilada para um bytecode que é executado por uma máquina virtual. A linguagem de programação Java é a linguagem convencional da Plataforma Java, mas não é a sua única linguagem. Em 1991, na Sun Microsystems, foi iniciado o Green Project, o berço do Java, uma linguagem de programação orientada a objetos. Os mentores do projeto eram Patrick Naughton, Mike Sheridan, e James Gosling. Eles acreditavam que, eventualmente, haveria uma convergência dos computadores com os equipamentos e eletrodomésticos frequentemente usados pelas pessoas no seu dia-a-dia. Para provar a viabilidade desta ideia, 13 pessoas trabalharam arduamente durante 18 meses. No verão de 1992 eles emergiram de um escritório de Sand Hill Road, no Menlo Park, com uma demonstração funcional da ideia inicial. O protótipo se chamava *7 (lê-se “Star Seven”), um controle remoto com uma interface gráfica touchscreen. Para o *7, foi criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho do Duke no *7 era ser um guia virtual ajudando e ensinando o usuário a utilizar o equipamento. O *7 tinha a habilidade de controlar diversos dispositivos e aplicações. James Gosling especificou uma nova linguagem de programação para o *7. Gosling decidiu batizá-la de “Oak”, que quer dizer carvalho, uma árvore que ele podia observar quando olhava através da sua janela. O nome da linguagem desenvolvida pelo projeto Green foi mudada de Oak para Java, que foi uma homenagem à uma ilha da Indonésia de onde os Norte-Americanos importavam o café que era consumido pela equipe de James Gosling. Ate 1994, não havia uma aplicação definida para o Java. Foi quando Jonathan Payne e Patrick Naughton criaram um novo navegador para Web que podia executar programas escritos em Java (applets), batizado de Web Runner. E em 1996, em uma iniciativa inédita, a Sun Microsystems resolveu disponibilizar gratuitamente um kit de desenvolvimento de software para a comunidade, que ficou conhecido como Java Developer`s Kit (JDK). Desde então a aceitação da tecnologia Java cresceu rapidamente entre empresas e desenvolvedores. A Sun Microsystems lançou o JDK 1.1 com melhorias significativas para o desenvolvimento de aplicações gráficas e distribuídas. Depois disso, a empresa continuou lançando novas versões gratuitas com novas melhorias e recursos. Em abril de 2009, a Oracle ofereceu US$ 7,4 bilhões pela aquisição da Sun Microsystems e a proposta foi aceita. Essa aquisição deu à Oracle a propriedade de vários produtos, incluindo o Java e o sistema operacional Solaris. Em comunicado, a Oracle afirmou que o Java foi o software mais importante adquirido ao longo de sua história. Muitas especulações foram feitas acerca do futuro do Java depois de passar a ser propriedade da Oracle. Mais com certeza essa aquisição contribuiu muito para que o Java tivesse um salto qualitativo. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 10 2 A LINGUAGEM JAVA 2.1 Java Java é uma linguagem de programação orientada a objetos desenvolvida pela antiga Sun Microsystems, agora Oracle. Modelada depois de C++, a linguagem Java foi projetada para ser pequena, simples e portável a todas as plataformas e sistemas operacionais, tanto o código fonte como os binários. Esta portabilidade é obtida pelo fato da linguagem ser interpretada, ou seja, o compilador gera um código independente de máquina chamado byte-code. No momento da execução este byte-code é interpretado por uma máquina virtual instalado na máquina. Para portar Java para uma arquitetura hadware/s específica, basta instalar a máquina virtual (interpretador). Além de ser integrada à Internet, Java também é uma excelente linguagem para desenvolvimento de aplicações em geral. Dá suporte ao desenvolvimento de software em larga escala. 2.2 Máquina Virtual De acordo com a especificação da SUN, a máquina virtual do Java pode ser vista como: Para um programa Java ser executado, ele precisa passar pelo processo ilustrado na figura abaixo: Figura 1- JVM O código é compilado, gerando um conjunto de instruções chamado de byte-code. Esse byte-code é aplicado à Máquina Virtual Java (JVM) que se encarrega de interpretar os comandos para o sistema operacional onde o programa está rodando. Ou seja, a máquina virtual traduz as instruções do código Java para instruções válidas no sistema operacional em que está rodando. Se essa portabilidade fosse requerida em C, o código deveria ser compilado várias vezes – uma para cada sistema operacional desejado. No caso do Java, o código é compilado apenas uma vez, gerando o byte-code. Esse byte-code poderá então ser interpretado por qualquer máquina virtual Java, rodando em Linux, Windows, Palm OS, Solaris ou qualquer outro sistema operacional que possua uma máquina virtual Java implementada. (Compile once, run anywhere). Uma máquina imaginária que é implementada via software ou hardware. Um código a ser executado por essa máquina deve ser gravado em um arquivo com extensão .class. e possuir um código compatível com as instruções Java. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 11 Uma JVM possui definições concretas para a implementação dos seguintes itens: Conjunto de instruções (equivalentes às instruções da CPU) Conjunto de registradores Formato padrão de classes Pilha de memória Pilha de objetos coletados pelo garbage-collector Área de memória IMPORTANTE: a JVM não permite que um programa Java acesse recursos de hardware diretamente, protegendo o computador de operações perigosas, como acesso à regiões protegidas da memória ou formatação física do disco rígido. Um programa Java só é executado caso o seu byte-code passe pela verificação de segurança da JVM, que consiste em dizer que: O programa foi escrito utilizando-se a sintaxe e semântica da linguagem Java Não existem violações de áreas restritas de memória no código O código não gera Stack Overflow Os tipos de parâmetrosdos métodos são corretos Não existe nenhuma conversão ilegal entre dados do programa, como a tentativa de conversão de inteiros em ponteiros O acesso a objetos está corretamente declarado Caso alguma das condições acima não seja satisfeita, a máquina virtual Java causará um erro de execução (runtime error). 2.3 Garbage Collection Durante a execução de um programa de computador, ocorre a alocação e liberação dinâmica de memória RAM. Dados são escritos e lidos da memória do computador satisfazendo os requisitos de cada programa. Em linguagens tradicionais como Pascal, Basic e C/C++, o programador é responsável por controlar essa alocação, impedindo o estouro de memória (stack overflow) e outros problemas, como o acesso indevido a áreas reservadas de memória. Para facilitar a vida dos programadores, e evitar os erros comuns associados à alocação de memória, a linguagem Java introduziu um novo conceito: o garbage-collection. Garbage-collection é um mecanismo de controle automático de alocação e liberação de memória. Quando uma variável é declarada em um código de computador, a JVM cria um ponteiro para uma área de memória equivalente ao tamanho do tipo de dado utilizado por essa variável. Quando essa variável é associada a outra região de memória, a JVM coloca o espaço alocado anteriormente em uma pilha de objetos em Mais sobre Geralmente, as máquinas virtuais utilizam uma estratégia de compilação chamada Just-in-time compilation (JIT). Nessa abordagem, o código de máquina pode ser gerado diversas vezes durante o processamento de um programa com o intuito de melhorar a utilização dos recursos disponíveis em um determinado instante da execução. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 12 desuso. Caso o computador fique com pouca memória disponível, a JVM remove objetos dessa pilha, permitindo que esse espaço de memória seja realocado. O processo de garbage-collection ocorre automaticamente durante a execução de um programa Java. O programador não precisa se preocupar com aritmética de ponteiros (grande dificuldade em linguagens como C e Pascal). 2.4 Instalando o Java Para desenvolver aplicações Java, o programador deve instalar em sua máquina um Java Development Kit(JDK). Um JDK contém diversas ferramentas utilizadas na criação de um programa Java. Mostraremos a seguir como instalar um JDK no sistema operacional Windows. JDK: Faça o download da versão mais atual aqui: http://www.oracle.com/technetwork/java/javase/downloads/index.html Observe abaixo que a Oracle disponibiliza a versão do JDK para vários sistemas operacionais. Vamos utilizar a versão jdk-8u101-windows-x64.exe para o Windows x64 de 193.68 MB. Figura 2 – Site da Oracle para download do JDK O procedimento de instalação no Windows é muito simples: basta você executar o arquivo e seguir os passos abaixo: 2.4.1 Instalando o JDK Execute o instalador do JDK (jdk-8u101-windows-x64.exe) e siga as instruções até concluir (next > next > finish ), se desejar, é possível informar o diretório de instalação (que vai ser muito importante para realizarmos a configuração do JDK – Figura 3). JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 13 Figura 3 – Tela de Instalação do JDK Juntamente com o JDK será feita a instalação do JRE (Java Runtime Environment) que é o aplicativo que permite executar os programas em JAVA no seu sistema operacional. 2.4.2 Configurando o Java no Windows Clique com o botão direito em Computador e siga as opções Propriedades > Configurações avançadas do sistema > (aba Avançado) Variáveis de Ambiente… Crie/edite as variáveis do sistema listadas abaixo: JAVA_HOME Informe o diretório da instalação do JDK (Figura 4). Exemplo C:\Program Files\Java\jdk1.8.0_101 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 14 Figura 4 – Configuração da variável de ambiente “JAVA_HOME”. PATH Informe %JAVA_HOME%\bin (Figura 5). Figura 5– Configuração da variável de ambiente “PATH”. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 15 2.4.3 Confirmando a instalação e configuração do Java Para confirmar que a instalação e configuração do JAVA foi realizada com sucesso, execute os comandos “java -version” e “javac -version” no prompt de comando. O resultado esperado está na Figura 6. Figura 6 – Validação de instalação e configuração do Java 2.5 Compilando e executando o primeiro programa Vamos criar um simples programa para entendermos como funciona o processo de compilação e execução. Utilizaremos a linguagem Java, que é amplamente adotada nas empresas. Observe o código do exemplo de um programa escrito em Java que imprime uma mensagem na tela: 1 public class OlaMundo { 2 public static void main ( String [] args ) { 3 System.out.println("Olá Mundo!"); 4 } 5 } Código Java 2.5: OlaMundo.java O código fonte Java deve ser colocado em arquivos com a extensão .java. Agora, não é necessário entender todo o código do exemplo. Basta saber que toda aplicação Java precisa ter um método especial chamado main para executar. O próximo passo é compilar o código fonte, para gerar um executável que possa ser processado pela máquina virtual do Java. O compilador padrão da plataforma Java ( javac) pode ser utilizado para compilar esse arquivo. O compilador pode ser executado pelo terminal. Mais sobre No Linux, são as mesmas variáveis, mas o PATH é separado por :. Nos Windows velhos, como o 98, você deve alterar isso no autoexec.bat. Nos Windows mais novos, como NT, 2000, e XP, procure onde você pode adicionar novas variáveis de ambiente (em Iniciar - Painel de Controle – Sistema – Avançado Variáveis de Sistema). No Linux, geralmente a alteração deverá ser feita no arquivo ~/.bashrc se você não tiver privilégios de administrador. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 16 C:\LOGUSTI\EXEMPLOS> dir OlaMundo.java C:\LOGUSTI\EXEMPLOS>javac OlaMundo.java C:\LOGUSTI\EXEMPLOS> dir OlaMundo.class OlaMundo.java O código gerado pelo compilador Java é armazenado em arquivos com a extensão .class. No exemplo, o programa gerado pelo compilador é colocado em um arquivo chamado OlaMundo.class e ele pode ser executado através de um terminal. C:\LOGUSTI\EXEMPLOS> dir OlaMundo.class OlaMundo.java C:\LOGUSTI\EXEMPLOS> java OlaMundo Olá Mundo! Importante Antes de compilar e executar um programa escrito em Java, é necessário que você tenha instalado e configurado em seu computador o JDK (Java Development Kit). 2.5 – Exercícios Mais sobre Quando uma aplicação ou biblioteca Java é composta por diversos arquivos .class, podemos “empacotá-los” em um único arquivo com a extensão .jar com o intuito de facilitar a distribuição da aplicação ou da biblioteca. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 17 3 AMBIENTE INTEGRADO DE DESENVOLVIMENTO - ECLIPSE 3.1 O Eclipse Na prática, alguma ferramenta de desenvolvimento é adotada para aumentar a produtividade. Essas ferramentas são chamadas IDE (Integrated Development Environment - Ambiente de Desenvolvimento Integrado).Uma IDE é uma ferramenta que provê facilidades para o desenvolvedor realizar as principais tarefas relacionadas ao desenvolvimento de um software. No caso específico da plataforma Java, a IDE mais utilizada é o Eclipse. Essa ferramenta é bem abrangente e oferece recursos sofisticados para o desenvolvimento de uma aplicação Java. Além disso, ela é gratuita. É a IDE líder de mercado. Formada por um consórcio liderado pela IBM, possui seu código livre. As diversas distribuições do Eclipse podem ser obtidas através do site http://www.eclipse. org/. Descompacte o arquivo e pronto; basta rodar o executável. 3.2 Característica e Ferramentas A IDE Eclipse é um programa que reúne ferramentas de apoio ao desenvolvimento de software possibilitando uma agilidade maior no processo de construção de um software. Editor – edita o código-fonte do programa escrito Compiler – compila o código-fonte transformando em código de máquina. Linker – são os vários pedaços de códigos reunidos transformando em um executável. Debugger – processo de se localizar erros(famosos bugs) . Modelling - criação do modelo de classes, objetos, interfaces, associações e interações dos artefatos envolvidos no software. Geração de código - A IDE gera códigos(templates) comumente utilizados possibilitando algumas soluções. Deploy - auxilia no processo de criação do instalador do software. (no nosso caso os famosos *.jar). Automated tests - realiza testes no software de forma automatizada, Refactoring - consiste na melhoria constante do código-fonte do software para construção de código mais otimizado. IMPORTANTE Preciso pagar pela ferramenta Eclipse? Não, é uma ferramenta OPEN SOURCE conforme mencionado acima é um software livre. Porque o Eclipse faz tanto sucesso? “Na prática ele cria um modelo de Open Innovation Network, onde empresas concorrentes podem criar redes de inovação, cooperando no desenvolvimento de softwares Open Source...” - Cezar Taurion(IBM) JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 18 3.3 Instalando o Eclipse O Eclipse roda direto de um arquivo executável. Realize o download por meio do link http://www.eclipse.org/downloads/packages/eclipse-ide-java-developers/neonr e extraia o pacote “.zip” do Eclipse (eclipse-java-neon-R-win32-x86_64.zip) para o diretório de sua preferência. Execute o arquivo eclipse.exe para iniciar. Ao iniciar o eclipse, você deve definir o workspace de trabalho (que é a pasta onde será mantido seu espaço de trabalho – Figura 7). Figura 7 – Configuração do workspace do Eclipse. Figura 8 – Tela inicial do Eclipse. 3.4 Conhecendo o Eclipse O eclipse possui uma interface amigável com as ferramentas agrupadas por perspectivas(Views e Perspective). Iremos utilizar a perspectiva Java que apresenta os seguintes recursos: 1 - Package Explorer - janela contendo todos os projetos desenvolvidos, cada projeto representa um programa ou aplicação; 2 - Problems - janela que indica erros contidos no código ordenados pela linha em que acontece; 3 - Console - janela responsável pela saída de padrão para mensagens proveniente qualquer JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 19 programa Java; 4 - Janela com código - janela onde aparecerá o código fonte do arquivo .java selecionado no momento.Tal janela aparece automaticamente ou dando 2 cliques em algum arquivo .java presente na janela Package Explorer. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 20 4 SINTAXE DA LINGUAGEM JAVA 4.1 Delimitadores em Java Em um código-fonte Java, alguns símbolos são utilizados pelo compilador para diferenciar comandos, blocos de comandos, métodos, classes, etc. Tais símbolos, chamados de delimitadores, são enumerados abaixo: Comentários Comentários servem para identificar a função de um comando, um trecho de código, ou um método. Além disso, os comentários podem ser utilizados para documentar aspectos de desenvolvimento de um programa: como o nome da empresa que o desenvolveu, nome dos programadores, versão, etc. Existem dois tipos de comentário: o simples e o de documentação. O comentário simples é delimitado por duas barras // e termina ao final de uma linha, conforme abaixo. // comentário simples: não será incluído na documentação // do programa (note que comentários simples exigem // um par de barras para cada linha). O comentário de bloco é delimitado por duas barras /* e termina com */ ao final de uma linha. /* Comentário de bloco utilizado para comentar várias linhas de código */ O comentário de documentação é iniciado pelo símbolo /** e encerrado pelo símbolo */, podendo conter várias linhas de texto e linhas em branco. Esse tipo de comentário será utilizado pela ferramenta geradora de documentação javadoc, que acompanha o ambiente de desenvolvimento SDK. Todo o texto entre os delimitadores de comentários do Javadoc é ignorado pelo compilador. Permitem incorporar a documentação do programa diretamente nos programas. O programa utilitário javadoc lê comentários no estilo Javadoc e utiliza-os para preparar a documentação do seu programa no formato HTML. Ponto e vírgula, blocos e espaços em branco: em Java, todo comando é terminado por um ponto e vírgula (;). Exemplo: System.out.println ("note o ponto e vírgula no final "); JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 21 Um bloco é formado por um conjunto de instruções delimitadas por chaves, como no exemplo abaixo: /** Exemplo de bloco */ { // Chamamos essa chave de início de bloco int ano; // Note o ponto e vírgula ano = 2002; // sempre ao final de um comando Java } // Chamamos essa chave de final de bloco O espaço em branco, quebra de linha e caracteres de tabulação são permitidos em qualquer trecho do código-fonte, devendo ser utilizados para realçar o aspecto visual de seu código. IMPORTANTE Apesar do aspecto visual do código-fonte não ter nenhum impacto no desempenho de um programa Java, o uso de endentação é uma característica de bons códigos-fonte. Lembre-se que você não será o único a ler o código-fonte de seus programas, portanto escreva-o da maneira mais organizada e legível possível. 4.2 Identificadores e palavras reservadas Em Java, um identificador é uma sequência de símbolos UNICODE (64K símbolos) que começa com uma letra, um símbolo subscrito _, ou o caractere $. Os demais símbolos de um identificador podem conter também números. Identificadores são case-sensitive e não tem um tamanho máximo estabelecido. Apesar da tabela UNICODE ser bastante extensa, um bom hábito de programação é utilizar somente letras do alfabeto (a-Z) e números para nomear identificadores. Exemplo de identificadores válidos em Java: data _data $data data_do_mês data1 uma_variável_pode_SER_bastante_extensa_e_conter_Numeros234876238476 data_public_class_NoteQueEsseIdentificadorContemPalavrasReservadas Apesar desta "liberdade" de opções para nomes de identificadores, algumas palavras não são permitidas. Tais palavras são ditas palavras reservadas, e representam o conjunto de comandos que forma a sintaxe da linguagem Java. O conjunto de palavras reservadas em Java é o seguinte: JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICAPÁGINA 22 abstract double int strictfp boolean else interface super break extends long switch byte final native synchronized case finally new this catch float package throw char for private throws class goto protected transient const if public try continue implements return void default import short volatile do instanceof static while IMPORTANTE Você não precisa se preocupar em memorizar o nome das palavras reservadas em Java. À medida que você for praticando a programação em Java, isso se tornará natural. Além disso, o compilador acusa um erro de nomenclatura quando você tenta utilizar uma palavra reservada para nomear uma variável, um método ou uma classe. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 23 4.3 Declarando variáveis em Java Uma variável é sempre declarada seguindo do seguinte esquema: <tipo> + <espaço> + identificador + ; ou <tipo> + <espaço> + identificador + = + valor + ; onde: <tipo> é um tipo primitivo de dados ou o nome de uma classe ou interface identificador é o nome da variável valor é o valor atribuído à variável. Exemplos: int number1 = 10; // primeiro número a somar int number2 = 20; // segundo número a somar int sum; // soma de number1 e number2 IMPORTANTE Caso você declare uma variável e não atribua nenhum valor, ela não poderá ser utilizada em um código Java – a tentativa de utilizar uma variável não inicializada em Java gerará um erro de compilação. IMPORTANTE Veremos mais adiante que Java possui um mecanismo de inicialização de variáveis de seus tipos primitivos, mas o aluno deve evitar considerar essa inicialização como prática de programação. De fato, esta inicialização automática não funciona para variáveis de tipos agregados ou abstratos de dados e também que o escopo das variáveis – de classe ou de instância - tem influência na sua inicialização. O aluno é fortemente recomendado a pensar em variáveis como espaços alocados na memória RAM, inicialmente podendo conter qualquer valor (conhecido como lixo na memória). JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 24 4.4 Tipos primitivos da linguagem Java A linguagem Java utiliza oito tipos primitivos de dados e um tipo especial. Esses tipos primitivos podem ser utilizados para declarar constantes ou variáveis utilizadas em programas Java. Os tipos primitivos estão divididos em quatro categorias: lógicos, textuais, numéricos inteiros e numéricos de ponto flutuante. Tipos lógicos: boolean Valores lógicos possuem dois estados, normalmente ditos verdadeiro/falso, sim/não e ligado/ desligado. Em Java um tipo lógico é definido pela palavra boolean, e pode assumir dois valores: true ou false. // Exemplo de variável que suporta valores booleanos boolean anoBissexto = false; boolean anoPar = true; // Apesar de uma variável poder ser declarada // sem receber um valor, ela só poderá ser usada // após a atribuição de algum valor a ela. boolean valido; Tipos textuais: char e String Caracteres simples são representados pelo tipo char. Um char representa um caracter UNICODE, ou seja, um número inteiro sem sinal de 16 bits, no intervalo de 0 até 216-1. O valor de um literal char deve ser delimitado por aspas simples: // Exemplo de representação de caracteres UNICODE char primeiraLetra = 'a'; char tabulacao = '\t'; // Código UNICODE para o caractere de interrogação char unicode = '\u0A02'; // Lembre-se: Uma variável só poderá // ser manipulada após receber um valor. char inutil; // variável sem utilidade neste momento inutil = '@'; // variável útil a partir de agora Palavras são representadas por uma sequência de dados do tipo char, agrupadas em um tipo “especial” de dados: a classe String. Apesar de ser uma classe, uma variável do tipo String suporta operações como se fosse um tipo primitivo de dados. O valor de uma variável String deve ser delimitado por aspas duplas "valor". JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 25 // Exemplo de uso de variáveis do tipo String String curso = "Java Básico OO - LogusTI"; // Uma variável pode receber o valor de outra String outraVariavel = curso; // A concatenação de Strings pode ser feita através do operador de soma (+) curso = "Java Básico OO " + " Java Web" ; // Concatenação de String com outro tipo de dados: curso = "Java Básico OO" + 'I'; curso = "Java Básico OO" + 1; // Para comparar duas variáveis do tipo String devemos usar o método equals(): // curso == "Java Básico OO..." INCORRETO // curso.equals("Java Básico OO...") CORRETO A concatenação de qualquer tipo de dado com um dado do tipo String resulta em um novo dado do tipo String. Tipos numéricos inteiros: byte, short, int e long Existem quatro tipos primitivos de números em Java. Além disso, os valores numéricos podem ser representados de forma decimal, octal ou hexadecimal: Valores numéricos inteiros em Java: 2 decimal 077 um número que começa com zero está representado de forma octal 0xBABE representação hexadecimal Todos os valores numéricos em Java tem sinal positivo ou negativo. Um valor numérico é sempre considerado do tipo int, a menos que seja acompanhado do sufixo L, que representa um valor do tipo long. A diferença de um inteiro para um longo é a capacidade de dígitos que podem ser representados, conforme aparece no quadro abaixo. Valores numéricos em Java, representados como long: 2L decimal 077L um número que começa com zero está representado de forma octal 0xBABEL representação hexadecimal // Valores inteiros representáveis pelos tipos numéricos em Java: byte a = 127; // -27 ... 27 -1 short b = 32767; // -215 ... 215 -1 int c = 2147483647; // -231 ... 231 -1 long d = 9223372036854775807L; // -263 ... 263 –1 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 26 Tipos numéricos de ponto flutuante: float e double Um valor fracionário pode ser representado em Java através dos tipos float e double. A diferença entre esses dois tipos é o tamanho de bits: float 32 bits double 64 bits Para um número ser considerado do tipo ponto flutuante, é necessário a inc lusão de um ponto, do caractere E (de expoente) ou do sufixo D ou F, conforme mostra o quadro abaixo: // Representação de valores numéricos de ponto flutuante float pi = 3.141516F; float taxa = 15.02E23f; double salario = 22521.20D; // Quando não é definido o sufixo para um número decimal, o compilador entende que o tipo é double double valor= 122.4E+306; double valorX= 99.22; IMPORTANTE Todo o valor numérico de ponto flutuante é considerado do tipo double, a menos que o programador o declare explicitamente como float. 4.5 - Convenções de codificação Em geral, as linguagens de programação possuem convenções para definir os nomes das variáveis. Essas convenções ajudam o desenvolvimento de um código mais legível. Classes – as classes devem ser designadas por nomes, começando por uma letra maiúscula e depois minúsculas. Cada nova palavra que formar o nome da classe deve ser capitalizada. Ex: class Calculadora, class PessoaFisica e class CalculadoraCientifica Intefaces – igual às classes. Ex: interface Calculo e interface EquacaoLogaritmica. Métodos – métodos devem nomeados por verbos, seguindo o mesmo formato de capitalização das classes. Entretanto, um método sempre deve começar comletra minúscula. Ex: public void calcular(int numero), public void extrairRaiz(int numero), ... Constantes – constantes devem ter todas as suas letras em maiúsculo, com o símbolo de subscrito para separa as palavras. Ex: final int ANO = 2002, final boolean VERDADE = true, ... Variáveis – tal qual os métodos, as variáveis devem começar com uma letra minúscula e depois alternar a cada palavra. Procure usar nomes significativos para variáveis. Evite declarar variáveis usando apenas um a letra. JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 27 Mais Sobre Em geral, as linguagens de programação possuem convenções para definir os nomes das variáveis. Essas convenções ajudam o desenvolvimento de um código mais legível. Na convenção de nomes da linguagem Java, os nomes das variáveis devem seguir o padrão camel case com a primeira letra minúscula (lower camel case). Veja alguns exemplos: nomeDoCliente numeroDeAprovados A convenção de nomes da linguagem Java pode ser consultada na seguinte url: http://www. oracle.com/technetwork/java/codeconv-138413.html 4.6 Exercícios a) Altere o programa AloMundo.Java para que ele imprima na tela todos os tipos primitivos de dados suportados pela linguagem Java. b) Altere o programa AloMundo para que ele imprima os parâmetros recebidos pela linha de comando de execução do programa. (Dica: são os valores do array args: args[0], args[1], etc.) c) Crie um programa que receba três argumentos da linha de comando e imprima-os na mesma linha, em ordem inversa. Exemplo: java Programa a1 a2 a3 Saída: a3 a2 a1 JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 28 5 EXPRESSÕES Esta seção apresenta a manipulação de variáveis e implementação de tomada de decisões em programas Java. 5.1 Operadores lógicos e aritméticos Os operadores Java são similares em estilo e função aos operadores da linguagem C/C++. A tabela abaixo enumera esses operadores. Delimitadores . [] () ; , Servem para delimitar partes distintas de um comando, método ou classe. Operador Função ++ Incrementa o valor da variável em uma unidade. Exemplo: i++; contador++; -- Incrementa o valor da variável em uma unidade. Exemplo: i++; contador++; + - Operadores aritméticos * / % Multiplicação, divisão, resto << >> >>> Operadores de deslocamento aritmético e lógico == != Igualdade e desigualdade ^ Potência && AND || OR ?: Operador condicional. Exemplo: i=0; (i>2?i=0:i --); = *= %= += -= <<= >>= >>>= &= ^= |= Operadores aplicados sobre a atribuição. instance of Identificador de classes JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 29 5.2 Concatenação de Strings com o operador + Quando o operador + é aplicado a dados do tipo String, ele cria um novo dado do tipo String, concatenando os dois operandos. /** * Concatenação de Strings */ String sigla = "JOO"; String nome = "Java Orientado a Objetos"; String titulo = sigla + " - " + nome; // Esse comando imprimirá na tela a frase: // JOO – Java Orientado a Objetos System.out.println(titulo); int i = 10; String legenda = "valor = "; // campo é uma variável do tipo String String campo = legenda + i; Alguns métodos úteis em dados do tipo String: String curso = "Java Orientado a Objetos"; System.out.println("curso: " + curso); // Isolando um caractere: System.out.print("primeiro caractere: "); System.out.println(curso.charAt(0)); System.out.print("segundo caractere: "); System.out.println(curso.charAt(1)); // O primeiro caractere de uma String tem o // índice 0, o segundo o índice 1 e assim por diante // letra = 's'; char letra = curso.charAt(2); // substrings: System.out.print("primeiras cinco letras: "); System.out.println(curso.substring(0, 5)); System.out.print("letras a partir da quarta: "); System.out.println(curso.substring(4)); // número de caracteres em uma String: System.out.print("tamanho da frase: "); System.out.println(curso.length() + " letras"); // usando os caracteres de tabulação e quebra // de linha: System.out.println("" + curso.length() + " letras" + " \n" + " Nova linha\ttabulação" ); JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 30 5.3 Promoção e Casting A linguagem Java não suporta atribuições arbitrárias entre variáveis de tipos diferentes. Por exemplo, você não pode inicializar uma variável inteira com um valor de ponto flutuante sem explicitar isso através de um processo que chamamos de casting. Quando atribuímos um valor a uma variável, e esse valor é incompatível com o tipo de dado definido para a variável, ocorrerá uma conversão. Em alguns casos, essa conversão será automática, em outros o programador deve indicar de que forma o valor será convertido ao tipo de dado da variável. Quando o processo de conversão for automático, dizemos que ocorreu uma promoção, ou seja, um valor com um tipo de dado foi promovido a outro tipo de dado. Veja no exemplo abaixo: // // Promoção entre valores de tipos de dados distintos // Apesar 6 ser um inteiro, o valor da variável grande // continua sendo do tipo long long grande = 6; // Uma variável do tipo inteiro não possui // espaço para armazenar um valor longo. // A instrução abaixo é ilegal, e causará um erro de compilação. int pequeno = 99L; float a = 12.121F; // correto float b = 12.121; // 12.121 é um double - incorreto Como visto acima, algumas conversões não podem ser realizadas de forma automática, pois o compilador não pode assumir que tipo de conversão ele deve realizar (o tamanho do tipo de dado a ser recebido por uma variável é maior que o tamanho pré-definido para o tipo dessa variável, logo o compilador não sabe como "ajustar" os bits excedentes). Nesse caso, o programador deve indicar ao compilador que tipo de conversão deverá ocorrer, digitando o tipo de dado que o valor deverá assumir entre parênteses: // // Casting entre valores de tipos de dados distintos // // Apesar 6 ser um inteiro, o valor da variável grande // continua sendo do tipo long long grande = 6; int pequeno = (int)99L; // sem problemas float a = 12.121F; float b = (float)a; // sem problemas Abaixo estão relacionados todos os casts possíveis na linguagem Java, mostrando quando você quer converter de um valor para outro. A indicação Impl. quer dizer que aquele cast é implícito e automático, ou seja, você não precisa indicar o cast explicitamente. (lembrando que o tipo boolean não pode ser convertido para nenhum outro tipo). JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 31 5.4 Operadores de deslocamento (>>, <<, >>>) Java provê operadores para a manipulação dos bits em variáveis de tipo numérico: o deslocamento aritmético >> e o deslocamento lógico >>>. O operador de deslocamento aritmético >> executa um deslocamento de um bit para a direita de um número (na prática, o primeiro argumento desse operador é dividido por dois 'n' vezes – onde n é o segundo argumento do operador): 8 >> 2 = 2 128 >> 1 = 64 256 >> 4 = 16 * Notação em complemento de dois: o operador >> mantém o sinal do bit mais significativo duranteo deslocamento. O operador de deslocamento lógico >>> executa um deslocamento no padrão dos bits ao invés do significado aritmético de um valor numérico. Esse operador sempre adiciona o valor 0 ao bit mais significativo: 1010 ... >> 2 = 111010 ... 1010 ... >>> 2 = 001010 ... * Os operadores de deslocamento reduzem seus operandos à direita módulo 32 para um valor do tipo int e módulo 64 para um tipo long. Dessa forma, para qualquer valor do tipo int: int x x >>> 32 = x O operador de deslocamento lógico >>> só pode ser aplicado a valores inteiros, e não é efetivo em valores int e long. Se for aplicado a valor short ou byte, o valor será promovido a um int antes da aplicação do operador. Por isso, um deslocamento sem sinal acaba se tornando um deslocamento com sinal 5.5 Circuitos lógicos Java possui três operadores básicos para implementar circuitos lógicos: NOT: operador ! Pág. 5 EXPRESSÕES JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 32 AND: operador && OR: operador || Esses operadores permitem a representação de expressões booleanas, que formam o argumento para comandos de decisão (IF), seguindo a seguinte tabela: AND: OR: true && true = true; true || true = true; true && false = false; true || false = true; false && true = false; false || true = true; false && false = false; false || false = false; !true = false; !false = true; !(a && b) = !a || !b !(a || b) = !a && !b 5.6 Exercícios a) Implemente um programa para calcular a área de um trapézio, onde: h = altura b = base menor B = base maior Área = (h . (b + B)) / 2 b) Faça o programa acima calcular utilizando valores de ponto flutuante e depois imprima na tela duas informações: Valor exato da área: Valor arredondado para inteiro: c) Calcule o valor das seguintes equações: a. 3 – 2 – 1 + 2 + 1 + 3 b. 2 * 3 – 4 * 5 c. 2 + 6 – 3 / 7 * 9 d. 3 % 4 – 8 d) Indique qual o valor verdade das seguintes expressões: a. (1 > 2) // exemplo: false b. (8 == 8) // exemplo: true c. ((12 – 5) > 6) d. (0 < 3) && (8 < 9) e. ((i++) > i) f. ((10 * 90 / 50 – 2) == 16) Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 33 6 FLUXO DE CONTROLE Esta seção demonstra como implementar tomada de decisões em códigos Java. 6.1 Ramificação if, else A sintaxe básica para declarações if, else é a seguinte: if (expressão_booleana) { // bloco de comandos } else { // bloco alternativo de comandos } Exemplo: /** * Usando if, else */ int maior = 10; int menor = 5; if (maior > menor) { // (10 > 5) = true System.out.println(maior + ">" + menor); } else { // (10 > 5) != true System.out.println(menor + ">" + maior); } // Lembre-se que o controle de fluxo é feito através // do valor verdade de uma expressão booleana boolean verdade = (10 > 5); if (verdade) { // (10 > 5) = true System.out.println(maior + ">" + menor); } Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 34 else { // (10 > 5) != true System.out.println(menor + ">" + maior); } 6.2 Ramificação switch Switch é uma declaração semelhante ao if, mas que usa valores inteiros para a tomada de decisões ao invés de expressões booleanas. (só pode ser usada em dados dos tipos short, int, byte ou char). Se o tipo de dado não for inteiro, o comando switch irá executar uma promoção desse valor ao tipo int para somente depois executar a ramificação. A sintaxe básica para declarações switch é a seguinte: Switch ((int)expressão) { // bloco de comandos case ((int) valor_1): // bloco de comandos break; case ((int) valor_2): // bloco de comandos break; default : // bloco de comandos padrão. // Se nenhum dos valores acima corresponder à // expressão definida no comando switch, então // o programa executará o trecho default. // o trecho default é opcional. break; } Exemplo: /** * Usando switch */ // Considere valorDoTeclado() como um número // inteiro digitado pelo usuário int valor = valorDoTeclado(); switch (valor) { case 0: Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 35 System.out.println("cadastro de produto"); break; case 1: System.out.println("emitir nota fiscal"); break; case 2: System.out.println("cancelar compra"); break; default: System.out.println("efetuar venda"); break; } 6.3 Repetição for A declaração for é utilizada para definir que um bloco de comandos deve ser executado 'n' vezes, onde 'n' é um número inteiro. A sintaxe do comando for é a seguinte: for (int i = 0; i < 10; i++) { // bloco de comandos } Exemplo: /** * repetição de comandos usando FOR */ // Calculando o fatorial de um número: int numero = 10; int fatorial = 1; for (int i = numero; i > 0; i--) { fatorial = fatorial * i; } System.out.println("fatorial de " + numero + " = " + fatorial); // Imprimindo os dias do ano: for (int mes = 1; mes < 12; mes++) { switch (mes) { case 1: System.out.println("janeiro"); break; case 2: System.out.println("março"); break; case 3: System.out.println("abril"); break; // escreva aqui os demais comandos Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 36 } } 6.4 Repetição while A declaração while é utilizada para definir que um bloco de comandos e deve ser executado enquanto uma expressão booleana (condição de parada) não seja verdade. A sintaxe do comando while é a seguinte: While (expressão_booleana) { // bloco de comandos executados enquanto a // expressão boolena tiver valor verdade = true } ou do { // bloco de comandos executados pelo menos uma vez } While (expressão_booleana); Exemplo: public static void main(String[] args) { /** * repetição de comandos usando FOR */ // Calculando o fatorial de um número: int numero = 10; int fatorial = 1; int i = numero; while (i > 0) { fatorial = fatorial * i; i--; } System.out.println("O fatorial de " + numero + " = " + fatorial); // Lendo a condição de parada do teclado: numero = 0; while (numero < 10) { System.out.println("Digite um número: "); numero = valorDoTeclado(); } Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 37 System.out.println("O usuário digitou um número maior que 10"); } 6.5 Comandos especiais de controle de fluxo: break, continue e label Os comandos de repetição em Java suportam dois tipos de desvios: o break e o continue. O break faz com que um laço seja interrompido, enquanto o continue é usado para "pular" uma execução e continuar a partir da próxima. Exemplo: // pulando a execução No 10 e parando na No 15 for (int i=0; i<20; i++) { if(i== 10) { continue; } else if(i == 15) { break; } System.out.println("contador: " + i); } Além disso, esse desvio pode ser direcionado, ou seja, o programador pode indicar para qual linha do código a execução do programa deve ser desviada (uma espécie de GOTO em Java). Essa prática é altamente desaconselhada, e foi mantida no Java por motivos de compatibilidade com a linguagem C. Um label em Java só pode ser usado para identificar um comando for, while ou do. Exemplo: desvio: for (int i=0; i<20; i++) { if(i == 10) { continue desvio; } else if(i == 15) { // Essa linha nunca será executada // pois o laço sempre será reiniciado // quando o valor de i for igual a 10 break desvio; } System.out.println("contador: " + i); } Pág. 6 FLUXO DE CONTROLE JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 38 6.6 Lendo valores do teclado Nem sempre é necessário fazer entrada byte a byte. Nestes casos, normalmente, é mais simples utilizar a classe Scanner do pacote java.util do Java. Essa classe possui métodos mais sofisticados para obter os dados de uma entrada. // Criando objeto de entrada de dados InputStream entrada = System.in; Scanner scanner = new Scanner (entrada) ; // Realizando a leitura String linha = scanner.nextLine () ; // Imprimindo a informação lida System.out.println(linha); 6.7 Exercícios 1. Escreva um programa que imprima na tela a soma dos números ímpares entre 0 e 20 e a multiplicação dos números pares entre 0 e 20. 2. Faça um programa para ler um número do teclado e imprimir na tela se ele é par ou ímpar. 3. O valor pago por um Hotel da Praia de Iracema para seus porteiros é de R$ 10,25 por hora de trabalho. Faça um programa que pergunte ao usuário quantas horas ele trabalhou e imprima na tela o valor do salário a ser recebido por ele. 4. Modifique o programa anterior para que o sistema imprima uma mensagem de alerta quando o valor a ser pago ao funcionário seja inferior a R$ 50,00: "Atenção, dirija-se à direção do Hotel!". 5. Sabendo que na LogusTI a média mínima é 7,0 e a tolerância de faltas é 15 % da carga horária do curso, faça uma classe com o método main que peça as informações necessárias e informe a situação do usuário. 6. Implemente uma classe java “Calculos” com um método”calcularMedia” que receba três números e calcule a média e imprima na tela essa média. O método “calcularMaior”, deverá receber também três números e retornar o maior número e o método “calcularMenor”, deverá receber três números e retornar o melhor número. Implemente a classe com o método main e instancie a classe Calculos executando todos os seus métodos. 7. Construa uma classe que peça o Nome, Endereço, Sexo, Cidade, Estado, Idade dos funcionários. Além disto, dado o Salário Bruto do funcionário, calcule o seu Salário Líquido. Considere que os descontos podem ser o Vale Transporte (2%), Vale Alimentação (5%) e Plano de Saúde (10%). Pág. 7 AGRUPAMENTO DE DADOS (ARRAYS) JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 39 7 AGRUPAMENTO DE DADOS (ARRAYS) Nesta seção analisaremos o agrupamento de dados, uma estrutura simples mas essencial para a compreensão de como Java manipula dados na memória. 7.1 Declarando e criando Arrays Suponha que o sistema do banco tenha que gerar listas com os números das contas de uma agência. Poderíamos declarar uma variável para cada número int numero1; int numero2; int numero3; Contudo, não seria uma abordagem prática, pois uma agência pode ter uma quantidade muito grande de contas. Além disso, novas contas podem ser abertas todos os dias. Isso implicaria em alterações constantes no código fonte. Quando desejamos armazenar uma grande quantidade de valores de um determinado tipo, po-demos utilizar arrays. Um array é um objeto que pode armazenar muitos valores de um determinado tipo. Podemos imaginar um array como sendo um armário com um determinado número de gavetas. E cada gaveta possui um rótulo com um número de identificação. Arrays são tipos indexados de dados que permitem a representação de agrupamento de dados como vetores e matrizes. Pág. 7 AGRUPAMENTO DE DADOS (ARRAYS) JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 40 Podemos declarar arrays de qualquer tipo de dado suportado em Java (primitivo ou agregado – tipos agregados de dados serão discutidos posteriormente). Essa declaração é feita pela adição do símbolo [] a um tipo de dado, que pode aparecer antes ou após o identificador da variável: char[] arrayDeCaracteres; String[] arrayDePalavras; Ponto[] arrayDeObjetosDoTipoPonto; int números[]; Na memória, um array é um agrupamento de dados, indexados pelo tamanho do tipo de dado que o array suporta: O primeiro índice de um array é sempre 0, e o último índice é o N-1, onde N é o número de elementos do array. IMPORTANTE Apesar da posição do símbolo [] poder ser no início ou no final do nome da variável, é fortemente recomendado que você sempre aplique o [] após o tipo da variável. Isso torna o código muito mais legível. Para criar um array, usamos a palavra chave new: int[] números = new int[50]; A quantidade de elementos de um array sempre deve ser um valor inteiro. O comprimento de um array é dado pelo método length: // Imprimindo o comprimento de um array char [] alfabeto = new char[24]; int tamanhoDoAlfabeto = alfabeto.length; System.out.println("alfabeto com " + tamanhoDoAlfabeto " letras"); IMPORTANTE Um array de 10 elementos tem os índices de 0 a 9. Pág. 7 AGRUPAMENTO DE DADOS (ARRAYS) JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 41 7.2 Modificando o conteúdo de um array Para modificar o conteúdo de um array, devemos escolher uma ou mais posições que devem ser alteradas e utilizar a sintaxe abaixo: int [] numeros = new int [100]; numeros [0] = 136; numeros [99] = 17; IMPORTANTE Quando um array é criado com o comando new, todas as posições são inicializadas com os valores padrão (números são inicializados com 0, booleanos com false e referências com null). Também podemos definir os valores de cada posição de um array no momento da sua criação utilizando as sintaxes abaixo: int [] numeros1 = new int []{100 ,87}; int [] numeros2 = {100 ,87}; 7.3 Acessando o conteúdo de um array Para acessar o conteúdo de um array, devemos escolher uma ou mais posições e utilizar a sintaxe abaixo: int [] numeros1 = new int []{100 ,87}; int [] numeros2 = {100 ,87}; System.out.println(numeros2[0]); System.out.println(numeros1[1]); IMPORTANTE Acessar posições fora do intervalo de índices de um array gera erro de execução. Mais especificamente, em Java, ocorrerá a exception ArrayIndexOutOfBoundsException. Pág. 7 AGRUPAMENTO DE DADOS (ARRAYS) JAVA OO LOGUSTI – TREINAMENTO EM INFORMÁTICA PÁGINA 42 7.4 Percorrendo um Array Quando trabalhamos com um array, uma das tarefas mais comuns é acessarmos todas ou algumas de suas posições sistematicamente. Geralmente, fazemos isso para resgatar todos ou alguns dos valores armazenados e realizar algum processamento sobre tais informações.