Baixe o app para aproveitar ainda mais
Prévia do material em texto
J AVA francisco calaça otávio calaça Guia para iniciantes 2013 – Versão 1.2-beta L I C E N Ç A Esta apostila é disponibilizada sob os termos da licença Creative Commons - Attribution- NonCommercial-NoDerivs 3.0 Unported. Isto quer dizer que VOCÊ PODE: • Copiar este material de forma não comercial; • Redistribuir este material de forma não comercial; • Imprimir este material de forma não comercial; Esta licença também quer dizer que você VOCÊ NÃO PODE: • Vender este material a terceiros; • Alterar este material; Qualquer uso indevido deste material, venda ou alteração estarão sugeitos às penas pre- vistas na Lei Federal No 9.610, de 19 de fevereiro 1998. Mais detalhes sobre esta licença bem como seu conteúdo original pode ser acessado em: http://creativecommons.org/licenses/by-nc-nd/3.0/legalcode Bons estudos. . . iii C O L A B O R E C O M E S TA A P O S T I L A Precisamos de colaboradores para melhorar esta apostila. Se você deseja entrar para nosso time, mande um email para apostila-java@googlegroups.com com o título: DESEJO COLABORAR COM A APOSTILA DE JAVA. Responderemos a você com informações sobre o que ainda é necessário fazer. Nas próximas versões, você verá seu nome adicionado na lista de colaboradores e poderá se gabar, mostrando isto ao seus amigos. Colabore ! Colaboradores • Francisco Calaça Xavier • Otávio Calaça Xavier • Edicarlos Pimenta Gonçalves • Deuslirio Junior v C O N T E Ú D O 1 introdução 1 1.1 Algoritmos 1 1.2 Lógica binária 1 1.3 Nascimento da ciência da computação 2 1.4 Java 2 2 preparação do ambiente de estudos 5 2.1 Padronização do ambiente de trabalho 5 2.2 Primeiros testes no ambiente de trabalho 6 2.3 Exercícios 7 3 lógica de programação em java 9 3.1 Fluxograma 9 3.2 Para entender os programas criados a partir de agora 10 3.2.1 Informações iniciais 10 3.3 Strings 11 3.4 Saída Formatada 12 3.5 Conceito de Variável 13 3.6 Palavras reservadas e identificadores 14 3.7 Tipos Primitivos 15 3.7.1 Tipos primitivos inteiros 15 3.7.2 Tipos primitivos de ponto flutuante 15 3.7.3 Tipo primitivo char 16 3.7.4 Tipo primitivo boolean 16 3.7.5 Conversões de variáveis 17 3.8 Operadores 17 3.8.1 Aritméticos 17 3.8.2 Atribuição 18 3.8.3 Incremento/Decremento 19 3.8.4 Relacionais 20 3.8.5 Lógicos 20 3.9 Estruturas de seleção 22 3.9.1 if . . . else 22 3.9.2 Operador condicional ou ternário 24 3.9.3 switch 25 3.10 Estruturas de Repetição 26 3.10.1 for 26 3.10.2 while 27 3.10.3 do . . . while 28 3.11 Exercícios 28 4 introdução à orientação a objetos 31 4.1 O conceitos Classe e Objeto 31 4.2 Elementos de uma classe 32 vii Versão 1.2-beta conteúdo4.2.1 Atributos 32 4.2.2 Métodos 33 4.2.3 Métodos construtores 34 4.2.4 Padrões de nomenclatura 35 4.3 Atributos e métodos static 36 4.3.1 Import static 37 4.4 Tipos Wrapper 38 4.4.1 Auto-boxing e Auto-unboxing 38 4.5 Regras de escopo 39 4.6 Sobrecarga de métodos 40 4.7 Exercícios 41 5 arrays 43 5.1 O que são arrays 43 5.2 Declaração e inicialização de arrays 44 5.3 Método main 46 5.4 Laço for aprimorado 48 5.5 Passagem de parâmetros no Java 48 5.6 Arrays multidimensionais 51 5.7 Lista de parâmetros com comprimento variável 51 5.8 Exercícios 52 6 um pouco mais de orientação a objetos 53 6.1 Coletor de lixo 53 6.2 A palavra-chave this 54 6.3 Variáveis do tipo final 56 6.4 Encapsulamento 56 6.5 Enumerações 59 6.6 Pacotes 59 6.6.1 Como usar tipos dentro de outros pacotes 61 6.7 Herança 62 6.7.1 Um exemplo de Herança 62 6.7.2 Sobrescrita de métodos 64 6.7.3 A palavra-chave super 64 6.8 Alguns Modificadores de acesso 64 6.8.1 private 64 6.8.2 pacote 64 6.8.3 protected 65 6.8.4 public 65 6.9 Classe object 65 6.9.1 método equals() 65 6.9.2 método toString() 66 6.10 Polimorfismo 67 6.10.1 Abstração 67 6.10.2 Exemplo de Polimorfismo 68 6.11 Conversão e casting 71 6.11.1 A palavra-chave instanceof 72 6.12 Métodos e classe do tipo final 72 viii http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta conteúdo 6.13 Interfaces 73 6.13.1 Interfaces em Java 73 6.14 Exercícios 75 7 tratamento de exceções 77 7.1 O que são exceções 77 7.2 Como tratar exceções 77 7.2.1 O bloco try 77 7.2.2 O bloco catch 78 7.3 Exceções checadas e exceções não checadas 80 7.4 Como declarar novos tipos de exceções 80 7.5 Como lançar exceções 81 7.6 Hierarquia das exceções 82 7.7 Exercícios 83 8 fluxo de dados 85 8.1 A classe File 85 8.2 Como escrever em arquivos 85 8.3 Como ler arquivos 86 8.4 Um editor de texto simples 87 8.5 Serialização de objetos 89 8.6 Um trocador de mensagens simples 90 8.7 Exercícios 93 9 genéricos e coleções 95 9.1 o que são genéricos 95 9.2 Introdução a coleções 97 9.3 Listas 97 9.4 Conjuntos 99 9.5 Mapas 99 9.5.1 Properties 101 9.6 Pilhas 103 9.7 Filas 104 9.8 Ordenação de Listas 104 9.9 Exercícios 106 10 uml : unified modeling language 109 10.1 Diagrama de Classe 109 10.1.1 Classe 109 10.1.2 Associações de Classe 110 10.2 Diagrama de Caso de Uso 112 10.2.1 Caso de Uso 112 10.2.2 Ator 113 10.2.3 Descrição do Caso de Uso 113 10.3 Demais diagramas 113 11 threads 115 11.1 Processos e Threads 115 11.1.1 Processos 115 11.1.2 Threads 115 11.2 Criação de Threads 116 http://solutioin.com Francisco Calaça, Otávio Calaça ix Versão 1.2-beta conteúdo 11.3 A classe Executors 117 11.4 Métodos sleep e yield 118 11.5 Sincronização 118 11.6 O verificador de primos 121 11.7 Exercícios 123 12 strings e datas 125 12.1 As classes Date e Calendar 125 12.2 Formatação de Datas 126 12.3 A classe String 127 12.4 A classe StringBuffer 127 12.5 Saída formatada 128 12.5.1 Caracteres de conversão 128 12.6 Exercícios 130 13 jdbc 133 13.1 Conexão com banco de dados 133 13.2 A linguagem SQL 135 13.2.1 SELECT 135 13.2.2 Cláusula WHERE 135 13.2.3 O Operador LIKE 135 13.2.4 INSERT 136 13.2.5 UPDATE 136 13.2.6 DELETE 136 13.3 Como executar instruções SQL e obter registros 136 13.3.1 PreparedStatement 138 13.4 Execução em Lote 138 13.5 Tabela de Clientes 140 13.6 Exercícios 143 14 java persistence api com hibernate 145 14.1 Mapeamento objeto relacional 145 14.2 Configurações iniciais 145 14.3 A criação do primeiro exemplo 146 14.4 O arquivo persistence.xml 148 14.5 O EntityManager 150 14.6 A inclusão de clientes com JPA 151 14.6.1 Persistindo entidades 151 14.6.2 Localizando entidades 152 14.6.3 Removendo entidades 152 14.6.4 Mesclando entidades 152 14.7 Relacionamento entre classes 152 14.8 Formas de obtenção de id’s 155 14.9 JPQL - A linguagem consulta da Jpa 156 14.9.1 Passagem de parâmetros 156 14.10Exercícios 157 15 aplicativos web 159 15.1 XML 159 15.2 HTML 160 x http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta conteúdo 15.2.1 A estrutura básica de um documento HTML 160 15.2.2 Outras tags HTML 161 15.3 JavaScript 162 15.4 CSS 163 15.5 Aplicativos Web com Java 165 15.5.1 Instalação do Tomcat 165 15.6 Exercícios 166 16 servlets 167 16.1 Estrutura de uma aplicação web Java 167 16.2 Construindo o primeiro Servlet 167 16.3 Como fazer no eclipse 169 16.4 Atendendo requisições com o método get 170 16.5 Atendendo requisições com o método post 176 16.6 Redirect 177 16.7 Forward 179 16.8 Escopo de objetos web 180 16.8.1 Request 180 16.8.2 Session 181 16.8.3 Application 181 16.9 Como distribuir uma aplicação web 181 16.10Exercícios 182 17 java server pages 183 17.1 Elementos do Jsp 183 17.1.1 Scriptlet 183 17.1.2 Expressões 184 17.1.3 Declarações 185 17.2 Diretivas 185 17.2.1 Diretiva include 185 17.2.2 Diretiva Page 186 17.3 Ações do JSP 188 17.4 Biblioteca de tags JSTL 188 17.4.1 EL - Expressão de Linguagem 189 17.5 MVC - Model View Control 190 17.5.1 O cadastro de clientes 190 17.6 Exercícios 19218 introdução ao javaserver faces 193 18.1 Fazendo JavaServer Faces funcionar 193 18.2 Managed bean 193 18.3 Tags básicas 197 18.3.1 Tags JSF para renderização de HTML 197 18.3.2 Tags Core do JSF 197 18.3.3 Exemplo de uso das Tags 197 18.4 Expressões de Ligação - EL 199 18.4.1 Ligações com atributos 200 18.4.2 Ligações com métodos 200 18.5 Configurar o Primefaces 201 http://solutioin.com Francisco Calaça, Otávio Calaça xi Versão 1.2-beta conteúdo 18.6 Cadastro de Clientes 202 18.7 Cadastro de Produtos (com JPA) 205 18.8 Conversores 212 18.8.1 Conversores personalizados 212 18.9 Exercícios 215 19 padrões de projeto 217 19.1 Padrões GoF 217 19.2 Abstract Factory 218 19.2.1 Utilização 219 19.3 Factory Method 219 19.3.1 Utilização 219 19.3.2 Command 220 19.3.3 Problema 220 19.3.4 Aplicação 221 19.4 Data Access Object (DAO) 221 19.4.1 Vantagens 221 19.5 MVC 222 19.5.1 Componentes 222 19.5.2 Justificativa 222 a montagem do ambiente de trabalho 223 a.1 Obtenção e instalação do JDK 223 a.2 O que é a Máquina virtual Java 223 a.3 Obtenção e instalação do eclipse 223 b erros comuns enfrentados por iniciantes 225 b.1 Exceções que costumam serem vistas 225 b.1.1 ClassNotFoundException 225 b.1.2 NoSuchMethodError 225 b.1.3 LazyInitializationException 225 b.1.4 NoClassDefFoundError 225 b.1.5 NullPointerException 225 b.1.6 ClassCastException 225 b.2 Erros comuns do HTTP 225 xii http://solutioin.com Francisco Calaça, Otávio Calaça 1 I N T R O D U Ç Ã O A computação pode ser definida como a busca de uma solução para um problema, a partir de entradas (inputs), e através de um algoritmo. É com isto que lida a teoria da computação, subcampo da ciência da computação e da matemática. Durante milhares de anos, a com- putação foi executada com caneta e papel, ou com giz e ardósia, ou mentalmente, por vezes com o auxílio de tabelas, ou utensílios artesanais. A primeira ferramenta conhecida para a computação foi o ábaco, inventado na Mesopotâmia em torno de 2400 a.C. Sua versão original consistia em desenhar linhas na areia com rochas. Os ábacos ainda são usadas como instrumento de cálculo hoje. 1.1. Algoritmos O matemático indiano Brahmagupta foi o primeiro a descrever o sistema de numeração hindu-arábico, no século VII. Nesta época, aparecem os primeiros relatos de utilização do número 0. Por volta de 820, o matemático persa Al-Khwarizmi escreveu o livro Calcu- lando com Numerais Hindus. Este matemático foi responsável pela difusão do sistema de numeração hindu-arábico no Oriente Médio, e posteriormente na Europa. No século XII começaram traduzir este livro para o latim: Algoritmi de numero Indorum. Tais livros apresentaram novos conceitos para definir sequências de passos para completar tarefas (definição de algorítimos), como aplicações de aritmética e álgebra. Por derivação do nome, atualmente usa-se o termo algorítmo. 1.2. Lógica binária O matemático indiano Pingala inventou o sistema de numeração binário por volta do século III a.C. Este sistema de numeração ainda é utilizado atualmente no processamento de to- dos computadores, o sistema estabelece que sequências de uns e zeros podem representar qualquer número. Fisicamente estas sequências são substituidas pelos estados ligado e desligado. George Boole, em 1854, publicou a álgebra booleana com um sistema completo que per- mitia a construção de modelos matemáticos para o processamento computacional. Em 1801 apareceu o tear controlado por cartão perfurado, invenção de Joseph Marie Jacquard. Neste tear os buracos indicavam os uns, e áreas não furadas indicavam os zeros. O sistema ainda não pode ser considerado um computador, mas demonstrou que as máquinas poderiam ser controladas pelo sistema binário. 1 Versão 1.2-beta introdução 1.3. Nascimento da ciência da computação Antes da década de 1920, computador era um termo associado a pessoas que realizavam cálculos, geralmente físicos e matemáticos. Milhares de computadores, em sua maioria mul- heres, eram empregados em projetos no comércio, governo e pesquisa. Após a década de 1920, a expressão máquina computacional começou a ser usada para referir-se a qualquer máquina que realize o trabalho de um profissional computador. No final da década de 1940 o termo máquina computacional perdeu espaço para o termo computador. As máquinas digitais estavam cada vez mais difundidas. Alan Turing, um dos pioneiros da Ciência da Computação, inventou a Máquina de Turing, que posteriormente evoluiu para o computador moderno. Em 1930 os engenheiros eletricistas já podiam construir circuitos eletrônicos para resolver problemas lógicos e matemáticos, mas a maioria o fazia sem qualquer processo, de forma particular, sem rigor teórico, ou qualquer estudo ou padronização. Isso mudou com a tese de mestrado de Claude E. Shannon de 1937, A Symbolic Analysis of Relay and Switching Circuits. Enquanto tomava aulas de Filosofia, Shannon foi exposto ao trabalho de George Boole, e percebeu que tal conceito poderia ser aplicado em conjuntos eletro-mecânicos para resolver problemas de lógica. Tal idéia, que utiliza propriedades de circuitos eletrônicos para a lógica, é o conceito básico de todos os computadores digitais. Shannon desenvolveu a teoria da informação no artigo de 1948 A Mathematical Theory of Communication, cujo conteúdo serve como fundamento para áreas de estudo como compressão de dados e crip- tografia. 1.4. Java A linguagem de programação orientada a objetos Java foi criada em 1991 pelo engenheiro James Gosling, da Sun, e anunciada em 1995. O projeto da sua criação surgiu num contexto de um outro projeto, em que certos problemas da linguagem C++, como, por exemplo, a falta de funcionalidades do ’garbage collection’, levaram a optar pela criação de uma nova linguagem, então denominada Oak (palavra inglesa para as árvores da família Quercus, como o carvalho) em "homenagem" à árvore que se encontrava plantada do lado de fora do escritório de James Gosling. Em 1994 esta linguagem foi renomeada para Java porque, após uma pesquisa de marcas, foi descoberta que já existia uma linguagem de computador denominada Oak. Desta forma, em 1996 o Java 1.0 foi finalmente apresentado à comunidade. Em 2009, a Oracle adquire a Sun Microsystems e tornou-se a detentora dos direitos e da marca Java. As especificações da linguagem Java são mantidas uniformes através de um processo comunitário gerido pela Sun Microsystems, o JCP (Java Community Process). Fazem parte do JCP várias empresas como a Oracle, Google, IBM, Nokia dentre outras. Para mais infor- mações sobre o JCP acesse o site http://jcp.org. As características principais da linguagem Java são: • é orientada a objetos; 2 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução • é independente de plataforma; • integra mecanismos e bibliotecas de funções para programação distribuída; • foi projetada para executar código remotamente sem perda de segurança. http://solutioin.com Francisco Calaça, Otávio Calaça 3 2 P R E PA R A Ç Ã O D O A M B I E N T E D E E S T U D O S Neste capítulo você montrará seu ambiente de estudos Java. A sua principal ferramenta é o JDK (Java Development Kit). Esta sigla significa: “Kit de Desenvolvimento Java”. O JDK contém uma vasta quantidade de aplicativos necessários para resolver problemas do dia a dia do desenvolvimento Java. Outra ferramenta importante é a IDE (Integrated Development Environment). Esta sigla significa: “Ambiente de desenvolvimento integrado”. Trata-se de uma ferramenta que con- tém vários recursos, necessários para a construção eficiente de um software. Hoje é possível encontrar diversas IDE’s para desenvolvimento em Java. Dentre elas estão o Eclipse1 e o NetBeans2, que são ide’s Open Source e que contam com colabração de grandes comunidades e empresas ao redor do mundo. Os exemplosdeste livro serão feitos utilizando o Eclipse. Apesar disto, nada impede você de instalar o netbeans e também testar estes exemplos nele. 2.1. Padronização do ambiente de trabalho É muito importante ter um ambiente de trabalho organizado e padronizado para prossegui- mento dos estudos. Esta padronização te ajudará a encontrar dependências, aplicativos e exemplos e está ilustrada na Figura 2.1. Onde em: • Aplicativos: contém os aplicativos utilizados no desenvolvimento de software. Exem- plo: JDK, eclipse, etc. • Material: contém bibliotecas, tutoriais, etc • Projetos: contém os seus projetos criados no decorrer da sua aprendizagem. 1 http://www.eclipse.org 2 http://www.netbeans.org Figura 2.1: Padronização do ambiente de trabalho utilizada 5 Versão 1.2-beta preparação do ambiente de estudos Se você quiser, pode baixar um arquivo compactado contendo esta estrutura já montada. Este arquivo pode ser obtido no site http://solutioin.com/java. Após ter realizado o download no seu computador, descompacte o arquivo em algum lugar de sua preferência e pronto! Você já está apto para começar os estudos em Java. Bons estudos! Dica: Se você ficou curioso em como este ambiente foi montado, acesse o Apêncie A que saberá como. 2.2. Primeiros testes no ambiente de trabalho Primeiro, inicialize o eclipse. Isto pode ser feito executando o programa eclipse (Linux) ou eclipse.exe (Windows) da pasta eclipse, dentro da pasta Aplicativos da estrutura baixada. Com o eclipse inicializado, crie um novo projeto Java. Depois crie uma classe. Será a primeira classe criada neste curso. O objetivo é que você entenda como funciona um pro- grama bem simples em Java. O código deste exemplo inicial está apresentado na Listagem 2.1. Esta classe, após executada, gera a saída no console: Veja como é fácil Listagem 2.1: Exemplo do primeiro Programa 1 public class PrimeiroPrograma { 2 public static void main(String[] args) { 3 System.out.println("Veja como é fácil"); 4 } 5 } No momento, não se preocupe com as instruções desta classe. O que você deve entender agora é que o comando da linha 3 imprime no console o texto que se encontra entre aspas. Outra forma de apresentar texto para o usuário está ilustrada no código da Listagem 2.2. Observe, que após executar este código, a mensagem é apresentada em uma janela, conforme ilustrado na Figura 2.2. Listagem 2.2: Exemplo de apresentação de mensagem 1 import javax.swing.JOptionPane; 2 3 public class SegundoPrograma { 4 public static void main(String[] args) { 5 JOptionPane.showMessageDialog(null, "Olá, como vai ?"); 6 } 7 } Para um terceiro exemplo, será apresentado um código que faz a leitura de informações teclado. Isto será bastante útil nesta primeira fase do curso, onde estamos estudando os elementos iniciais da programação. A Listagem 2.3 exemplifica uma das formas de se obter informações do usuário. 6 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta preparação do ambiente de estudos Figura 2.2: Saída apresentada pelo segundo programa Listagem 2.3: Exemplo de apresentação de mensagem 1 import javax.swing.JOptionPane; 2 3 public class TerceiroPrograma { 4 public static void main(String[] args) { 5 String texto = JOptionPane.showInputDialog("Digite um texto:"); 6 System.out.println("Texto digitado: " + texto); 7 } 8 } Alguns dos códigos aqui descritos e mais informações sobre este assunto pode ser obtido em: http://solutioin.com/java Acesse e verifique! 2.3. Exercícios 1. Crie uma classe que apresente no console a seguinte mensagem: “Meu primeiro código Java”. 2. Crie uma classe que apresente em uma janela a mensagem: “Estou ficando bom nisto”. 3. Crie uma classe que solicite ao usuário as seguintes informações: nome, endereço e telefone. Após o usuário ter digitado estas informações, apresente em uma janela. http://solutioin.com Francisco Calaça, Otávio Calaça 7 3 L Ó G I C A D E P R O G R A M A Ç Ã O E M J AVA Todo programa é constituído por uma sequência lógica de passos que executará tarefas necessárias para a solução do problema a que o programa se propõem. Neste capítulo, serão apresentados os passos necessários para construção de um pro- grama simples em Java. 3.1. Fluxograma Fluxograma é uma representação esquemática do processo. Ilustra graficamente a transição de informações ao longo da execução deste processo. É útil para compreensão de controle de fluxo quando o algoritmo é complexo ou extenso. A Figura 3.1 ilustra um fluxograma. Observe que cada ação é representada por um retân- gulo. O losango representa uma tomada de decisão. As elípses representam o início e o fim do processo. Figura 3.1: Exemplo de fluxograma 9 Versão 1.2-beta lógica de programação em java 3.2. Para entender os programas criados a par- tir de agora 3.2.1 Informações iniciais Para que haja um completo entendimento inicial nos programas que faremos neste capítulo, é importante apresentar alguns conceitos. 3.2.1.1 Pacote java.lang Não é necessário importar o pacote java.lang, ou seja, todas as classes deste pacote estão acessíveis sem a necessidade de que seja feito qualquer import. Algumas destas classes são: System, String, Integer, Double, Character, etc. 3.2.1.2 Nomeclatura dos métodos e das classes Java utiliza um padrão de escrita chamado CamelCase1. • nomes de classes iniciam com letras maiúsculas e o restante das letras são minúsculas. Exemplo: PrimeiraClasse, PessoaFisica, etc. • nomes de métodos iniciam com letras minúsculas. Uma nova palavra no nome inicia com letra maiúscula (sem o caracter sublinhado _). Exemplo: realizarAcao(), fazer- Algo(), etc. 3.2.1.3 Método main Todo aplicativo Java inicia sua execução pelo método main. A única forma de escrever esta assinatura é: public static void main(String [] args) O significado de cada uma destas palavras será descrito posteriormente. É necessário que o leitor apenas utilize esta assinatura como está. 3.2.1.4 Case sensitive Em Java existe diferença entre letras maiúsculas e minúsculas. Assim, os identificadores teste, Teste e TesTe são todos diferentes. 1 CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços. É um padrão largamente utilizado em diversas linguagens de programação, como Java, Ruby, PHP e Python, principalmente nas definições de Classes e Ob- jetos. Exemplo: iPod, GameCube, OpenOffice.org, CamelCase, dataNascimento, enderecoEntregaMercadoria, ItemPedido. 10 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java 3.2.1.5 Nome da classe é o nome do arquivo Todo código Java deve ser escrito dentro de classes. O nome da classe deve ser o mesmo nome do arquivo. Isto não é uma regra, mas evitará alguns problemas. Posteriormente será apresentado mais detalhes sobre este assunto. 3.2.1.6 Outras observações Após cada instrução deve ser colocado um ponto-vírgula (;). Em Java as funções são chamadas de métodos. As variáveis declaradas fora dos métodos são chamadas de atributos ou variáveis de classe. 3.2.1.7 Comentários Existem três tipos de comentários em Java, conforme apresentado na Listagem 3.1. Listagem 3.1: Exemplo de comentários 1 //Comentário de linha 2 3 4 /* 5 * Comentário 6 * de 7 * bloco 8 */ 9 10 11 /** 12 * Exemplo de comentário 13 * de Javadoc. 14 * 15 */ 3.3. Strings Strings são cadeias de caracteres. Em java são representadas pela classe String e são expres- sas entre aspas. Strings literais como “abcdef” também são instâncias desta classe. É possível utilizar o operador + para concatenação de Strings: ‘‘Primeira String ’’ + ‘‘Segunda String’’ resulta em: ‘‘Primeira String Segunda String’’ Existemalguns caracteres que necessitam de alguns truques para serem expressos em Strings. Eles estão descritos na tablela da figura 3.2. A listagem 3.2 apresenta mais exemplos de sequências de escape. A saída deste exemplo é: http://solutioin.com Francisco Calaça, Otávio Calaça 11 Versão 1.2-beta lógica de programação em java Figura 3.2: Caracteres especiais e sua forma de representação em Strings Como colocar "aspas" na String. Exemplo de tabulação c:\diretorio\arquivo Observe que, para imprimir apenas uma barra, utiliza-se duas. Listagem 3.2: Exemplos de sequência de escape 1 2 public class ExemploSequenciaEscape { 3 4 public static void main(String[] args) { 5 System.out.println("Como colocar \"aspas\" na String."); 6 System.out.println("Exemplo\n\tde\n\t\ttabulação"); 7 System.out.println("c:\\diretorio\\arquivo"); 8 } 9 10 } 3.4. Saída Formatada O Java possui o recurso de saída formatada. Com este recurso é possível definir uma String de formatação e após isto, passar parâmetros para a mesma. Isto evita concatenação ex- cessiva de String e aumenta a legibilidade do código. A utilização destes caracteres está descrita na Tabela 12.1. Para cada caractere de conversão existe um parâmetro que será colocado no seu lugar: ("O aluno %s foi %s", "Marcos", "aprovado") Neste caso palavra “Marcos” será colocada no lugar do primeiro %s e a palavra “aprovado” será colocada no lugar do segundo %s resultando no seguinte: "O aluno Marcos foi aprovado" A listagem 12.4 apresenta exemplos de saída formatada. 12 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java Caracter Aplicado em %s String %d Inteiro %f Ponto flutuante Tabela 3.1: Caracteres de conversão utilizados na saída formatada Listagem 3.3: Saída formatada 1 import javax.swing.JOptionPane; 2 3 4 public class ExemploSaidaFormatada { 5 6 public static void main(String[] args) { 7 String nome = JOptionPane.showInputDialog("Nome:"); 8 String resultado = JOptionPane.showInputDialog("Resultado:"); 9 System.out.printf("O aluno %s foi %s\n", nome, resultado); 10 System.out.printf("\nFormatação numérica:%.2f", 12.356); 11 } 12 13 } 3.5. Conceito de Variável Para resolver problemas em programas de computador é necessário manipular vários da- dos, sejam eles números ou caracteres. Se você precisa calcular o resultado de uma única conta, provavelmente o melhor seria utilizar uma calculadora. A utilidade de se escrever um programa aparece quando usamos várias variáveis. Estas possuem a capacidade de con- ter valores. Desta forma, é possível então calcular o resultado de várias contas. As variáveis são declaradas com um identificador e seu nome. Exemplo: String nome; int idade; String endereco; Também é possível passar valores para variáveis no momento de sua declaração: String nome = "José Maria"; int idade = 5; String endereco = "Rua 2 nr 3 Centro"; http://solutioin.com Francisco Calaça, Otávio Calaça 13 Versão 1.2-beta lógica de programação em java 3.6. Palavras reservadas e identificadores Palavras reservadas, são as palavras que não podem ser usadas como identificadores, ou seja, não podem ser usadas como nome de variáveis, nome de classes, etc. Estas palavras são assim definidas ou porque já têm uso na sintaxe da linguagem ou porque serão usadas em algums momento, seja para manter compatibilidade com versões anteriores ou mesmo com outras linguagens. No caso do Java, as palavras reservadas estão descritas na Tabela 3.2. abstract continue for new switch assert default goto package synchronized boolean do if private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while Tabela 3.2: As palavras reservadas do Java De acordo com a Java Language Specification2, null, true e false são tecnicamente chama- dos de valores literais, e não keywords. Se você tentar criar algum identificador com estes valores, você também terá um erro de compilação. Utilizamos, em Java, as seguintes regras para criação do identificador: • não pode ser uma palavra reservada (Tabela 3.2); • não pode ser true nem false - literais que representam os tipos lógicos (booleanos); • não pode ser null - literal que represanta o tipo nulo; • não pode conter espaços em brancos ou outros caracteres de formatação; • deve ser a combinação de uma ou mais letras e dígitos (letras maíusculas, minúsculas, números, sublinha (_) e cifrão ($)). Os identificadores não podem começar com números. As letras maiúsculas e minúsculas diferenciam os identificadores, ou seja, x é um identificador diferente de X, nome é diferente de Nome, etc. Exemplos: X 2 http://docs.oracle.com/javase/specs/ 14 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java Y_1 nome Pessoa j3 _teste 3.7. Tipos Primitivos Tipos primitivos são tipos que não necessitam instanciação, ou seja, sua declaração já cria a variável na memória não sendo necessário construtores. Existem oito tipos primitivos em Java que são divididos em quatro grupos: • inteiros • ponto flutuante • caractere • booleano. 3.7.1 Tipos primitivos inteiros Os quatro tipos primitivos inteiros são utilizados para armazenamento de números inteiros, sem casas decimais. Eles estão descritos na Tabela 3.3. Tipo Tamanho Intervalo byte 1 byte −128 até +127 short 2 bytes −32.768 até +32, 767 int 4 bytes −2.147.483.648 até 2.147.483.647 long 8 bytes −9.223.372.036.854.775.808 até 9.223.372.036.854.775.807 Tabela 3.3: Tipos primitivos inteiros do Java Por padrão, os tipos primitivos inteiros são do tipo int, ou seja, se apenas for escrito o número 5, este será do tipo int. Para explicitar o tipo long deve-se acrescentar, após o número, a letra L (maiúscula ou minúscula): long numero = 45L; 3.7.2 Tipos primitivos de ponto flutuante Existem dois tipos de ponto flutuante, conforme descrito na tabela da figura 3.4. Estes tipos são utilizados para armazenamento de números com casas decimais. Utiliza-se o símbolo ponto (.) para separação decimal: http://solutioin.com Francisco Calaça, Otávio Calaça 15 Versão 1.2-beta lógica de programação em java 1234.566 4343.1212 Tipo Tamanho Intervalo float 4 byte +/− 3.4E− 38 até +/− 3.4E+ 38 double 8 bytes +/− 1.7E− 308 até +/− 1.7E+ 308 Tabela 3.4: Tipos primitivos de ponto flutuante do Java Por padrão, os tipos primitivos com casas decimais são do tipo double, ou seja, se ape- nas for escrito o número 3.5, este será do tipo double. Para explicitar o tipo float deve-se acrescentar, após o número, a letra F (maiúscula ou minúscula): float numero = 3.5F; 3.7.3 Tipo primitivo char O tipo primitivo char é utilizado para representar caracteres. Ocupa dois bytes para ar- mazenamento e o intervalo vai de 0 até 65535. Note que o tipo char não abrange números negativos e possui dois bytes de armazenamento pois o Java suporta caracteres Unicode. Dica: O Unicode possui o objetivo explícito de transcender as limitações de codificações de carácter tradicionais, como as definidas pelo padrão ISO 8859, que possuem grande uso em vários países mas que permanecem em sua maioria incompatíveis umas com as outras. Várias codificações de carácter tradicionais compartilham um prob- lema comum, ao permitirem processamento bilíngue (geralmente us- ando caracteres romanos e a língua local), mas não processamento multilíngue (processamento de línguas arbitrárias misturadas umas com as outras). 3.7.4 Tipo primitivo boolean O tipo primitivo boolean é utilizado para representar dois estados, verdadeiroou falso. Exemplo: boolean ativo = true; boolean cancelado = false; 16 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java 3.7.5 Conversões de variáveis É possível realizar automáticamente conversões entre variáveis primitivas do Java seguindo a figura 3.3. Segundo esta figura não é possível converter automaticamente tipos maiores como long para tipos menores como byte. Neste caso é necessário realizar a operação cast: long maior = 56L; byte menor = (byte)maior; Observe que para realizar a operação de cast basta colocar o tipo que se deseja converter entre parêntesis na frente da variável a ser convertida. O código da listagem 3.4 apresenta um exemplo do que acontece quando é feito um cast de uma variável maior para uma menor. Existe o risco de truncamento do número. A saída deste exemplo é: Numero:300 Após truncamento:44 Isto ocorre porque 300 escrito em binário é: 100101100. Contando os primeiros oito bits da direita para esquerda, temos: 00101100. Este valor em decimal vale 44. O restante do número em binário fui truncado, ou seja, descartado. Listagem 3.4: Exemplo de truncamento de números 1 public class ExemploTruncamento { 2 3 public static void main(String[] args) { 4 int numero = 300; 5 byte menor = (byte) numero; 6 System.out.printf("\nNumero:%d \nApós truncamento:%d", numero, menor); 7 } 8 9 } 3.8. Operadores Quando o computador foi concebido ele era puramente uma máquina de cálculos. Ape- sar de atualmente o computador estar associado a diversas atividades da vida cotidiana, o mesmo ainda não passa de uma super máquina de fazer cálculos. Desta forma, a linguagem Java possui vários operadores cujo objetivo é realizar este cálculos. Nesta seção serão apre- sentados os operadores que irão nos auxiliar em operações matemáticas e lógicas. 3.8.1 Aritméticos A aritmética do Java é realizada por meio dos cinco operadores. Eles são divididos em dois grupos, os de maior prioridade, listados na Tabela 3.5 e os de menor prioridade, listados http://solutioin.com Francisco Calaça, Otávio Calaça 17 Versão 1.2-beta lógica de programação em java Figura 3.3: Conversões automáticas de tipos primitivos na Tabela 3.6. Os operadores de maior prioridade são executados antes dos operadores de menor prioridade, ou seja, se em uma expressão matemática existirem os dois tipos inicialmente realiza-se as operações de maior prioridade e somente após são executados os operadores de menor prioridade. A expressão: 5 + 3 * 5 Resultará em 20. A operação 3 ∗ 5 será executada primeiro. A ordem de execução do Java dá-se da esquerda para a direita, ou seja, o nosso sentido de leitura. Existindo, na mesma expressão matemática, dois ou mais operadores de maior prioridade será executado o que vier primeiro: 8/2 ∗ 3 resultará em 12 porque a divisão 8/2 veio primeiro. É possível alterar a órdem de execução com parêntesis. Após a execução de: x = (5 + 3) * 2 o valor da variável x será 16 pois a soma será feita primeiro devido aos parêntesis. 3.8.2 Atribuição Em Java é utilizado o operador = para realizar a atribuição. Sua ordem de execução é da direita para a esquerda, ou seja, os valores mais à direita são atribuídos às variáveis mais a esquerda: x = 4 equivale a dizer que o valor 4 será atribuído à variável x e, após a execução desta instrução a variável x passará a conter o valor 4. 18 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java Operador Operação realizada * Multiplicação / Divisão % Resto da divisão inteira Tabela 3.5: Operadores com maior prioridade Operador Operação realizada + Adição - Subtração Tabela 3.6: Operadores com menor prioridade Em Java, é possível combinar o operador de atribuição (=) com os operadores de ar- itmética. Desta forma são criados mais operadores de atribuição. Estes operadores estão listados na Tabela 3.7. Uma dica, para entender melhor estes operadores, é colocar o operador de aritmética antes do operador de atribuição. Sendo assim, se for necessário realizar as operações de soma e atribuição, primeiro escreva o operador de soma e depois o de atribuição: + =, x += 3; Após a execução desta instrução o valor da variável x será acrescido de 3. Operador Exemplo Equivalente a += s += 7 s = s + 7 -= s -= 7 s = s - 7 *= m *= 7 m = s * 7 /= d /= 7 d = s / 7 %= r %= 7 r = s % 7 Tabela 3.7: Exemplos de operadores de atribuição 3.8.3 Incremento/Decremento Os operadores de incremento e decremento são utilizados quando existe a necessidade de somar ou subtrair em apenas uma unidade os valores contidos em uma variável utilizando dois sinais de soma, para incremento e dois sinais de subtração para decremento: Assim, x++ incrementará o valor de x e x−− decrementará o valor de x. Estes operadores se dividem em dois grupos: http://solutioin.com Francisco Calaça, Otávio Calaça 19 Versão 1.2-beta lógica de programação em java 1. Pré-incremento/Pré-decremento: primeiro é incrementado/decrementado e somente depois o valor é utilizado. O operador é colocado antes da variável: x = 4; y = ++x + 5; O resultado de y após esta execução é 10. Inicialmente o valor de x é incrementado passando a valer 5. Só após o incremento o valor da variável é utilizado na operação de soma. 2. Pós-incremento/Pós-decremento: primeiro utiliza-se o valor e somente depois a var- iável é incrementada/decrementada. O operador é colocado após a variável. x = 4; y = x++ + 5; O resultado de y após esta execução é 9. Inicialmente o valor de x é somado, assim 4 + 5 vale 9. O valor só é incrementado após as operações aritméticas. 3.8.4 Relacionais São utilizados para comparar duas variáveis. O resultado da comparação é um valor booleano. A relação de comparadores do Java pode ser vista na Tabela 3.8. Operador Operação == Igualdade != Diferença > Maior que >= Maior ou igual que < Menor que <= Menor ou igual que Tabela 3.8: Operadores de comparação do Java 3.8.5 Lógicos Existem quatro operações lógicas, cujos operadores estão ilustrados na Figura 3.9: 1. E, o resultado de uma operação lógica E só é verdadeiro se os dois operandos também forem verdadeiros; 20 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java 2. OU, o resultado de uma operação lógica OU só é falso se os dois operandos também forem verdadeiros; 3. NAO, o resultado é a negação do operando, assim o que é verdadeiro se torna falso e o que é falso se torna verdadeiro após esta operação; 4. OU EXCLUSIVO, o resultado de uma operação lógica OU EXCLUSIVO só é ver- dadeiro se os dois operandos forem diferentes. Operador Operação || OU curto-circuito && E curto-circuito | OU lógico & E lógico ˆ OU exclusivo ! Não lógico Tabela 3.9: Tabela de operadores lógicos A tabela verdade do Operador E pode ser vista na figura 3.11, do Operador OU na figura 3.10 e a tabela do Operador OU EXCLUSIVO na figura 3.12. Observe na Figura 3.9 que existem dois tipos de operadores para a operação OU: | (OU simples) e || (OU curto-circuito) e dois tipos de operadores para a operação E: & (simples) e && (E curto-circuito). Basicamente o que diferem estes dois tipos de operadores são o seguinte. OU e E curto- circuito (|| e &&) são utilizados apenas para operações condicionais. Em uma operação condicional, já sendo possível a obtenção do resultado, analisando apenas o primeiro operando, não é analisado o segundo operando. Neste caso a resposta já é retornada, daí o nome curto circuito. Exemplo: V || ? = V F && ? = F Note, no exemplo, que na operação de OU, independente do valor do segundo operando, a resposta será sempre verdadeira se o primeiro operando também for. Na operação de E, a respostaserá sempre falsa se o primeiro operando também for. Como você pode perceber, não é necessário analisar o segundo operando para retornar as respostas nestes casos. Já os operadores OU e E lógico (| e &) são utilizados em operações lógicas bit a bit. Por exemplo: 410 = 1002 310 = 0112 410|310 ⇒ 1002|0112 Desta forma, 410|310 = 7, pois 1002|0112 = 1112 http://solutioin.com Francisco Calaça, Otávio Calaça 21 Versão 1.2-beta lógica de programação em java Entrada 1 Entrada 2 Saída V V V V F V F V V F F F Tabela 3.10: Tabela verdade da operação OU Entrada 1 Entrada 2 Saída V V V V F F F V F F F F Tabela 3.11: Tabela verdade da operação E 3.9. Estruturas de seleção Estrutura de seleção (expressão condicional ou ainda construção condicional) é uma es- trutura de desvio do fluxo de controle que executa diferentes instruções dependendo se a seleção (ou condição) é verdadeira ou falsa, em que a expressão é processada e transfor- mada em um valor booleano. 3.9.1 if . . . else A instrução if . . . else se comporta da seguinte maneira. Quando o teste do “if” for ver- dadeiro, é executado o código que se encontra logo em seguida do if. No caso do teste ser falso, é executado o código que se encontra logo em seguida do else. O bloco else não é obrigatório. A figura 3.4 ilustra o fluxo da instrução if . . . else. Na listagem 3.5 pode ser visto um exemplo de uso. Sua sintaxe é: Entrada 1 Entrada 2 Saída V V F V F V F V V F F F Tabela 3.12: Tabela verdade da operação OU EXCLUSIVO 22 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java if(teste){ //executa somente se o teste for verdadeiro }else{ //executa somente se o teste for falso } Figura 3.4: Fluxo de execução do if Listagem 3.5: Exemplo de uso do if . . . else 1 import javax.swing.JOptionPane; 2 3 public class ExemploIf { 4 public static void main(String[] args) { 5 //Obtenção dos dados do usuário 6 String notaString = JOptionPane.showInputDialog("Digite a nota:"); 7 //Conversão em int 8 int nota = Integer.parseInt(notaString); 9 10 if (nota >= 5) { 11 JOptionPane.showMessageDialog(null, "Aprovado"); 12 } else { 13 JOptionPane.showMessageDialog(null, "Reprovado"); 14 } 15 } 16 } http://solutioin.com Francisco Calaça, Otávio Calaça 23 Versão 1.2-beta lógica de programação em java Dica: Para converter String em int, utilize o código: int nota = Integer.parseInt(notaString); e para converter String em double: double nota = Double.parseDouble(notaString); 3.9.2 Operador condicional ou ternário O operador condicional pode ser utilizado como um if ... else. Este operador é conhecido também como operador ternário porque ele possui três operandos: (teste ? "quando teste verdadeiro" : "quando teste falso" )); Um exemplo de uso deste operador está na Listagem 3.6. Na listagem 3.7 pode ser visto outro exemplo de aplicação do operador condicional na listagem 3.7; Listagem 3.6: Exemplo de uso do operador condicional. 1 import javax.swing.JOptionPane; 2 3 public class ExemploCondicional { 4 public static void main(String[] args) { 5 String notaString = JOptionPane.showInputDialog("Digite a nota:"); 6 int nota = Integer.parseInt(notaString); 7 String resultado = nota >= 5 ? "aprovado" : "reprovado"; 8 String msg = "O aluno foi " + resultado; 9 JOptionPane.showMessageDialog(null, msg); 10 } 11 } Listagem 3.7: Outro exemplo de uso do operador condicional. 1 import javax.swing.JOptionPane; 2 3 public class ImprimeMaior { 4 public static void main(String[] args) { 5 String primeiroNumero = JOptionPane.showInputDialog("Digite um número:"); 6 String segundoNumero = JOptionPane.showInputDialog("Digite um número:"); 7 8 int n1 = Integer.parseInt(primeiroNumero); 9 int n2 = Integer.parseInt(segundoNumero); 10 11 int maior = n1 > n2 ? n1 : n2; 12 13 JOptionPane.showMessageDialog(null, "O maior numero é: " + maior); 14 } 24 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java 15 } 3.9.3 switch Diferente das instruções if e if . . . else, a instrução switch permite um maior número de possibilidades de caminhos de execução. A palavra chave switch pode ser utilizada somente com o tipo primitivo int (byte, short, char por conversão automática e seus tipos Wrappers), o tipo Enum e, a partir da versão 7 do Java, String. Sua sintaxe é: switch(tipo){ case a: //instrucao; case b: //instrucao; default: //instrucao; } Na Listagem 3.8 está o código de exemplo da instrução switch. É comum utilizar a instrução switch juntamente com o break para que apenas uma opção seja executada. Listagem 3.8: Exemplo de utilização do switch 1 import javax.swing.JOptionPane; 2 3 public class ExemploSwitch { 4 public static void main(String[] args) { 5 String numeroString = 6 JOptionPane.showInputDialog("Digite o número de um mês (1 a 12):"); 7 int num = new Integer(numeroString); 8 String msg; 9 switch (num) { 10 case 1: 11 msg = "Janeiro"; 12 break; 13 case 2: 14 msg = "Fevereiro"; 15 break; 16 case 3: 17 msg = "Março"; 18 break; 19 case 4: 20 msg = "Abril"; 21 break; 22 case 5: 23 msg = "Maio"; 24 break; http://solutioin.com Francisco Calaça, Otávio Calaça 25 Versão 1.2-beta lógica de programação em java 25 case 6: 26 msg = "Junho"; 27 break; 28 case 7: 29 msg = "Julho"; 30 break; 31 case 8: 32 msg = "Agosto"; 33 break; 34 case 9: 35 msg = "Setembro"; 36 break; 37 case 10: 38 msg = "Outubro"; 39 break; 40 case 11: 41 msg = "Novembro"; 42 break; 43 case 12: 44 msg = "Dezembro"; 45 break; 46 default: 47 msg = "Número incorreto"; 48 } 49 JOptionPane.showMessageDialog(null, msg); 50 } 51 } 3.10. Estruturas de Repetição Estrutura de repetição é uma estrutura de desvio do fluxo de controle que realiza e repete diferentes ações, dependendo se uma condição é verdadeira ou falsa, em que a expressão é processada e transformada em um valor booleano. Estão associados a uma estrutura de repetição uma condição (também chamada "expressão de controle" ou "condição de parada") e um bloco de código: verifica-se a condição, e caso seja verdadeira, o bloco é executado. Após o final da execução do bloco, a condição é verificada novamente, e caso ela ainda seja verdadeira, o código é executado novamente. 3.10.1 for A instrução for provê um caminho rápido para percorer uma faixa de valores. Com esta instrução é possível repetir determinadas instruções enquanto a condição for verdadeira. A sintaxe do for é a seguinte: for (inicialização; condição; incremento) { instruções(s) } 26 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java É bom lembrar que: • A inicialização é executada apenas quando o loop inicia; • Quando a condição for false o loop terminará; • O incremento é invocado depois de cada iteração, local adequado para incrementos e decrementos de variáveis; Veja na listagem 3.9 um exemplo de uso do laço for. Neste exemplo são impressas quinze linhas no console. Listagem 3.9: Exemplo de uso do laço for 1 public class ExemploFor { 2 public static void main(String[] args) { 3 for (int i = 0; i < 15; i++) { 4 System.out.printf("\nlinha: %d", i); 5 } 6 } 7 } 3.10.2 while A instrução while executa um bloco de instruções enquanto uma condição particular for verdadeira (true). Sua sintaxe é: while (teste) { statement(s) } A expressão while avalia o teste, que deve retornar um tipo booleano. Se a espressão avaliada for verdadeira (true), o bloco while executa as instruções dentro do bloco.A ex- pressão while continua testando o teste até que este seja falso (false). O código da listagem 3.10 calcula a soma de inteiros enquanto a opção de saída não é informada. Listagem 3.10: Exemplo de utilização do laço while 1 import javax.swing.JOptionPane; 2 3 public class ExemploWhile { 4 public static void main(String[] args) { 5 int status = 0; 6 7 int qtd = 0; 8 double soma = 0; 9 10 while (status != 1) { 11 String numStr1 = JOptionPane.showInputDialog("Digite um inteiro"); 12 int n1 = Integer.parseInt(numStr1); 13 http://solutioin.com Francisco Calaça, Otávio Calaça 27 Versão 1.2-beta lógica de programação em java 14 soma += n1; 15 qtd++; 16 17 String msg = "Digite 1 para sair ou qualquer outro número para continuar"; 18 String statusStr = JOptionPane.showInputDialog(msg); 19 20 status = Integer.parseInt(statusStr); 21 22 } 23 24 double media = soma / qtd; 25 JOptionPane.showMessageDialog(null, "Média: " + media); 26 27 } 28 } 3.10.3 do . . . while A linguagem Java provê a instrução do . . . while que pode ser vista abaixo: do { statement(s) } while (teste); A principal diferença entre do . . . while e while é que while primeiro avalia o teste e somente após executa o loop, enquanto do . . . while primeiro executa a instrução e somente após isto é avaliado o teste. Em resumo, do . . . while garante pelo menos uma execução das instruções do bloco. 3.11. Exercícios 1. Crie um código que executa a seguinte ação: solicita ao usuário uma idade. Se esta for maior ou igual a 16, imprime: “Pode votar”. Se não for, imprime: “Não pode votar”. 2. Melhore o código do exercício anterior para imprimir também “Voto obrigatório” quando a idade estiver entre 18 e 70 anos. 3. Crie um código que imprima o seguinte: ************ ************ ************ ************ 4. Crie um código que solicita ao usuário um número entre 1 e 7. Após isto, o sistema imprime: Domingo se o número for 1, Segunda se o número for 2, Terça se o número for 3, etc. . . 28 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta lógica de programação em java 5. Altere o código da listagem 3.10 para utilizar do. . . while no lugar de while. Alguns dos códigos aqui descritos e mais informações sobre este assunto pode ser obtido em: http://solutioin.com/java Acesse e verifique! http://solutioin.com Francisco Calaça, Otávio Calaça 29 4 I N T R O D U Ç Ã O À O R I E N TA Ç Ã O A O B J E T O S O Objetivo da orientação a objetos é facilitar o reuso de software. Hoje ao ir a uma loja para comprar uma lâmpada, a única coisa que é necessário saber é a potência desta. O fabricante da lâmpada, sem ter medido nada na sua sala, consegue fabricar uma lâmpada que servirá para você. Hoje é fácil reutilizar lâmpadas por conta que estas seguem alguns padrões que facilitam sua utilização. Não é necessário rever toda a fiação da sua residência quando uma lâmpada queima, nem substituir nada. Basta tirar a lâmpada defeituosa e colocar outra nova no seu lugar. Desta forma, a orientação a objetos traz para o mundo do software as facilidades encon- tradas no mundo real. Neste capítulo você verá os conceitos inicias da orientação a objetos, tais como classes e seus elementos. Alguns dos códigos aqui descritos e mais informações sobre este assunto pode ser obtido em: http://solutioin.com/java Acesse e verifique! 4.1. O conceitos Classe e Objeto Os conceitos iniciais de Orientação a Objetos são: • Classe, significa grupo ou conjunto. Representa um tipo de dados que pode conter atributos e métodos, como por exemplo, Carro. A classe Carro define todo o conjunto de carros. A este conjunto é possível associar atributos como potência, número de passageiros, etc. Mas lembre-se, trata-se de apenas um conjunto, este ainda pode estar vazio. • Objeto, representa um elemento do conjunto Carro, ou seja, o carro construído. Sabendo o que é um carro (seus atributos) é possível construir quantos objetos do tipo carros forem necessários. Em resumo: Objeto é a instância de uma classe. Mas o que significa instância ? Instância siginifica a concretização de algo, ou seja, a materizalização de um objeto. Assim a frase: “Objeto é a instância de uma classe” pode ser traduzida como: “Objeto é a concretização de uma classe”. 31 Versão 1.2-beta introdução à orientação a objetos Assim uma classe é o arquivo, o código digitado, enquanto o objeto será construído pelo programa, a partir da classe, e executado pelo computador. Para declarar classes utiliza-se a palavra chave class: class Carro { //campos, construtores, e declaração de métodos } Para instanciar, ou criar, objetos a partir de uma classe utiliza-se o operador: new. Carro seuCarro = new Carro(); Note que uma classe é também um tipo. Você acabou de criar um novo tipo de variáveis no Java! O tipo Carro. Antes de serem instanciadas, as variáveis objeto valem null. A palavra chave null é utilizada para expressar a não existencia de uma instância de um objeto em determinada variável, ou seja, representa o nulo. Esta forma, uma variável não instanciada possui o valor null. 4.2. Elementos de uma classe Uma classe possui atributos e métodos. Existe também um tipo especial de método: o método construtor. Nesta seção serão apresentados estes elementos. 4.2.1 Atributos Atributos de uma classe são as propriedades da mesma. No exemplo do Carro, atributos poderiam ser: cor, dataDeFabricacao, potência, etc. Observe que atributos são substantivos que descrevem a Classe e que são exclusivos de cada objeto, ou seja, apesar de todos os Carros possuirem o atributo cor, cada Carro pode ter uma cor diferente. Na classe da listagem 4.1 existem os atributos cor e velocidade. Após a execução da classe da Listagem 4.2, você verá a seguinte saída: Cor: Branco - Velocidade:80.0 Listagem 4.1: Carro com seus atributos 1 public class Carro { 2 double velocidade; 3 String cor; 4 } Listagem 4.2: Classe que cria um objeto do tipo Carro 1 public class CarroTeste { 2 public static void main(String[] args) { 3 Carro obj = new Carro(); 32 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução à orientação a objetos 4 obj.cor = "Branco"; 5 obj.velocidade = 80; 6 7 System.out.printf("Cor: %s - Velocidade:%s\n", obj.cor, obj.velocidade); 8 } 9 } 4.2.2 Métodos Métodos são como funções. Possuem instruções que são executadas quando o método é invocado. Em Orientação a Objetos os métodos descrevem ações realizadas pelos objetos. Em Java os métodos devem possuir tipo de retorno: int realizaAlgo(){ //instruções return 5; } Neste caso é obrigatório explicitar o que o método retorna com a palavra chave return. Se o método não retornar algo, o tipo de retorno utilizado é void (note que sempre deve ser informado o tipo de retorno. Mesmo quando o método não retorna nada!): void realizaAlgo(){ //instruções } Os métodos também podem receber parâmetros: void realizaAlgo(int parametro){ //instruções } Havendo a necessidade de múltiplos parâmetros em um método utiliza-se vírgula para separá-los: void realizaAlgo(int parametro, double outroParametro){ //instruções } A Listagem 4.3 inclui métodos na classe Carro. Estes métodos são responsáveis por al- terar a velocidade e parar o carro. A Listagem 4.4 apresenta um exemplo de execução destes métodos. Após sua execução, você verá a seguinte saída: Mudando a velocidade para 80,000000 Km/h Velocidade atual: 80,000000 Km/h Parando veículo. Velocidade 0 Km/h. Cor: Branco Mudando a velocidade para 60,000000 Km/h Velocidade atual: 60,000000 Km/h Parando veículo. Velocidade 0 Km/h. Cor: Vermelho http://solutioin.com Francisco Calaça, Otávio Calaça 33 Versão1.2-beta introdução à orientação a objetos Listagem 4.3: Carro com atributos e métodos 1 public class Carro { 2 3 double velocidade; 4 String cor; 5 6 void mudarVelocidade(double v) { 7 velocidade = v; 8 System.out.printf("\n\nMudando a velocidade para %f Km/h", velocidade) ; 9 } 10 11 void pararCarro() { 12 System.out.printf("\nVelocidade atual: %f Km/h", velocidade); 13 System.out.printf("\nParando veículo. Velocidade 0 Km/h. Cor: %s", cor ); 14 } 15 } Listagem 4.4: Classe que cria um objeto do tipo Carro 1 public class CarroTesteMetodo { 2 public static void main(String[] args) { 3 Carro meuCarro = new Carro(); 4 meuCarro.cor = "Branco"; 5 meuCarro.mudarVelocidade(80); 6 meuCarro.pararCarro(); 7 8 Carro carroDaEsposa = new Carro(); 9 carroDaEsposa.cor = "Vermelho"; 10 carroDaEsposa.mudarVelocidade(60); 11 carroDaEsposa.pararCarro(); 12 } 13 } 4.2.3 Métodos construtores Métodos construtores são um tipo especial de métodos. Eles são invocados quando objetos são criados. A declaração de um construtor é similar a declaração de um método, exceto o tipo de retorno: Construtores não possuem tipo de retorno. Nem void. Toda classe Java possui um construtor. Se não for implementado um construtor o compilador criará um automaticamente. Este construtor criado, é chamado de construtor padrão por não receber parâmetros. Dica: Construtor padrão é aquele que não recebe parâmetros. 34 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução à orientação a objetos É possível passar parâmetros para construtores conforme apresentado na listagem 4.5. É uma forma de criar objetos e ao mesmo tempo ajustar os atributos iniciais. O código da listagem 4.6 possui a seguinte saída: Fabricando uma Motocicleta. Cor: Azul, Potência: 125,000000 cilindradas Fabricando uma Motocicleta. Cor: Vermelho, Potência: 250,000000 cilindradas Fabricando uma Motocicleta. Cor: Prata, Potência: 400,000000 cilindradas Listagem 4.5: Exemplo de construtor que recebe atributos 1 public class Motocicleta { 2 String cor; 3 double potencia; 4 5 public Motocicleta(String c, double p) { 6 cor = c; 7 potencia = p; 8 System.out.printf("\n\nFabricando uma Motocicleta." 9 + "\nCor: %s, Potência: %f cilindradas", cor, potencia); 10 } 11 } Listagem 4.6: Criação de motocicletas 1 public class MotocicletaTeste { 2 public static void main(String[] args) { 3 Motocicleta moto1 = new Motocicleta("Azul", 125); 4 Motocicleta moto2 = new Motocicleta("Vermelho", 250); 5 Motocicleta moto3 = new Motocicleta("Prata", 400); 6 } 7 } 4.2.4 Padrões de nomenclatura Os padrões de nomenclatura utilizados pelos programadores Java são: • Os nomes das classes começam com letras maiúsculas; • Os nomes dos métodos e variáveis começam com letras minúsculas; • Não é utilizado o caracter _ para mudança de palavra e sim a colocacação da primeira letra da palavra em maiúsculo. • Variáveis constantes são escritas em maiúsculo. http://solutioin.com Francisco Calaça, Otávio Calaça 35 Versão 1.2-beta introdução à orientação a objetos Dica: Esta padronização, dentre outras da linguagem Java, estão descritas no documento chamado: Code Conventions for the Java Program- ming Language. Este documento pode ser acessado através do site: http://www.oracle.com/technetwork/java/codeconv-138413.html 4.3. Atributos e métodos static Até agora todos os atributos e métodos de uma classe só estavam acessíveis atravéz de suas instâncias. Se você observar o campo out da classe System verá que é possível acessa-lo diretamente da classe, sem qualquer instância. Os campos podem ser da classe ou do objeto. Até agora todos os campos criados foram de objetos, pois só são acessíveis a partir de objetos. Para que determinados atributos possam ser compartilhados por todos os objetos de determinada classe, estes atributos devem possuir o modificador static. Na listagem 4.7 é apresentada uma classe com um atributo static. Observe que este atributo é incrementado a cada nova instância desta classe. A classe da listagem 4.8 cria três objetos do tipo ObjetoTeste e no final acessa a variável quantidadeInstancias para saber este número. Note que é possível acessar elementos statics sem a necessidade de instanciar a classe. Listagem 4.7: Objeto para testes da palavra chave static 1 2 public class ObjetoTeste { 3 4 static int quantidadeInstancias; 5 6 public ObjetoTeste() { 7 quantidadeInstancias ++; 8 } 9 10 } Listagem 4.8: Demonstração da palavra chave static 1 2 public class ExemploStatic { 3 4 public static void main(String[] args) { 5 ObjetoTeste obj1 = new ObjetoTeste(); 6 ObjetoTeste obj2 = new ObjetoTeste(); 7 ObjetoTeste obj3 = new ObjetoTeste(); 8 9 System.out.printf("\nQuantidade de instâncias do Objeto" + 10 "Teste:%d", ObjetoTeste.quantidadeInstancias); 11 } 12 36 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução à orientação a objetos 13 } 4.3.1 Import static Permite importar métodos e campos static de determinadas classes. Exemplo: import static javax.swing.JOptionPane.*; import static java.lang.Math.*; Observe no código da listagem 4.9 a utilização de vários métodos do tipo static das classes JOptionPane e Math. A cada utilização de um método destas classes como: JOptionPane.showMessageDialog(...); Um exemplo equivalente está no código da listagem 4.10. Nesta classe foi utilizado o import static o que tornou desnecessário a referência das classes JOptionPane e Math: showMessageDialog(...); Listagem 4.9: Código sem import static 1 import javax.swing.JOptionPane; 2 3 public class ExemploSemImportStatic { 4 public static void main(String[] args) { 5 String numeroTexto = JOptionPane.showInputDialog("Digite um número:"); 6 int numero = new Integer(numeroTexto); 7 double raizQuadrada = Math.sqrt(numero); 8 double cubo = Math.pow(numero, 3); 9 double seno = Math.sin(numero); 10 11 JOptionPane.showMessageDialog(null, "Numero:" + numero); 12 JOptionPane.showMessageDialog(null, "Raiz Quadrada:" + raizQuadrada); 13 JOptionPane.showMessageDialog(null, "Cubo:" + cubo); 14 JOptionPane.showMessageDialog(null, "Seno:" + seno); 15 } 16 } Listagem 4.10: Código com import static 1 2 import static javax.swing.JOptionPane.*; 3 import static java.lang.Math.*; 4 5 public class ExemploImportStatic { 6 public static void main(String[] args) { 7 String numeroTexto = showInputDialog("Digite um número:"); 8 int numero = new Integer(numeroTexto); 9 double raizQuadrada = sqrt(numero); 10 double cubo = pow(numero, 3); 11 double seno = sin(numero); http://solutioin.com Francisco Calaça, Otávio Calaça 37 Versão 1.2-beta introdução à orientação a objetos 12 13 showMessageDialog(null, "Numero:" + numero); 14 showMessageDialog(null, "Raiz Quadrada:" + raizQuadrada); 15 showMessageDialog(null, "Cubo:" + cubo); 16 showMessageDialog(null, "Seno:" + seno); 17 } 18 19 } 4.4. Tipos Wrapper As classes wrappers tem o papel de encapsular os tipos primitivos para a possibilidade de operações como: conversões, mudança de bases decimais, e algumas operação que somente a objetos é permitido, como por exemplo, trabalhar com conjuntos. Java possui oito tipos wrapper, que adicionam funcionalidades aos tipos primitivos: 1. Byte - byte 2. Short - short 3. Integer - int 4. Long - long 5. Float - float 6. Double - double 7. Character - char 8. Boolean - boolean Basicamente os tipos wrapper possuem os mesmos nomes dos tipos primitivos, com a primeira letra maiúscula, exceto para os tipos int que é Integer e char que é Character. Algumas destas funcionalidades são: a conversão de tipoprimitivo para objeto, conver- são para String, conversão à partir de String, etc. 4.4.1 Auto-boxing e Auto-unboxing Este conceito permite converter automaticamente tipos primitivos em equivalentes objetos utilizando a classe Wrapper respectiva. Isto economiza código e facilita o entendimento do programa. • Auto-boxing, conversão automática de um tipo primitivo para seu respectivo tipo Wrapper; • Auto-unboxing, conversão automática de um tipo Wrapper para seu respectivo tipo primitivo; 38 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução à orientação a objetos Veja na listagem 4.11 um exemplo de boxing e unboxing. Listagem 4.11: Exemplo de auto boxing 1 public class ExemploAutoBoxing { 2 public static void main(String[] args) { 3 /* 4 * Exemplo de auto boxing. Observe o número 16, tipo int e primitivo, foi 5 * automaticamente convertido para o tipo Wrapper Integer. 6 */ 7 Integer idade = 16; 8 9 /* 10 * Exemplo de auto unboxing. Observe a utilização da classe Integer para 11 * conversão da String 56 em tipo int. 12 */ 13 int quantidade = new Integer("56"); 14 15 } 16 } 4.5. Regras de escopo Entenda por escopo área de atuação. Os escopos do Java são definidos por chaves. As var- iáveis declaradas dentro de um escopo somente podem ser acessadas dentro deste mesmo escopo. Observe que os blocos if, while, for, métodos, etc. definem escopos. Seus códigos são escritos entre chaves. Todas as variáveis declaradas dentro de um bloco if somente podem ser acessadas dentro de um bloco if. Cada método define um novo escopo, por isto as variáveis declaradas dentro de um método não podem ser acessadas por outro método, ou seja, outro escopo. Observe o código da listagem 4.12. Neste código existe um bloco for no método main. Dentro do bloco for foi declarada as variáveis numero e i. Estas variáveis não podem ser acessadas fora do bloco for. Listagem 4.12: Exemplo de regras de escopo 1 public class ExemploEscopo { 2 public static void main(String[] args) { 3 for (int i = 0; i < 10; i++) { 4 int numero = i; 5 System.out.println("linha " + i); 6 } 7 } 8 } http://solutioin.com Francisco Calaça, Otávio Calaça 39 Versão 1.2-beta introdução à orientação a objetos 4.6. Sobrecarga de métodos Java trabalha com o conceito da assinatura de métodos. A assinatura de um método consiste no nome do mesmo juntamente com seus atributos de entrada. Assim o método: void acao(String texto) possui a assinatura acao(String), pois o método se chama acao e recebe uma String como parâmetro de entrada. Não entra no conceito de assinatura de um método o seu tipo de retorno, ou seja, dois métodos: void acao(String texto) int acao(String texto) possuem a mesma assinatura: acao(String) pois o tipo de retorno não é considerado na definição da assinatura. O código da listagem 4.13 apresenta um exemplo de sobrecarga de métodos. Neste código todos os métodos se chamam metodoQualquer e diferem apenas na quantidade e tipo de parâmetros. Observe que suas assinaturas são diferentes. O método main invoca cada um destes métodos passando parâmetros diferentes. A JVM consegue descobrir o método correto a ser executado em função da quantidade e tipo dos parâmetros informa- dos. Listagem 4.13: Exemplo de sobrecarga de métodos 1 public class ExemploSobrecarga { 2 static void metodoQualquer(int i){ 3 System.out.printf("\nEste método recebe um INT: %d", i); 4 } 5 static void metodoQualquer(double d){ 6 System.out.printf("\nEste método recebe um DOUBLE: %f", d); 7 } 8 static void metodoQualquer(String texto){ 9 System.out.printf("\nEste método recebe um BYTE: %s", texto); 10 } 11 static void metodoQualquer(){ 12 System.out.printf("\nEste método não recebe parâmetros"); 13 } 14 15 public static void main(String[] args) { 16 metodoQualquer(1); 17 metodoQualquer(1.0); 18 metodoQualquer("teste"); 19 metodoQualquer(); 20 } 21 } 40 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta introdução à orientação a objetos Alguns dos códigos aqui descritos e mais informações sobre este assunto pode ser obtido em: http://solutioin.com/java Acesse e verifique! 4.7. Exercícios 1. Qual a diferença entre classe e objeto? 2. Quais são os elementos de uma classe? 3. O que são métodos construtores? 4. Para que serve a palavra chave static? 5. O que faz o import static? 6. O que é um escopo? 7. O que é sobrecarga de métodos? 8. O que são tipos wrappers ? Quais são eles ? 9. Crie uma classe java com atributos e métodos (à sua escolha). Crie outra classe que instancia a primeira, seta seus atributos e invoca seus métodos. 10. Adicione um construtor na classe do exercício anterior. http://solutioin.com Francisco Calaça, Otávio Calaça 41 5 A R R AY S Arrays são estruturas de dados que permitem o armazenamento de objetos o que fa- cilita a manipulação e transporte destes. No mundo real são utilizadas caixas quando é necessário agrupar ou transportar objetos. No mundo do Java uma das estruturas utilizadas são Arrays. Para trabalhar adequadamente com Arrays é necessário que você saiba como inicializa-los. O próprio método main recebe um array de strings quando é feito String [] args. O Java 5 trouxe uma nova estrutura for, mais adequada para percorrer valores de arrays. Esta estrutura é mais rápida e mais simples de implementar. Trata-se do for aprimorado. 5.1. O que são arrays Um array é um objeto continer utilizado para armazenar outros objetos. Possui um tamanho fixo. O tamanho de um array é estabelecido quando este é criado. Após sua criação não é mais possível alterar este tamanho. Em capítulos posteriores será apresentado as coleções que podem ter seus tamanhos alterados. Cada item em um array é chamado de elemento e cada elemento pode ser acessado por um índice numérico. Este índice é um inteiro e sempre se inicia com 0, ou seja, um array com 10 elementos terá os índices de 0 até 9. Um bom exemplo para ilustrar um array é a caixa de ovos. Pense em uma caixa de ovos com 9 unidades. A caixa de ovos é um array com 9 elementos. Todos do tipo ovo. A figura 5.1 ilustra isto. Note que quando se cria um array este é uma caixa de ovos vazia mas com um espaço pré-determinado, no caso 9. Este espaço é o tamanho do array. Somente após a criação do array é possível “colocar” elementos nele. Para acessar determinado elemento de um array é necessário utilizar colchetes: int n = numeros[4]; Este exemplo acessa o quinto elemento do array (a numeração dos índices de um array inicia com 0, por isto o indice 4 representa o quinto elemento). Se ocorrer uma tentativa de acesso a um elemento não existente em um array ocorrerá um erro. Por exemplo, ao tentar acessar o sexto elemento de um array com 3 elementos será visto um erro: int [] numeros = new int[3]; int n = numeros[5]; Ocasionará o erro: java.lang.ArrayIndexOutOfBoundsException No capítulo sobre exceções será apresentado como tratar estes tipos de erros. 43 Versão 1.2-beta arrays Figura 5.1: Um array pode ser comparado a um porta ovos, cada elemento do array pode ser com- parado a um ovo 5.2. Declaração e inicialização de arrays É possível declarar arrays da seguinte forma: int [] primeiroArray; Como nas declarações de variáveis de qualquer tipo no Java, a declaração possui duas partes: o tipo e o nome da variável. Note que o tipo do array é escrito como tipo[], onde tipo é o tipo de dados que será colocado no array. Também é possível, ao declarar arrays, colocar os colchetes após a variável: int primeiroArray []; Mas esta forma é menos usual no Java. Um array é inicializado utilizando o operador new porque este é um objeto: primeiroArray = new int[10]; Este exemplo cria um array com capacidade de armazenamentode 10 elementos. Esta operação apenas inicializa o array, mas não os elementos internos a este. Os elemen- tos devem ser inicalizados um a um: primeiroArray[0] = 2; primeiroArray[1] = 3; . . . primeiroArray[8] = 4; primeiroArray[9] = 5; Outra forma de se inicializar um array e, ao mesmo tempo, inicializar os elementos de um array é: int [] primeiroArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; Observe neste exemplo que é, na mesma linha, declarado um array, inicializado com 10 elementos e, cada elemento, é inicializado com um determinado valor. Uma observação importante, que costuma cair nas provas de certificação, é que quando o array é de tipos primitivos todos os elementos deste são inicializados com 0 ou false, se for 44 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta arrays de tipo boolean. Em array de Objetos, os elementos não são inicializados, todos continuarão valendo null. Array possui um atributo chamado length. Este atributo possui a quantidade de elemen- tos do array. O código da listagem 5.1 apresenta um exemplo de declaração e inicialização de arrays. Observe neste exemplo que foi declarado dois tipos de arrays: um array de int e um array de String. Os elementos destes arrays não foram inicializados mas após a iteração entre seus elementos é possível notar que os elementos do array de int valem 0 e os elementos dos array de tipo String valem null. A saída deste exemplo é a seguinte: Array de tipo int Posição [0] = 0 Posição [1] = 0 Posição [2] = 0 Posição [3] = 0 Posição [4] = 0 Posição [5] = 0 Posição [6] = 0 Posição [7] = 0 Posição [8] = 0 Posição [9] = 0 Array de tipo String Posição [0] = null Posição [1] = null Posição [2] = null Posição [3] = null Posição [4] = null Posição [5] = null Posição [6] = null Posição [7] = null Posição [8] = null Posição [9] = null Listagem 5.1: Exemplo de declaração de arrays 1 public class DeclaracaoArray { 2 public static void main(String[] args) { 3 //Criando um array de tipo int 4 int [] numeros = new int[10]; 5 //Criando um array de String 6 String [] textos = new String[10]; 7 8 System.out.println("\nArray de tipo int"); 9 for (int i = 0; i < numeros.length; i++) { http://solutioin.com Francisco Calaça, Otávio Calaça 45 Versão 1.2-beta arrays 10 System.out.printf("Posição [%d] = %d\n", i, numeros[i]); 11 } 12 13 System.out.println("\nArray de tipo String"); 14 for (int i = 0; i < textos.length; i++) { 15 System.out.printf("Posição [%d] = %s\n", i, textos[i]); 16 } 17 18 } 19 } 5.3. Método main Agora é possível explicar toda a assinatura do método main: public static void main(String [] args){ . . . } Sempre deverá ser assim! Este método deve: • Ser public pois deve ser acessado externamente; • Ser static pois, como é o primeiro método a ser acessado em um programa Java, ainda não é possível existir uma instância de um objeto, logo, é necessário um método static, que pode ser acessado fora de qualquer instância de um objeto; • Deve, sempre, receber um array de String como parâmetro. São os parâmetros para o programa. O código da listagem 5.2 ilustra como obter os parâmetros informados pela linha de comando a um programa Java. Neste exemplo observe a utilização do atributo length no laço for. Para configurar o eclipse basta clicar no botão descrito na figura 5.2. Após isto crie um novo Java Application, conforme ilustrado na figura 5.3. Clique na aba Arguments e coloque os parâmetros no campo Program Arguments. Para executar via linha de comandos basta acrescentar, após a classe, os parâmetros para a aplicação, conforme ilustrado na figura 5.4. Listagem 5.2: Obtenção dos parâmetros informados ao programa 1 public class ParametrosPrograma { 2 public static void main(String[] args) { 3 System.out.println("Os parâmetros digitados foram:"); 4 for (int i = 0; i < args.length; i++) { 5 System.out.println(args[i]); 6 } 7 } 8 } 46 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta arrays Figura 5.2: Início das configurações de execução Figura 5.3: Configuração do eclipse para passagem de parâmetros para a aplicação Figura 5.4: Passagem de parâmetros para uma aplicação Java via linha de comando http://solutioin.com Francisco Calaça, Otávio Calaça 47 Versão 1.2-beta arrays 5.4. Laço for aprimorado O Java 5 trouxe uma nova funcionalidade para iteração de arrays: o for aprimorado. Esta nova forma de utilização do for permite iterações de coleções e arrays de forma compacta e mais fácil de ser lida. Para demonstrar um exemplo, considere o exemplo da listagem 5.3. Neste exemplo é utilizada a seguinte estrutura for: for (String meioTransporte : transportes) { . . . } Observe que este for necessita apenas de dois parâmetros: A variável que receberá cada item do array e o array. Este for percorrerá todo o array transportes e coloca, cada elemento deste, na variável meioTransporte. Listagem 5.3: Exemplo de uso do for aprimorado 1 public class ForAprimorado { 2 public static void main(String[] args) { 3 String [] transportes = {"Terrestre", "Aquático", "Aéreo"}; 4 5 for (String meioTransporte : transportes) { 6 System.out.printf("\nTransporte: %s", meioTransporte); 7 } 8 } 9 } 5.5. Passagem de parâmetros no Java Em Java todos os parâmetros são passados por valor. Isto significa que o valor da variável passado sempre será copiado para o valor da variável que está recebendo o parâmetro. Mas isto provoca dois tipos de comportamentos diferentes: • Quando a variável passada é primitiva (byte, short, int long, float, double, char e boolean), o valor é copiado para a variável que está recebendo, ou seja, esta pode sofer alterações que não serão replicadas no valor da variável passada. • Quando é passado uma variável Objeto, o valor desta também é copiado. A diferença é que o valor de uma variável Objeto é apenas a referência a este Objeto, por isto, tem-se a impressão que ocorreu uma passagem por referência, mas ainda é por valor, pois este foi copiado. Lembre-se o valor de uma variável Objeto é a referência a este objeto. Se, neste caso, for alterada a variável passada, esta também sofre alterações na origem. Para poder entender melhor isto, veja o código da listagem 5.5. Esta classe utiliza a classe Pessoa descrita na listagem 6.4. 48 http://solutioin.com Francisco Calaça, Otávio Calaça Versão 1.2-beta arrays Observe, na classe da listagem 5.5, a existência de dois métodos chamados metodoQual- quer. O primeiro método recebe um int, que é um tipo primitivo, e o segundo método recebe uma Pessoa, que é um objeto. Quando invocado o metodoQualquer pela primeira vez no método main, foi passado como parâmetro a variável valor que é um tipo primitivo. Note que o valor desta variável não mudou, antes e depois da execução do metodoQualquer continuou tendo 4 como valor. Quando é invocado o metodoQualquer passando um objeto do tipo Pessoa, este teve sua referência copiada. Assim quando alterado em metodoQualquer, esta alteração será percebida no método main. Observe que, apesar de se ter a impressão que ocorreu uma passagem por referência, não foi isto que ocorreu no Java. O que ocorreu foi uma passagem por valor. Lembre-se que em Java as varáveis Objeto armazenam apenas a referência a um objeto. Na passagem de parâmetros por valor, o valor (no caso a referência ao objeto do tipo Pessoa) foi copiado para o método metodoQualquer. A figura 5.5 ilustra a cópia de uma referência. Observe que, apesar de serem variáveis e referência diferentes, o Objeto é o mesmo. Assim, uma alteração realizada pela referência referencia 01 - variável 01 também será percebida pela referência referencia 02 - variável 02. Um outro exemplo está no código da listagem
Compartilhar