FACULDADES INTEGRADAS CAMPO-GRANDENSES JAVA Professora: Adriana Silva A HISTÓRIA DA LINGUAGEM JAVA (Extraído do Livro: JAVA – Como Programar) Talvez a contribuição mais importante da revolução dos microprocessadores até esta data seja o fato de ela ter possibilitado o desenvolvimento de computadores pessoais, que agora chegam a centenas de milhões em todo o mundo. Os computadores pessoais tiveram um profundo impacto sobre as pessoas e a maneira como as organizações conduzem e gerenciam seus negócios. Muitas pessoas acreditam que a próxima área importante em que os microprocessadores terão um impacto profundo serão os dispositivos eletrônicos inteligentes destinados ao consumidor final. Reconhecendo isso, a Sun Microsystems financiou uma pesquisa corporativa interna com o codinome Green em 1991. 0 projeto resultou no desenvolvimento de uma linguagem baseada em C e C++ que seu criador, James Gosling, chamou de Oak (carvalho) em homenagem a uma árvore que dava para a janela do seu escritório na Sun. Descobriu-se mais tarde que já havia uma linguagem de computador chamada Oak. Quando uma equipe da Sun visitou uma cafeteria local, o nome Java (cidade de origem de um tipo de café importado) foi sugerido e pegou. Mas o projeto Green atravessava algumas dificuldades. O mercado para dispositivos eletrônicos inteligentes destinados ao consumidor final não estava se desenvolvendo tão rapidamente como a Sun tinha previsto. Pior ainda, um contrato importante pelo qual a Sun competia fora concedido a outra empresa. Então, o projeto estava em risco de cancelamento. Por pura sorte, a World Wide Web explodiu em popularidade em 1993 e as pessoas da Sun viram o imediato potencial de utilizar Java para criar páginas da Web com o chamado conteúdo dinâmico. Isso deu nova vida ao projeto. Em maio de 1995, a Sun anunciou Java formalmente em uma conferência importante. Normalmente, um evento como esse não teria gerado muita atenção. Entretanto, Java gerou interesse imediato na comunidade comercial por causa do fenomenal interesse pela World Wide Web. Java é agora utilizada para criar páginas da Web com conteúdo interativo e dinâmico, para desenvolver aplicativos corporativos de grande porte, para aprimorar a funcionalidade de servidores da World Wide Web (os computadores que fornecem o conteúdo que vemos em nossos navegadores da Web), fornecer aplicativos para dispositivos destinados ao consumidor final (como telefones celulares, pagers e assistentes pessoais digitais) e para muitas outras finalidades. CARACTERÍSTICAS: Orientada a objetos Simples e robusta: Aperfeiçoamento do C++; Trata obrigatoriamente exceções e o gerenciamento automático de memória. Gerenciamento de memória: gerencia o processo de alocação e liberação da memória. Independência da plataforma: Roda em qualquer Sistema Operacional devido a Máquina Virtual Java. PLATAFORMAS JAVA: Java 2 Standard Edition (J2SE): Suficiente para aplicação desktop com ou sem interface gráfica. Java 2 Enterprise Edition (J2EE): Desenvolvimento de aplicações distribuídas. Java 3 Micro Edition (J2NE): Desenvolvimento de aplicações para aparelhos portáteis. JAVA 2 SYSTEM DEVELOPMENT KIT (J2DK) Produto utilizado pelo Sun que implementa J2SE. Consiste em: JRE (Java Runtime Envoirement): ambiente para execução de aplicações. Ferramentas para desenvolvimento: compilador, debugger, empacotador JAR, etc. Conjunto de API’s e código fonte das classes. A MÁQUINA VIRTUAL JAVA O JRE é um conjunto de programas que possibilita execução de aplicações Java. O coração do JRE é a Máquina Virtual Java ou Java Machine (JVM) que favorece a portabilidade do código. ESQUEMA DE COMPLILAÇÃO E EXECUÇÃO DE UM PROGRAMA EM JAVA PROGRAMA JAVA - Características / Observações Salvar o código com extensão .java Quando compilado será gerado no mínimo um .class para cada .java existente Java é Case-Sensitive Comentários //uma linha /* várias linhas */ Possui conversões entre programadores. Ex.: CONSTANTES (MAIÚSCULO) variáveis (minúsculo) Classes (1.ª Letra Maiúscula) 1 Palavras Reservadas em Java / Tipos de Dados Toda linguagem de programação possui palavras que são reservadas, ou seja, não podem ser utilizadas como nomes de variáveis, classes, etc. Verifique as palavras reservadas em Java: Palavra Reservada Descrição public Comando para criar classes ou membros públicos. private Comando para criar classes ou membros privados. protected Comando para criar classes ou membros protegidos. static Comando para criação de classes ou membros estáticos. abstract Comando para criação de classes abstratas. final Comando para determinação de tipo de dados strictfp Comando para determinação de tipo de dados transient Comando para determinação de tipo de dados synchronized Comando para determinação de tipo de dados native Comando para determinação de tipo de dados void Comando identificando que o método não retornará valor. class Comando para definição de uma classe. interface Comando para identificar uma classe contendo apenas as assinaturas de métodos que serão implementados por outra classe. implements Comando utilizado para implementar método de outras classes extends Comando para aplicar o conceito de herança. if Comando de Decisão else Comando de Decisão do Comando de Repetição default Comando auxiliar do comando switch swith Comando de Decisão case Comando de Decisão break Comando para parar o processamento continue Comando para continuar o processamento goto Comando de desvio (não aconselhável) throws Comando que define o aguardo de uma determinada exceção new Comando para instanciar objetos de uma determinada classe catch Comando para tratamento de exceções try Comando para tratamento de exceções finally Comando para definir quando finalizar o comando try... catch... return Comando para retornar valores this Comando para referenciar métodos ou atributos da própria classe package Comando para definir pacotes import Comando para importar pacotes ou classes 2 instaceof Comando para teste de instância de classes while Comando de Repetição for Comando de Repetição volatile Comando para determinação de tipo de dados Super Comando que se aplica o conceito de herança Tipos de Dados em Java – Descrição Tipo Descrição boolean Pode assumir o valor true ou o valor false char Caractere em notação Unicode de 16 bits. Serve para a armazenagem de dados alfanuméricos. Também pode ser usado como um dado inteiro com valores na faixa entre 0 e 65535. byte Inteiro de 8 bits. Pode assumir valores entre -128 e 127. short Inteiro de 16 bits. Os valores possíveis cobrem a faixa de -32.768 e 32.767. int Inteiro de 32 bits. Pode assumir valores entre -2.147.483.648 e 147.483.647. long Inteiro de 64 bits. Pode assumir valores entre -2e63 e 2e63-1. float Representa números em notação de ponto flutuante. O menor valor positivo representável por esse tipo é 1.40239846e-46 e o maior é 3.40282347e+38. bouble Também representa números em notação de ponto flutuante. O menor valor positivo representável é 4.94065645841246544e-324 e o maior é 1.7976931348623157e+308. Tipos primitivos, limites de representação e constantes Tipo Tam primitivo Mínimo Máximo Exemplos de Constantes boolean 1 bit - - true, false char 16 bits Unicode 0 Unicode 65.535 'a' (letra a) byte 8 bits -128 +127 97, -23 0x65 (hexadecimal) short 16 bits -215 (-32.768) +215-1(32.767) 17569, -21875 int 32 bits -231 (uns -2 bi) +231-1 (uns 2 bi) 1876345240, -2000000000 long 64 bits -263 (uns -9 quintilhões) +263-1 (uns 9 quintilhões) 123981723971982318273L, -12381726387613678688L, 97L, -23L, 0L float 32 bits aprox -1038 (6-7 dígitos significativos) aprox +1038 (6-7 dígitos significativos) -3.4F 45.78E+23F double 64 bits aprox -10308 (15 aprox +10308 (15 dígitos significativos) dígitos significativos) void indica ausência de tipo (quando um "método" nada retorna) -3.4 45.78E+23 3 Hello Word Um exemplo simples para um primeiro programa em Java. public class HelloWorld{ public static void main(String Args[]){ System.out.println(“Hello World”); } } Digite o código acima no bloco de notas e salve o documento com o nome HelloWorld.java. No Prompt de Comando acesse o diretório onde o arquivo foi salvo e digite javac HelloWorld.java para compilar o programa. Em seguida, execute o programa digitando java HelloWorld. Operadores Operadores matemáticos + (soma) - (subtração) * (multiplicação) / (divisão) % (módulo) Há operadores unários - e + Operadores binários podem ser seguidos de =, tal como na seguinte expressão: soma += nota*peso; // equivalente a soma = soma + nota*peso Operador de String + (overload do operador par concatenar strings) Operadores de auto-incremento e auto-decremento númeroDeAlunos++; // equivalente a númeroDeAlunos = númeroDeAlunos + 1 númeroDeAlunos--; // equivalente a númeroDeAlunos = númeroDeAlunos – 1 if(númeroDeAlunos-- > 0) // equivalente a testar númeroDeAlunos e depois decrementar if(--númeroDeAlunos > 0) // equivalente a decrementar e depois testar númeroDeAlunos 4 Operadores relacionais < (menor) <= (menor ou igual) > (maior) >= (maior ou igual) == (igual) != (não igual) Operadores lógicos && (AND) || (OR) ! (NOT) Exemplos: if(númeroDeAlunos > MAX_ALUNOS || númeroDeProfessores > MAX_PROFS) ... if(ano % 4 == 0 && ano % 100 != 0 || ano % 400 == 0) ... // ano bissexto Operador ternário Para escrever uma operação condicional sem usar if-else Exemplo: // a linha seguinte média = númeroDeNotas == 0 ? 0.0 : soma/númeroDeNotas; // é equivalente às linhas seguintes if(númeroDeNotas == 0) { média = 0.0; } else { média = soma/númeroDeNotas; } 5 PROGRAMAS EXEMPLOS: 1) Entrada de dados, tipos básicos, variáveis, decisões simples Ler 3 números inteiros da entrada, imprimir o menor e o maior. package p2.exemplos; import java.util.Scanner; /* * "Ler 3 números inteiros da entrada, imprimir o menor e o maior" * * Autor: Jacques Sauvé */ public class MinMax1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n1, n2, n3; System.out.print("Entre com o primeiro inteiro: "); n1 = sc.nextInt(); System.out.print("Entre com o segundo inteiro: "); n2 = sc.nextInt(); System.out.print("Entre com o terceiro inteiro: "); n3 = sc.nextInt(); if (n1 > n2) { if (n1 > n3) { if (n2 < n3) { System.out.println("O menor numero eh: " + n2); } else { System.out.println("O menor numero eh: " + n3); } System.out.println("O maior numero eh: " + n1); } else { if (n1 < n2) { System.out.println("O menor numero eh: " + n1); } else { System.out.println("O menor numero eh: " + n2); } System.out.println("O maior numero eh: " + n3); } } else { if (n2 > n3) { if (n1 < n3) { System.out.println("O menor numero eh: " + n1); } else { System.out.println("O menor numero eh: " + n3); } System.out.println("O maior numero eh: " + n2); } else { if (n1 < n2) { System.out.println("O menor numero eh: " + n1); } else { System.out.println("O menor numero eh: " + n2); 6 } System.out.println("O maior numero eh: " + n3); } } } } Uma saída típica: Entre com o primeiro inteiro: 3 Entre com o segundo inteiro: 9 Entre com o terceiro inteiro: 123 O menor numero eh: 3 O maior numero eh: 123 A linha import java.util.Scanner; é usada para dizer ao Java que usaremos alguma coisa externa ao nosso programa (a "classe" Scanner) A linha Scanner sc = new Scanner(System.in); cria um "Scanner" que é usado para ler dados da entrada A linha n1 = sc.nextInt(); lê um inteiro da entrada Poderíamos substituí-la por: int n1 = sc.nextInt(); Outra solução para o programa acima: package p2.exemplos; import java.util.Scanner; /* * "Ler 3 números inteiros da entrada, imprimir o menor e o maior" * * Autor: Jacques Sauvé */ public class MinMax2 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n1, n2, n3; System.out.print("Entre com o primeiro inteiro: "); n1 = sc.nextInt(); System.out.print("Entre com o segundo inteiro: "); n2 = sc.nextInt(); System.out.print("Entre com o terceiro inteiro: "); n3 = sc.nextInt(); int mínimo; int máximo; if (n1 > n2) { 7 if (n1 > n3) { if (n2 < n3) { mínimo = n2; } else { mínimo = n3; } máximo = n1; } else { if (n1 < n2) { mínimo = n1; } else { mínimo = n2; } máximo = n3; } } else { if (n2 > n3) { if (n1 < n3) { mínimo = n1; } else { mínimo = n3; } máximo = n2; } else { if (n1 < n2) { mínimo = n1; } else { mínimo = n3; } máximo = n3; } } System.out.println("O menor numero eh: " + mínimo); System.out.println("O maior numero eh: " + máximo); } } Estrutura básica de um programa em JAVA O desenvolvimento de aplicações Java sempre é feito através de classes. A definição de uma classe Java deve respeitar a seguinte sintaxe: <modificador de acesso> class <nome da classe> { <Declaração das Variáveis de Instância (Atributos)> <Declaração de Métodos> public static void main( String args[] ) { //corpo principal do programa } } 8 Membros de uma Classe As variáveis de instância formam os atributos de um objeto e, juntamente com os métodos, são os elementos básicos para a formação de uma classe. Eles são denominados membros da classe. Os atributos são espaços em memória reservados para armazenar informações durante a execução da classe. Eles constituem o estado interno de um objeto. Os atributos são inicializados no início da execução da classe e ficam disponíveis para utilização por todos os seus métodos. Os métodos por sua vez definem as operações que podem ser realizadas pela classe. O Método Main Uma aplicação em Java é caracterizada por possuir o método main(). A declaração do método deve ser : public static void main( String[] args ). O método main é um método especial pois representa o ponto de entrada para a execução de um programa em Java. Quando um programa é executado, o interpretador chamará primeiramente o método main da classe. É ele quem controla o fluxo de execução do programa e executa qualquer outro método necessário para a funcionalidade da aplicação. Nem toda classe terá um método main. Uma classe que não possui um método main não pode ser “executada” pois não representa um programa em Java. Ela será sim, utilizada como classe utilitária para a construção de outras classes ou mesmo de um programa. Modificadores de Acesso A declaração de uma classe geralmente começa com o modificador de acesso public, o que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe será visível apenas por outras classes do mesmo pacote que a contém. Outros modificadores de acesso são: private, protected, etc. Entrada de Dados A classe Scanner possui os seguintes métodos para leitura: String nome = entrada.next(); lê uma String byte num = entrada.nextByte(); lê um byte short num = entrada.nextShort(); lê um short int num = entrada.nextInt(); lê um int long num = entrada.nextLong(); lê um long float num = entrada.nextFloat(); lê um float double num = entrada.nextDouble(); lê um double dentre outros Exemplo: // Programa Programa.java import java.util.Scanner; public class Programa { public static void main (String args[]) { Scanner entrada = new Scanner(System.in); //criação de um novo Scanner para utilização System.out.println(“Entre com o primeiro numero: ”); 9 int num1 = entrada.nextInt(); System.out.println(“Entre com o segundo numero: ”); int num2 = entrada.nextInt(); System.out.println(“A soma e “ + (num1+num2)); } // fim do método main } // fim da classe Programa Controle de Fluxo A maioria dos programas tomam decisões que afetam seu fluxo. Os comandos que tomam essas decisões são chamados de comandos de controle. 1) Comando if – else Sintaxe : if ( boolean_expr ) comando1; [else comando2;] Exemplo : if ( fim = = true ) System.out.println(“Término!”); else System.out.println(“Continuando...”); Para mais de um comando ser executado depois da declaração, utiliza-se o conceito de blocos, delimitados por { }. Exemplo: if ( fim = = false ) && (cont > 0){ cont ++; System.out.println(“Continuando...”); } else { cont = 0; System.out.println(“Término!”); } É recomendado sempre usar blocos de comandos para facilitar a leitura e compreensão do código. É possível também criar comandos if aninhados. Exemplo : if ( fim = = false) && (cont < 0){ cont++; } else if (fim = = false) && (cont > 0){ cont--; } else { cont = 0; System.out.println(“Término!!”); } 10 2) Comando Switch Utilizamos o comando switch para avaliar uma expressão contra vários resultados possíveis. Aceita somente um char, byte, short ou int como sua expressão de comparação. O valor é procurado nas declarações case que vem depois da declaração switch e o código adequado é executado. Sintaxe : switch ( expressão ) { case constant1 : comando1; break; case constant2 : comando2; break; ... [default : comando_default;] } Exemplos : switch ( cmd ){ case 0: System.out.println(“Item do menu 1”); menu = ++cmd; break; case 1: System.out.println(“Item do menu 2”); menu = ++cmd; break; case 2: System.out.println(“Item do menu 3”); menu = ++cmd; break; default: System.out.println(“Comando invalido!”); } 3) Comando while Implementa um loop para executar um bloco de comandos sucessivas vezes. A expressão de comparação é avaliada antes que o laço seja executado. Sintaxe : while ( boolean_expr ) { comandos; } 4) Comando do - while Utilizado quando se quer que o corpo do laço seja necessariamente executado pelo menos uma vez A expressão de comparação é avaliada depois que o laço for executado. Sintaxe: do { comandos; } while ( boolean_expr ); 5) Comando for 11 Comumente, um loop for possui uma parte inicial com a inicialização das variáveis, seguida por uma expressão de comparação e depois a parte final com o incremento ou decremento das variáveis do laço. Sintaxe : for ( inicialização; condição; iteração ) { comandos; } Pode-se declarar variáveis na inicialização do for. for (int i = 0; i<10; i++) comando O único elemento realmente imprescindível é a condição. É possível construir laços for sem a inicialização e/ou o incremento. int 1 = 2; for ( ; i<10 ; ){ comandos; i++; } A inicialização e incremento podem ser feitos com mais de uma variável. Neste caso devem estar separados por vírgula. for ( i = 0, j = 10 ; i < 8 && j > 2 ; i ++, j-- ) comando; 6)Comando break O break é utilizado para transferir o controle para o final de uma construção de laço (for, do-while, while) ou de um switch. O laço vai encerrar independentemente de seu valor de comparação e o comando após ele será executado. Exemplo: int i = 0; while (true) { System.out.println(i); i++; if ( i > 10 ) break; } 7) Comando continue Quando o comando continue é encontrado (somente dentro de um laço), ele pára a execução naquele ponto e a transfere de volta para o início do laço para dar início a uma nova iteração. Exemplo : for (int i = -10; i<10; i++) { if ( i = = 0 ) continue; System.out.println(1/i); //Não deve ser executado o cálculo 1/0 !! } 12 EXERCÍCIOS 1 – Identifique e corrija os erros dos códigos abaixo: 2 – Obtenha do usuário três notas de exame e calcule a média dessas notas. Reproduza a média dos três exames. Junto com a média, mostre também um :-) no resultado se a média for maior ou igual a 60; caso contrário mostre :-(. Use a classe Scanner para obter as notas do usuário e System.out para mostrar o resultado. 3 – Exercício Desafio - Determine o número de dias num mês. Você deve usar um comando switch para apresentar um inteiro com o número de dias no mês especificado. Por enquanto adicione todo o código no método main(). a) Declare três inteiros, um para manipular os dias (1-31), outro os meses (1-12) e um terceiro para manipular o ano. Inicialize estas variáveis com um dia da sua escolha. b) Imprima a data no formato dd/mm/yyyy. c) Declare uma variável para armazenar o número de dias que contém o mês escolhido. Então, usando o comando switch, determine o valor para esta variável. São 30 dias em Abril, Setembro, Junho e Novembro e 31 nos restantes exceto para Fevereiro que tem 28 (ignore o ano bissexto). Experimente executar o programa com diferentes valores para o mês. O que acontece se ele for executado com um mês inválido como 13? Para 27 de Janeiro de 2010 a saída deve ser algo como: 27/1/2010 31 dias no mês 3 – Use um laço for para mostrar datas. a) Usando um laço for, estenda seu programa de forma que ele imprima todas as datas entre a que você especificou até o final daquele mês. Para 27/1/2010, a saída deve ser: 13 27/1/2010 28/1/2010 29/1/2010 30/1/2010 31/1/2010 b) Teste o programa para verificar se ele está funcionando corretamente com várias datas diferentes. c) Agora o modifique para que ele imprima no máximo 10 datas. Por exemplo, se a data for 19/1/2010 o programa deve imprimir apenas as datas 19/1/2010 até 28/1/2010. Já se a data for 30/1/2010, deverá ser impresso apenas 30/1/2010 e 31/1/2010. d) Compile seu programa, corrija os erros se ocorrer algum, e teste com pelo menos 3 datas para ter certeza que está funcionando corretamente. 4 – Considere que a data que você escolheu é a data de empréstimo de uma mercadoria e que é necessário saber qual a data de devolução da mesma. A data de devolução é a data atual mais 3 dias. a) Declare três variáveis para controlarem o dia , mês e ano da data de devolução e uma outra com a quantidade de dias de empréstimo (inicializada com 3). b) Crie o código para calcular a adição do tempo de empréstimo com a data escolhida. A saída deve se assemelhar a algo como: Data do Empréstimo : 27/2/2010 Número de Dias : 3 Data da Devolução : 2/3/2010 Preste atenção na saída acima. A soma de três dias na data de empréstimo resultou na passagem de um mês para outro. Além disso, como o ano 2010 não é bissexto e o mês de empréstimo foi fevereiro, ao somar-se 3 dias os dias que se passaram foram : 28/2 – 1/2 – 2/3 . Você deve estar atento também para: Se o empréstimo passar de um mês para outro o mês deve ser incrementado Se o empréstimo passar de um ano para outro o ano dever ser incrementado 14