03-03-2011 Linguagem Java Introdução ao Java Diapositivos elaborados por: José Magno José Ribeiro Ricardo Antunes Diapositivos com base em: Vitor Carreira Carlos Urbano 1 Do Código à Execução em Java O programa é compilado uma só vez e gera um ficheiro .class (Java bytecode) A aplicação (java bytecode) é interpretada por uma máquina virtual Java Virtual Machine 2 1 03-03-2011 Do Código à Execução em Java ● Write once, run everywhere 3 Gestão de Memória em Java Não existem ponteiros − O ponteiro é substituído por referências − A aritmética de ponteiros desaparece Verifica em runtime o acesso a tabelas − Garbage Collection automático − Não permite que um índice aceda fora dos limites de uma tabela Não é preciso libertar memória Operação de casting é restrita e é verificada em runtime 4 2 03-03-2011 Plataforma Java Disponível gratuitamente ● ● Java Development Kit 1.6 − Compilador (javac) − Intérprete (java) − Gerador de documentação (javadoc) − Conjunto de bibliotecas standard − Documentação para todas as bibliotecas Java Tutorial − http://java.sun.com/docs/books/tutorial/ 5 Primeira Aplicação em C void main (int argc, char* argv[]) { if (argc == 2) printf ("Ola %s\n",argv[1]); else printf ("Ola mundo!\n"); } 6 3 03-03-2011 Primeira Aplicação em Java public class OlaMundo { public static void main(String[] args) { if (args.length == 1) System.out.println("Olá " + args[0]); else System.out.println("Olá mundo!"); } } 7 Comentários ● Existem três tipos de comentários ● Linha única: // ● Múltiplas linhas: /* */ ● Comentários relativos a documentação (Javadoc): /** */ 8 4 03-03-2011 Comentários - Javadoc Estrutura /** Comentário relativo à classe */ public class OlaMundo { /** Comentário relativo ao atributo */ public int numArgumentos; /** Comentário relativo ao método */ public static void main(String[] args) { System.out.println("Ola mundo!"); } } 9 Identificadores Tal como em C: ● A linguagem Java é case sensitive ● Os identificadores não podem começar por um dígito ● Um identificador não pode ser igual a uma palavra reservada ● Podem conter: − letras {a-z}, {A-Z} − dígitos {0-9} − caracter underscore _ Ao contrário do C, os identificadores podem conter letras acentuadas (caracteres regionais) ● ● Exemplo: olá, identificação_pessoa No entanto só vamos considerar a norma sem underscore (_) e sem caracteres acentuados: identificacaoPessoa 10 5 03-03-2011 Tipos de Dados ● Java suporta dois tipos de dados: Referências ● Classes, interfaces ou arrays Tipos primitivos ● ● ● ● Inteiros Reais Caracteres Booleanos 11 Tipos Primitivos Tipos Tamanho Mínimo Primitivos boolean 1-bit char 16-bit Unicode 0 byte 8-bit -128 short 16-bit -32,768 int 32-bit -2,147,483,648 long 64-bit -9,223,372,036,854,775,808 float 32-bit ±3.4e-38 ±1.7e-308 double 64-bit Máximo Unicode 216-1 127 32,767 2,147,483,647 9,223,372,036,854,775,807 ±3.4e+38 ±1.7e+308 Classe Adaptação Boolean Character Byte Short Integer Long Float Double Nota ● ● ● Ao contrário do C, todos os tipos têm um tamanho fixo. Ao contrário do C, todos os tipos inteiros têm sinal. Não existe o modificador unsigned. Todos os tipos têm uma classe de adaptação (wrapper) que permite transformar um tipo primitivo num objecto. 12 6 03-03-2011 Classes Wrapper A API do Java dispõe dum conjunto de classes que permitem criar objectos equivalentes aos tipos primitivos Tipo primitivo Classe de Adaptação boolean Boolean Exemplo Boolean obj = new Boolean(false); boolean b = obj.booleanValue(); char Character byte Byte Byte obj = new Byte((byte)0); byte b = obj.byteValue(); short Short Short obj = new Short((short)1); short s = obj.shortValue(); int Integer Character obj = new Character(‘X’); char ch = obj.charValue(); Integer obj = new Integer(2); int i = obj.intValue(); long Long Long obj = new Long(3); long l = obj.longValue(); float Float Float obj = new Float(4.1F); float f = obj.floatValue(); double Double Double obj = new Double(5.2); double d = obj.doubleValue(); 13 Autoboxing e Unboxing ● Autoboxing e unboxing são termos dados às funcionalidades que permite utilizar um tipo primitivo com se de um tipo de referência se tratasse, e que permite extrair o valor do tipo primitivo de um tipo de referência. ● O compilador executa a conversão automaticamente e implicitamente. ● Foi introduzido na versão 5.0 do Java. Integer Integer int k = Integer i j 9 l int i = int j = Integer Integer = = + = new new 13; i + Integer(9); Integer(13); // OK em todas as versões do Java j; // erro em versões anteriores à 5.0 4; 5; k = new Integer(i + j); // OK em todas as versões l = i + j; // erro em versões anteriores à 5.0 7 03-03-2011 Declaração de Variáveis ● Diferenças em relação ao ANSI C − − ● ● As variáveis podem ser declaradas em qualquer ponto do programa Dentro de um bloco não se pode declarar uma variável com o nome de uma variável do bloco exterior Por convenção, o identificador de uma variável começa por letra minúscula Todas as variáveis têm de ser iniciadas antes de serem utilizadas 15 Constantes ● char − Carácter entre ‘ ’ − Sequências “Escape” Sequência \ddd \uxxxx \’ \” \\ \r \n \f \t \b Descrição Octal character (ddd) Hexadecimal UNICODE character (xxxx) Single quote Double quote Backslash Carriage return New line Form feed Tab Backspace 16 8 03-03-2011 Constantes ● boolean − − ● true false byte, short, int − − Qualquer valor dentro da gama de valores possível para o tipo em questão Os valores podem ser expressos nos seguintes formatos: ● decimal (10, 12, -1) ● octal (010, 017) ● hexadecimal (0x2e, 0xff) 17 Constantes ● long − Suporta os formatos decimal, octal, hexadecimal − Adiciona-se no final a letra L ou l (L minúsculo) ● ● double − ● Exemplo: long x = 0x7ffffffffffffffL; Os valores podem ser expressos nos formatos: ● Decimal (1.3, -0.0001) ● Científico (2.2e-2 ou 2.2E-2, -0.1e20 ou -0.1E20) float − Procede da mesma forma que o tipo double adicionando no final a letra f ou F ● Exemplo: (1.3f, 2.2e-2F) 18 9 03-03-2011 Operadores Grupo Operador Atribuição + Aritméticos = *= %= += /= Aritméticos + * ++ / -- Relacionais > < == >= <= != Descrição -= O mesmo significado que em C Não podem ser aplicados ao tipo boolean O mesmo significado que em C % Não podem ser aplicados ao tipo boolean O mesmo significado que em C. No entanto, produzem um resultado do tipo boolean Com a excepção dos operadores == e !=, não podem ser aplicados ao tipo boolean 19 Operadores Grupo Lógicos Manipulação de bits Deslocamento de bits Operador && || ! Descrição O mesmo significado que em C Só podem ser aplicados a expressões do tipo boolean Produzem um resultado do tipo boolean & | ^ ~ &= |= ^= << <<= Deslocamento para a esquerda com sinal (acrescenta 0 ou 1 à direita consoante o sinal) >> >>= Deslocamento para a direita com sinal (acrescenta à esquerda 0 ou 1 consoante o sinal) >>> >>>= AND bit-a-bit OR bit-a-bit XOR bit-a-bit Negação - Não pode ser aplicado ao tipo boolean Os operadores de manipulação de bits não podem ser aplicados aos tipos float e double Deslocamento para a direita sem sinal (acrescenta 0 à esquerda) Apenas se aplica aos tipos: byte, char, short, int e long 20 10 03-03-2011 Operadores Operador ternário − expressão-tipo-boolean ? expressão1 : expressão2; Operador de conversão (cast) − Sintaxe: ● (Tipo desejado) Expressão − A conversão de um tipo mais pequeno para um maior é feito de forma automática − O conversão de um tipo maior para um mais pequeno tem de ser efectuado de forma explicita utilizando o operador de cast 21 Promoção Automática ● ● Numa expressão, todos os tipos são automaticamente promovidos para o tipo de maior precisão Os tipos char, byte e short são automaticamente promovidos para o tipo int short i = 1; i = i + 7; ^ Incompatible type for =. Explicit cast needed to convert int to short 22 11 03-03-2011 Estruturas de Controlo ● As estruturas de controlo são exactamente iguais às do C. No entanto todas as condições têm de ser expressões do tipo boolean /* Em C a condição de uma estrutura de controlo podia ser qualquer expressão */ int a=3; if (a) a += 3; else if (a = 5) a *= 2; printf("a = %d", a); /* Em Java a condição de uma estrutura de controlo tem de ser uma expressão “booleana” */ int a=3; if (a != 0) a += 3; else { a = 5; if (a != 0) a *= 2; } System.out.print("a= " + a); 23 Estruturas de Controlo Iguais às do C ● ● Estruturas de selecção − if-else − switch Estruturas de repetição − for − while − do..while − break and continue 24 12 03-03-2011 Estruturas em C #include <stdio.h> Resultado: typedef struct{ int dia, mes, ano; }t_data; 4/3/2010 void alterar_data(t_data *d1, t_data *d2) { d1->dia = d2->dia; d1->mes = d2->mes; d1->ano = d2->ano; } int main(int argc, char *argv[]) { t_data data1,data2; data1.dia=4; data1.mes=3; data1.ano=2010; alterar_data(&data2, &data1); printf("%d/%d/%d\n",data2.dia,data2.mes,data2.ano); return 0; } 25 Classes em Java package classes; public class Data { private int dia,mes,ano; public Data() { this.dia=1; this.mes=1; this.ano=1970; } public Data(int dia, int mes, int ano) { this.dia=dia; this.mes=mes; this.ano=ano; } public void alterar(Data data) { this.dia=data.dia; this.mes=data.mes; this.ano=data.ano; } package classes; public class Test { public static void main(String[] args) { Data data1=new Data(4,3,2010); Data data2=new Data(); data2.alterar(data1); System.out.println(data2.getDia() + “/“ + data2.getMes() + “/“ + data2.getAno()); } } public int getDia(){ return dia; } public int getMes(){ return mes; } public int getAno(){ return ano; } } Resultado: 4/3/2010 26 13