Introdução a Linguagem Java Alcione Benacchio Bibliografia Java: Como Programar Harvey M. Deitel - Paul J. Deitel Java: O Guia Essencial Deivid Flanagan Tecnologia Java A tecnologia Java foi lançada em 1995, e desde então tem crescido em popularidade e se tornado uma plataforma muito estável e madura. Ela é composta por uma gama de produtos, baseados na abrangência da internet e na idéia de que um software deveria ser capaz de rodar em diferentes máquinas, sistemas e dispositivos. Estes dispositivos podem ser computadores, servidores, notebooks, handhelds, PDAs(Palm), celulares, TVs, geladeiras, entre outros. Os programas feitos em Java rodam em diferentes ambientes graças a um componente da plataforma chamado JVM (Java Virtual Machine) – que é um tipo de tradutor de código Java para instruções específicas de cada sistema e dispositivo. 3 Tecnologia Java A Tecnologia Java é basicamente dividida em: JSE – Java Standard Edition JEE – Java Enterprise Edition JME – Java Micro Edition A tecnologia Java não é um produto, mas sim uma especificação definida pela Sun (www.java.sun.com). Java é: uma completa plataforma de soluções para tecnologia um ambiente de desenvolvimento uma linguagem de programação 4 JSE - Java Standard Edition JSE permite o desenvolvimento de aplicações Java para desktop ou cliente/servidor. É composta por: JRE: provê a API Java, a Java Virtual Machine e outros componentes necessários para rodar aplicações escritas na Linguagem Java. JDK: contém tudo o que há na JRE além de ferramentas como compiladores e debugadores necessários para desenvolver as aplicações. A versão mais recente é a JSE 6. Download: http://java.sun.com/javase/downloads/index.jsp, link JDK 6. 5 JEEe JME JEE: é o padrão para desenvolvimento de sistemas corporativos, voltada para aplicações multi-camadas, baseadas em componentes executados em servidores de aplicações. Contém bibliotecas para acesso a base de dados, RPC, CORBA, entre outras. JME: é o padrão aplicado a dispositivos compactos, como celulares, PDAs, controles remotos, e uma gama de dispositivos. Permite o desenvolvimento de software embarcados, ou seja, aplicações que rodam em um dispositivo de propósito específico, desempenhando alguma tarefa que seja útil para o dispositivo. 6 IDEs IDEs para o desenvolvimento em Java: Eclipse 3.2.1 www.eclipse.org NetBeans 5.5 http://www.netbeans.org/index.html 7 Introdução à Linguagem Java A linguagem Java foi designada para ser: Orientada a Objetos: permite a criação de classes, herança e polimorfismo. A interação do sistema se dá pela interação dos objetos nele criados. Distribuída: dá suporte a aplicações distribuídas (RMI, CORBA, URL) Simples: não permite a manipulação direta da memória (ponteiros em C), possui o garbage collector para remover objetos não referenciados, possui o tipo básico boolean para manipular estados de verdade e falsidade. 8 Introdução à Linguagem Java A linguagem Java foi designada para ser: Multithread: permite a execução de diversas tarefas ao mesmo tempo. Segura: possui medidas de segurança para proteger o código de ataques (não usa ponteiros, não permite que applets tenham acesso ao computador dos clientes). Independente de plataforma: Write Once, Run Everywhere 9 Introdução à Linguagem Java Dependência de Plataforma compilação de código na linguagem C, C++ Para rodar em diferentes plataformas, o código em C deve ser compilado em diferentes compiladores. Código proprietário. 10 Introdução à Linguagem Java Independência de Plataforma JAVA: processos de compilação e interpretação Pode-se escrever o código em uma plataforma e executá-lo em outra, com poucas ou nenhuma alteração a ser feita. 11 Introdução à Linguagem Java Independência de Plataforma: Com o compilador, primeiramente o programa é convertido em bytecodes Java – um código independente de plataforma que é interpretado na plataforma Java. O interpretador lê e executa cada instrução em bytecode no computador. O código é compilado uma única vez; a interpretação ocorre a cada execução da aplicação e é feita pela JVM. 12 Plataforma Java A plataforma é o ambiente de hardware e software em que um programa é executado. A maioria das plataformas pode ser descrita como a combinação do sistema operacional e da arquitetura de hardware. A plataforma Java difere das demais por ser apenas uma plataforma de software que roda sobre qualquer plataforma de hardware. Possui dois componentes: Java Virtual Machine (JVM): base da plataforma Java e portável para várias plataformas de hardware. Parte de software que executa código, tarefa normalmente efetuada pela CPU. Java Application Programming Interface (Java API): grande coleção de componentes de software prontos que provêm diversas capacidades, como ambiente gráfico e funcionalidades específicas. A API é agrupada em bibliotecas de classes a interfaces, sendo estas bibliotecas conhecidas como pacotes. 13 JAVA API http://java.sun.com/javase/6/docs/api/ A API é composta por diversas classes utilitárias Java, organizadas por pacotes. Pacotes servem para agrupar classes com funcionalidades semelhantes. pacotes ≈ diretórios classes ≈ arquivos Na API são detalhadas todas as classes Java e há explicações sobre a funcionalidade das classes, a identificação de atributos e o detalhamento de métodos. Tutorial: http://java.sun.com/docs/books/tutorial/getStarted/ 14 Codificação Detalhes iniciais Java é uma linguagem fortemente tipada. Não existem variáveis globais ou ponteiros. Java é case-sensitive: variavel ≠ Variavel ≠ VARIAVEL Boas práticas: tabular corretamente o código usar padrões de nomenclatura usar nomenclatura clara e inteligível comentar o código 16 Detalhes iniciais Regras de nomenclatura: não iniciar nomes com números ou caracteres especiais classes: inicial maiúscula atributos, métodos e variáveis: tudo em minúsculas; se houver mais de uma palavra, primeira palavra toda em minúsculas, demais palavras com inicial maiúscula java.util, java.lang, javax.swing constantes: tudo em maiúsculas nome, anoNascimento, getNome( ), setSalarioInicial( ) pacotes: tudo em minúsculas String, Vector, AcervoGeral, ControleContas PI, E Normalmente não se usam os caracteres “_” e “-” no nome de classes, variáveis ou métodos. 17 Detalhes iniciais Blocos de código são delimitados por “{” e “}” e definem o escopo das variáveis. O nome da classe deve ser idêntico ao nome do arquivo .java (considerando maiúsculas/minúsculas). Arquivo: Livro.java public class Livro { private String autor; private String titulo; public Livro(String autor, setAutor(autor); setTitulo(titulo); } } 18 Primeiro programa public class PrimeiroPrograma{ public static void main(String[] args){ // amostragem na tela System.out.println(“Primeiro programa”); } } define o início da classe 1º método a ser executado (deve ser mantida esta linha sem alterações) Este código deve ser escrito no arquivo PrimeiroPrograma.java. Ao ser compilado, irá gerar o arquivo de bytecodes PrimeiroPrograma.class. O arquivo .class é interpretado pela JVM e gera a execução do programa. Na tela, deve aparecer a mensagem “Primeiro Programa”. 19 Análise do Primeiro Programa public class PrimeiroPrograma public: modificador de acesso (acesso público) class: define o início da classe PrimeiroPrograma: nome da classe public static void main(String[] args) (este método é o ponto de partida do programa) public: modificador de acesso (acesso público) static: método pertence à classe void: método não possui retorno main: nome do método String[] args: parâmetro de entrada do método, array de Strings System.out.println(“Primeiro programa”); System.out.println: método de amostragem na tela “Primeiro programa”: mensagem a ser mostrada na tela 20 Análise do Primeiro Programa A classe que inicia a execução de um programa stand-alone deve possuir o método main. Comentários: // comentário de uma linha /* bloco de comentários com mais de uma linha */ /** bloco de * comentários * formato javadoc **/ 21 Fundamentos da Linguagem Java Criação de variáveis Variáveis são utilizadas nas linguagens em geral para armazenar um determinado valor. Toda variável deve ser declarada e inicializada. a declaração define o tipo da variável a inicialização define o seu valor inicial <tipo da variável> <nome da variável>; <nome da variável> = valor; <tipo da variável> <nome da variável> = valor; Uma vez criada uma variável, de acordo com um tipo definido, este tipo não pode ser alterado. 23 Tipos Básicos Existem 8 tipos básicos (primitivos) em Java: Tipo Lógico boolean Tamanho (bits) Mínimo Máximo Default Sem sinal 1/16 false true false x x Caracter char 16 0 216-1 0 Inteiro short 8 -27 27-1 0 byte 16 -215 215-1 0 int 32 -231 231-1 0 long 64 -263 263-1 0 float 32 7 casas decimais 0.0 double 64 15 casas decimais 0.0 Decimal 24 Tipos Básicos public class TiposBasicos { public static void main(String[] args) { //declaração (i não possui valor) int i; //inicialização e apresentação na tela i = 5; System.out.println(“Valor de i: ” + i); //declaração e inicialização double d = 15.2; // caracter char c = 'a'; c = '\t'; c = '\u0043'; // valor Unicode para A // lógico boolean b = true; b = false; // demais tipos básicos float f = 5.2f; byte bb = 127; short s = 1024; long l = 1234567890; int x,y,z; } Valores expressos no código são chamados literais. Literais inteiros (5) são do tipo int; literais com ponto flutuante (15.2) são do tipo double. Base octal: acrescentar 0 na frente do literal int a = 0164 (11610) Base hexadecimal: acrescentar 0x na frente do literal int a = 0x164 (35610) } 25 String String não é um tipo básico, é uma classe do Java usada para representar textos (cadeias de caracteres). A classe String possui métodos que permitem a manipulação da sua cadeia de caracteres. public class TesteStrings { public static void main(String[] args) { // declaração (s vale null) String s; // inicialização s = "Ana dos Santos"; // declaração e inicialização String s2 = "Roberto Padilha"; System.out.println("Igual: " + s.equals(“Ana dos Santos”)); System.out.println("Tamanho de s: " + s.length()); System.out.println("Caracter da posição 5 de s2: " + s.charAt(5)); } } 26 Operadores Aritméticos + += ++ - -= -- * *= / /= % %= Relacionais > < != == >= <= (resto da divisão) int a = 5; boolean b = (a = = 10); System.out.println(!b); int c = 10 % 3; System.out.println(c); double d = 15.3; d += 10; System.out.println(d); boolean e = (d > 10 && d <= 50) System.out.println(e); Lógicos ! && || (negação) (e) (ou) Bit a bit & | ^ ~ (e) (ou) (xor) (negação lógica) int i = 1; int j = 2; int k = ++j; System.out.println("K: System.out.println("J: int l = i++; System.out.println("L: System.out.println("I: k++; " + k); " + j); " + l); " + i); 27 Conversões As conversões podem ser implícitas: tipo menor para tipo maior explícitas: tipo maior para tipo menor. De ponto flutuante para inteiro pode haver perda de informação. byte short char int float 8 16 32 long double 64 implícita explícita 28 Conversões Entre tipos básicos Se há tipos diferentes em uma expressão, é feita a conversão implícita para o maior tipo da expressão. double a1 = 10 * 5.2 + 4 – 1.3f; a1 = 54.7 double a2 = 5 / 2; a2 = 2.0 double a3 = 5 / 2.0; a3 = 2.5 A conversão explícita é marcada no código (também chamada casting): int a4 = (int) 10 * 5.2 + 4 – 1.3f; a4 = 54 int a5 = (int) 5 / 2.0; a5 = 2 29 Conversões Entre String e valor numérico: como String não é um tipo básico, é necessário utilizar classes do Java que fazem a conversão de um texto em um número. Classes Wrapper: classes que representam os tipos básicos: Character Byte, Short, Integer, Long Float, Double String s = 10; int a1 = Integer.parseInt(s); float a2 = Float.parseFloat(s); double a3 = Double.parseDouble(s) a1 = 10 a2 = 10.0f a3 = 10.0 30 Exemplo de Código Elaborar uma classe que contenha métodos para: calcular a área de um retângulo calcular o perímetro de um retângulo. Executar o código de modo que o área e o perímetro de um retângulo de base 7 e altura 5 sejam mostrados na tela. Área: altura = 5 base = 7 base x altura Perímetro: 2 x base + 2 x altura 31 Exemplo de Código public class TesteRetangulo { public static double calculaArea(double base, double altura){ double area = base * altura; return area; } public static double calculaPerimetro(double base, double altura){ return 2 * base + 2 * altura; } public static void main(String[] args){ int b = 7; int h = 5; double a = calculaArea(b,h) System.out.println("Area: " + a); System.out.println("Perimetro: " + calculaPerimetro(b,h)); } } 32 Análise do Código A classe TesteRetangulo é composta por 3 métodos: calculaArea, calculaPerimetro, main Assinatura de um método: <modificadorDeAcesso> <static> tipoDeRetorno nomeDoMetodo (<listaDeParâmetros>) public static double calculaArea(double base, double altura) public static void main(String[] args) modificadorDeAcesso: delimita visibilidade do método (opcional) static: não é necessário criar objeto para chamar o método, o método pertence à classe (opcional) tipoDeRetorno: tipo básico, tipo abstrato (classe), ou void quando não há retorno listaDeParâmetros: o que entra no método; cada parâmetro deve ter um tipo associado (opcional) 33 Análise do Código Primeiramente é executado o método main onde são criadas as variáveis b e h, que recebem os valores 7 e 5 respectivamente. Ao chamar o método calculaArea(b, h), há um desvio para o método calculaArea, onde os parâmetros de entrada base e altura recebem os valores de b e h, respectivamente. Ao entrar no método calculaArea, é criada a variável area que assume o valor da expressão base x altura (35). O valor desta variável é retornado à variável a do método main. A variável a é apresentada na tela. Processo semelhante ocorre na chamada do método calculaPerimetro(b,h). 34 Análise do Código Escopo: as variáveis b, h e a são visíveis apenas no método main (variáveis locais do método main) os parâmetros base e area e a variável area são visíveis somente no método calculaArea os parâmetro base e area e a variável perímetro são visíveis somente no método calculaPerimetro. ao término da execução de um métodos, seus parâmetros e variáveis locais são apagados da memória. Por mais que haja dois métodos com parâmetros de nomes idênticos, os momentos de execução são diferentes. Por isso, não há confusão entre os parâmetros. 35 Análise do Código Este tipo de codificação não envolve o conceito de orientação a objetos propriamente dito, uma vez que não são criados objetos, todos os métodos são estáticos, não há herança e polimorfismo. Entretanto, representa uma classe utilitária que possui métodos de significado semelhante que podem ser utilizados futuramente por outras classes. 36 Exercício Elaborar uma classe que possua as seguintes funcionalidades de uma calculadora: somar dois números subtrair dois números multiplicar dois números dividir dois números No método main, executar os métodos com valores definidos e mostrar o resultado na tela no seguinte formato: Soma de 5 e 7: 12 Multiplicação de 3 e 6: 18 37 Estruturas de Seleção Uma estrutura de seleção permite a escolha de um grupo de ações (ou bloco de ações) a ser executado quando determinadas condições, representadas por expressões lógicas ou relacionais, são ou não satisfeitas. As estruturas de seleção são: if/else (seleção simples) switch (seleção múltipla) 38 Estruturas de Seleção – if/else public static boolean maior(int a, int b){ if (a > b){ return true; } else { return false; } public static boolean maior(int a, int b){ return a > b ? true : false; } public static String categoria(int idade){ if (idade <= 12){ return “Infantil”; } else if (idade <= 18){ return “Adolescente”); } else if (idade <= 60){ return “Adulto”; } else if (idade > 60) return “Idoso”; } Método que retorna verdadeiro caso o 1º parâmetro seja maior que o 2º Utilização do operador ? : para o mesmo problema Método que testa intervalos por meio de ifs aninhados. 39 Estruturas de Seleção - switch public static void mostraOpcao(int opcao){ switch (opcao){ case 1: System.out.println(“1: Incluir”); break; case 2: System.out.println(“2: Alterar”); break; case 3: System.out.println(“3: Excluir”); break; case 4: System.out.println(“4: Imprimir”); break; default: System.out.println(“Opcao invalida”); } } Método que mostra uma mensagem em função de um número. A variável de teste (opcao) deve ser dos tipos char, byte, short ou int. Neste método, a variável opcao pode assumir os valores 1, 2, 3 ou 4. Caso possua outro valor, a mensagem “Opção inválida” é apresentada na tela. O comando break delimita o final de um case. Sempre deve ser utilizado em cases intermediários. 40 Estruturas de Repetição Estrutura de controle de fluxo e execução que permite repetir diversas vezes um mesmo trecho de código. Repetem um bloco de código enquanto uma determinada condição for veradeira. As estruturas de repetição são: while do/while for 41 Estruturas de Repetição - while Primeiro testa, depois executa. Controle de parada associado a uma variável. Se a variável não for atualizada, gera-se um laço infinito. public static void mostraPares(int valor){ int contador = 2; while(contador <= valor){ System.out.println(contador); contador += 2; } } Método que mostra os número pares entre 2 e um valor passado como parâmetro. A variável de controle é chamada contador. A expressão contador += 2 é equivalente a contador = contador + 2 Para gerar um laço infinito, escreve-se while(true) 42 Estruturas de Repetição - do/while Primeiro executa, depois testa. Executa pelo menos 1 vez. Controle de parada associado a uma variável. Se a variável não for atualizada, gera-se um laço infinito. public static void mostraPares(int valor){ int contador = 2; do{ System.out.println(contador); contador += 2; } while(contador <= valor) } Método que mostra os número pares entre 2 e um valor passado como parâmetro. Estrutura de repetição menos utilizada. 43 Estruturas de Repetição - for Primeiro testa, depois executa. Normalmente utilizado em situações onde há contagem. Variável de controle de parada associada à própria estrutura do for. public static void mostraPares(int valor){ for(int i = 0; i <= valor; i+=2){ System.out.println(contador); } } Método que mostra os número pares entre 2 e um valor passado como parâmetro. Comando composto por 3 partes separadas por “;” : inicialização da variável de controle condição de parada atualização da variável de controle A variável de controle i pode ser declarada na linha do for. Neste caso, só é visível dentro do for (escopo da variável i). 44 Estruturas de Desvio Dentro de uma estrutura de repetição, pode-se: continue: efetuar desvios para o teste da condição break: causar um encerramento forçado durante as repetições. public static void testeDesvio(int valor){ for(int i = 0; i <= valor; i++){ if (i >= valor / 2) break; if (i % 2 != 0) continue; System.out.print(i); } } Método que mostra os número pares entre 2 e a metade de um valor passado como parâmetro. Se a variável i for maior ou igual à metade do valor passado, encerra o laço. Se a variável i for não par, volta para o incremento do for (i++). 45 Arrays Um array é uma estrutura de dados composta por um número finito de componentes (ou elementos), todos eles do mesmo tipo, armazenado de forma contígua na memória, sendo que cada componente é identificado por um índice. Seus elementos podem ser acessados diretamente sem a necessidade de acessar elementos anteriores ao desejado. O tamanho de um array é correspondente à quantidade de componentes que possui. Uma vez criado um array, pode-se alterar o seu conteúdo, mas não o seu tamanho. Ou seja, se for criado um array de 15 elementos, não há como aumentá-lo para 20 ou reduzi-lo para 10. A primeira posição de um array é acessada pelo índice 0. Um array de 10 elementos terá índices variando entre 0 a 9. 46 Arrays Unidimensionais Declaração e inicialização de um array unidimensional (vetor): definir o tipo definir a variável/identificador definir o tamanho ou os elementos iniciais 0 1 2 3 4 5 6 7 8 9 vetor Array declarado mas não inicializado (null) int[] array; Array de 10 inteiros: int[] arrayInt = new int[10]; Array de 5 doubles (valores definidos na criação) double[] arrayDouble = {2.0, .75, 1.5, 4.2, 9.7}; Captura do tamanho do array unidimensional int tam = arrayInt.length; 47 Arrays Unidimensionais public static int[] testeVetor(int tamanho){ int[] vetor = new int[tamanho]; for(int i = 0; i < vetor.length; i++){ if (i % 2 = = 0) vetor[i] = 0; else vetor[i] = 1; } // amostragem na tela com o enhanced for for(int elemento : vetor){ System.out.println(elemento); } return vetor; Método que cria um vetor de qualquer tamanho, inicializao, apresenta-o na tela e o retorna ao final. Enhanced for: melhoria do método for (JAVA 5) sintaxe mais simplificada para percorrer um array não se tem acesso direto ao índice do elemento manipulado } 48 Arrays Bidimensionais Declaração e inicialização de um array bidimensional (matriz): definir o tipo definir a variável/identificador definir o tamanho (linhas e colunas) ou os elementos iniciais 0 1 2 3 0 1 Array declarado mas não inicializado (null) int[][] array; int[][] arrayInt = new int[10][2]; Array de 2x3 inteiros (valores definidos na criação) int[][] arrayInt = {{1, 2, 3}, {4, 5, 6}}; int[][] arrayInt = {{1, 2, 3}, {4, 5, 6}}; matriz Array de 10x2 inteiros: 0 1 0 1 2 3 0 1 2 3 matriz Captura do tamanho do array bidimensional int linhas = arrayInt.length; int colunas = arrayInt[0].length; 49 Arrays Bidimensionais Método que cria uma matriz de qualquer tamanho, inicializa-a, apresenta-a na tela e a retorna ao final. Enhanced for: public static int[][] testeMatriz(int l, int c){ int[][] matriz = new int[l][c]; for(int i = 0; i < matriz.length; i++){ for(int j = 0; j < matriz[0].length; j++){ if (i % 2 = = 0) matriz[i][j] = 0; else matriz[i][j] = 1; } // amostragem na tela com o enhanced for for(int[] linha : matriz){ for(int elemento : linha){ System.out.println(elemento); } return matriz; } como uma matriz é um vetor dentro de vetores, o primeiro for captura um vetor e o segundo for captura os elementos deste vetor. 50 Exercícios