262
www.labes.ufpa.br Programação Orientada a Objetos na Linguagem Java Prof. Adailton Magalhães Lima [email protected]

Introdução a Linguagem Java

  • Upload
    ufpa

  • View
    72

  • Download
    17

Embed Size (px)

Citation preview

Page 1: Introdução a Linguagem Java

www.labes.ufpa.br

Programação Orientada a Objetos na Linguagem Java

Prof. Adailton Magalhães Lima [email protected]

Page 2: Introdução a Linguagem Java

www.labes.ufpa.br

Parte I Introdução

Page 3: Introdução a Linguagem Java

www.labes.ufpa.br

3

JAVA TIMELINE

Page 4: Introdução a Linguagem Java

www.labes.ufpa.br

4

•  1991 - Criado projeto ‘Oak’, linguagem precedente do Java criada para o mercado de sistemas embarcados

•  1994 - Depois de frustradas tentativas de embutir ‘Oak’ em Set-top box de TV, a linguagem é revisada e têm seu compilador mudado de C para ‘Oak’

•  1995 - ‘Oak’ é rebatizada para Java e tem o lançamento oficial

•  1998 - Lançado o Java 2: versão 1.2 batizada de Java 2

•  1999 - Lançada versão beta de J2EE •  2000 - Lançado o J2SE 1.3

Cronologia

Page 5: Introdução a Linguagem Java

www.labes.ufpa.br

5

•  2001 - Lançamento do projeto Eclipse e do J2EE 1.3 •  2002 - Lançado Hibernate 1.0 •  2004 - Lançamento do Java 1.5 (Tiger) •  2006 – Lançado o Java 6 •  2007 – Lançado JDK completo como Open Source •  2008 – Java 7 •  2014 – Java 8

Cronologia

Page 6: Introdução a Linguagem Java

www.labes.ufpa.br

6

•  A motivação inicial para Java –  “A necessidade de uma plataforma independente de

linguagem que possa ser embutida em vários produtos e let rônicos de consumo como torradeiras e refrigeradores”

–  Um dos primeiros projetos utilizando Java foi um controle remoto pessoal para hand-held chamado Star 7.

–  Nesta mesma época a World Wide Web e a Internet vinham ganhando popularidade.

–  James Gosling e companhia “sacaram” que Java poderia ser também utilizada para programação na Internet.

–  Lançaram aí a tecnologia dos Applets Java.

Motivação

Page 7: Introdução a Linguagem Java

www.labes.ufpa.br

7

•  JavaScript é uma versão simplificada de Java? Não!! –  JavaScript é uma linguagem de script que pode

ser inserida dentro de páginas web –  Foi inventada pela Netscape e originalmente

chamada de LiveScript, que tem uma sintaxe parecida (mas que no fundo não tem relação direta com Java)

– Em particular, um programa JavaScript pode modificar um documento no qual está exibido (a página web).

Java VS JavaScript

Page 8: Introdução a Linguagem Java

www.labes.ufpa.br

8

•  Com a API Java Advanced Imaging são capturadas as imagens panorâmicas para fotografar a superfície marciana

•  Em várias partes do sistema de controle existem aplicações Java que ajudam a comunicação e controle do robô da NASA em Marte

•  Em várias partes existem dispositivos embarcados utilizando Java

•  Em http://mars.telascience.org pode-se baixar o software Maestro (versão free de parte do código Java em Marte)

Java em Marte

Page 9: Introdução a Linguagem Java

www.labes.ufpa.br

9

PLATAFORMA JAVA • O  que  é  Java?  1  • Distribuições  2  • Ambiente  de  Desenvolvimento  3  • Funcionalidades  Java  4  • Fases  de  um  programa  Java  5  

Page 10: Introdução a Linguagem Java

www.labes.ufpa.br

10

•  A tecnologia Java pode ser vista como :

– Uma linguagem de programação – Um ambiente de desenvolvimento – Um ambiente para aplicações – Um ambiente de implantação

O que é Java?

Page 11: Introdução a Linguagem Java

www.labes.ufpa.br

11

•  Java é uma linguagem de programação Orientada a Objetos com uma sintaxe semelhante a C/C++ e que gera programas multiplataformas.

•  Java pode criar qualquer tipo de aplicação que se pode criar com uma linguagem de programação convencional.

O que é Java?

Page 12: Introdução a Linguagem Java

www.labes.ufpa.br

12

•  Java permite o desenvolvimento de aplicações para uma série de plataformas.

•  É possível ter software Java desde de dispositivos como telefones celulares, até computadores de grande porte, como os mainframes.

•  Devido a essa característica, a linguagem Java conta com três conhecidas distribuições para ambientes de desenvolvimento: –  JSE (antigamente J2SE) –  JEE (antigamente J2EE) –  JME (antigamente J2ME)

Distribuições

Page 13: Introdução a Linguagem Java

www.labes.ufpa.br

13

JSE (Java Standard Edition) •  É o ambiente de desenvolvimento com uso voltado a

micros e servidores •  Essa é a plataforma principal, já que, de uma forma

ou de outra, o JEE e o JME têm no JSE sua base. •  Assim, os outros ambientes de desenvolvimento são

versões aprimoradas do JSE para as aplicações a que se propõem.

•  Por ser a plataforma mais abrangente do Java, o JSE é a mais indicada para quem quer aprender a linguagem.

Distribuições

Page 14: Introdução a Linguagem Java

www.labes.ufpa.br

14

JEE (Java Enterprise Edition)

•  Contém bibliotecas especialmente desenvolvidas para o acesso a servidores, a sistemas de e-mail, a banco de dados, etc.

•  Contém uma série de especificações, cada uma com funcionalidades distintas. Entre elas, tem-se: –  JDBC (Java Database Connectivity), utilizado no acesso a banco

de dados; –  Servlets, uma API para o desenvolvimento de aplicações Web.

Este recurso "estende" o funcionamento dos servidores Web, permitindo a geração de conteúdo dinâmico nos sites.

–  JSP (Java Server Pages), permite script para criação de páginas dinâmicas como uma abstração sobre a tecnologia de Servlets

Distribuições

Page 15: Introdução a Linguagem Java

www.labes.ufpa.br

15

JME (Java Micro Edition) •  É o ambiente de desenvolvimento para dispositivos

móveis ou portáteis, como telefones celulares e palmtops. •  Como a linguagem Java já era conhecida e a adaptação

ao JME não é complicada, logo surgiram diversos tipos de aplicativos para tais dispositivos, como jogos e agendas eletrônicas.

•  As empresas saíram ganhando com isso porque, desde que seus dispositivos tenham uma JVM (Máquina Virtual Java), é possível, com poucas modificações, implementar os aplicativos em qualquer aparelho, sendo o único limite a capacidade do hardware.

Distribuições

Page 16: Introdução a Linguagem Java

www.labes.ufpa.br

16

•  Em seu ambiente de desenvolvimento, Java provê algumas ferramentas: – Um compilador (javac) – Um interpretador (java) – Um gerador de documentação (javadoc) – Um aplicativo para empacotamento de classes

(jar) – Um registro e compilador para aplicações

distribuídas (rmiregistry e rmic) – Entre outras funcionalidades

Ambiente de Desenvolvimento

Page 17: Introdução a Linguagem Java

www.labes.ufpa.br

17

•  Tecnologias de aplicação Java são tipicamente programas de propósito geral que executam em qualquer máquina onde haja uma ambiente de execução Java (JRE- Java Runtime Environment)

•  Existem dois ambientes principais de instalação: 1.  A JRE contém todos os arquivos de classes

para os pacotes Java, incluindo classes básicas da linguagem, componentes de GUI, entre outras.

2.  O Web Browser, onde muitos provêem um interpretador Java e um ambiente de execução.

Ambiente de Desenvolvimento

Page 18: Introdução a Linguagem Java

www.labes.ufpa.br

18

•  Algumas funcionalidades do Java: – Máquina Virtual – Coletor de Lixo (Garbage Collection) – Segurança de Código

Funcionalidades Java

Page 19: Introdução a Linguagem Java

www.labes.ufpa.br

19

•  Máquina Virtual ou Java Virtual Machine (JVM) –  É uma máquina abstrata que é implementada pela

emulação de software em tempo real –  Provê a especificação da plataforma de hardware para

compilação do código Java •  A JVM interpreta Bytecode

–  Bytecode é uma linguagem de máquina especial que pode ser entendida pela JVM

–  Esta linguagem é independente de qualquer hardware particular de computador, de tal forma que qualquer computador com um interpretador Java possa executar o programa não importando a máquina em que o código foi compilado.

Funcionalidades Java

Page 20: Introdução a Linguagem Java

www.labes.ufpa.br

20

•  Coletor de Lixo ou Garbage Collector (GC): –  A linha de execução do GC é responsável pela liberação

de qualquer memória não mais utilizada por programas Java.

–  Isto acontece automaticamente durante o tempo de execução do programa Java

» VANTAGEM: O programador fica livre da tarefa de alocar e desalocar memória manualmente

Funcionalidades Java

Page 21: Introdução a Linguagem Java

www.labes.ufpa.br

21

•  Segurança de Código: •  Segurança de código é provida na implementação da

JRE. •  Desta forma, para executar o código, a JRE utiliza o

ClassLoader para carregar o código e verifica o código(através do verificador de bytecode)

•  O ClassLoader carrega todas as classes, onde determina o layout de memória em tempo de execução, para protegê-la de acesso desautorizado.

•  O Verificador de Bytecode procura no formato dos fragmentos do código acessos ilegais que possam violar direitos de acesso aos objetos

Funcionalidades Java

Page 22: Introdução a Linguagem Java

www.labes.ufpa.br

22

Editordisco

Programa é criado em um editor e armazenado no disco

Compiladordisco

Compilador gera os bytecodes e os armazena no disco

Carregador de classes

disco

O carregador de classes – Class Loader – coloca os bytecodes na memória

______________________________

memória

Verificador de bytecodes

O verificador de bytecodes – Bytecodes Verifier – confirma se todos os bytecodes estão corretos e não violam as restrições de segurança da linguagem Java

______________________________

memória

InterpretadorO interpretador lê os bytecodes e executa o programa

______________________________

memóriaFase

s de

um

pro

gram

a Ja

va

Tempo

+

Page 23: Introdução a Linguagem Java

www.labes.ufpa.br

23

INSTALAÇÃO E CONFIGURAÇÃO

Page 24: Introdução a Linguagem Java

www.labes.ufpa.br

24

O procedimento de instalação do Java consiste em 3 passos principais:

Instalação

Instalação  do  JDK   Configuração  do  PATH   Teste  usando  linha  de  comando  

Page 25: Introdução a Linguagem Java

www.labes.ufpa.br

25

•  Instalação do JDK –  Execute o instalador e siga os passos até o fim

Instalação

Page 26: Introdução a Linguagem Java

www.labes.ufpa.br

26

Instalação

Page 27: Introdução a Linguagem Java

www.labes.ufpa.br

27

•  Configuração do PATH •  Após a instalação do JDK, é preciso realizar as

seguintes etapas adicionais: – Adicionar o diretório bin do jdk no PATH de

execução do SO (Sistema Operacional) – Tais etapas variam de acordo com o SO

•  A seguir serão apresentados os passos nos sistemas Windows® e Linux

Instalação

Page 28: Introdução a Linguagem Java

www.labes.ufpa.br

28

•  Configuração do PATH (LINUX) •  Em Linux, o procedimento para edição do PATH de

execução depende do shell que está usando. •  Se está utilizando o Bourne Again shell (que é o default do

Linux), adicione a seguinte linha ao final do arquivo ~/.bashrc ou ~/.bash_profile: –  export PATH=/usr/local/jdk/bin:$PATH

–  onde ”/usr/local/jdk” pode variar de acordo com a opção de instalação

–  DICA: Se está no MacOSX, edite o arquivo ~/.profile com o mesmo comando Linux

Instalação

Page 29: Introdução a Linguagem Java

www.labes.ufpa.br

29

•  Configuração do PATH (Windows) •  No Windows, é preciso fazer login como administrador. •  Basta: 1 - iniciar o “Painel de Controle”; 2 - selecionar o

ícone “Sistema”; 3 – selecionar a aba “Avançado”

Instalação

Page 30: Introdução a Linguagem Java

www.labes.ufpa.br

30

•  Configuração do PATH (Windows)(cont.) 4 - clique no botão “Variáveis de Ambiente”; 5 - navegue até

encontrar a propriedade PATH, onde deve-se editar e adicionar o caminho completo do diretório; 6- salvar as configurações.

Instalação

Editar

Para editar o path, basta colocar um “;” ao final do conteúdo e adicionar o caminho do diretório bin do jdk Exemplo: “; C:\Arquivos de programas\Java\jdk1.6.0_03\bin” Obs: Sem as aspas

Page 31: Introdução a Linguagem Java

www.labes.ufpa.br

31

•  Teste usando linha de comando •  Independente do SO, em um shell aberto digite:

–  java -version •  Pressione ENTER. Você deve visualizar algo

parecido com:

Instalação

Page 32: Introdução a Linguagem Java

www.labes.ufpa.br

32

PROGRAMA JAVA “HELLO WORLD”

Page 33: Introdução a Linguagem Java

www.labes.ufpa.br

33

Programa “Hello World”

public class Hello { /** * Meu primeiro programa Java */ public static void main(String[]args){

//escreve a string “Hello World” na tela System.out.println(“Hello world”);

} }

Page 34: Introdução a Linguagem Java

www.labes.ufpa.br

34

●  Indica o nome da classe que é Hello

● Em Java, todo código deve ser colocado dentro de uma declaração de classe

● A classe utiliza o identificador de acesso public, que indica que esta classe é acessível a outras classes de outros pacotes.

Definição de Classe public class Hello { /** * Meu primeiro programa Java */

Page 35: Introdução a Linguagem Java

www.labes.ufpa.br

35

●  As linhas destacadas indicam comentários Java

●  Um comentário:

-  U)lizado  para  documentar  uma  parte  de  código  

-  É  uma  boa  prá)ca  de  programação  adicionar  comentários  ao  código.  

Comentários public class Hello { /** * Meu primeiro programa Java */ …

//escreve a string “Hello world” na tela

Page 36: Introdução a Linguagem Java

www.labes.ufpa.br

36

●  Indica o nome do método Hello que é o principal de um programa Java.

●  O método main é o ponto de partida de um programa Java

●  Todos os programas, exceto pelos Applets, iniciam a partir de um método main.

●  É necessário que a assinatura esteja correta (com um array de string passado como parâmetro).

Método main public class Hello { /** * Meu primeiro programa Java */ public static void main( String[] args ){

Page 37: Introdução a Linguagem Java

www.labes.ufpa.br

37

● O comando System.out.println() escreve o texto passado como parâmetro entre aspas.

Comando de escrita public class Hello { /** * My first Java program */ public static void main( String[] args ){

//prints the string “Hello world” on screen System.out.println(“Hello world”);

Page 38: Introdução a Linguagem Java

www.labes.ufpa.br

38

INSTALAÇÃO DE UMA IDE

Page 39: Introdução a Linguagem Java

www.labes.ufpa.br

39

Definição de IDE

IDE vem do inglês Integrated Development E n v i r o n m e n t o u A m b i e n t e I n t e g r a d o d e Desenvolvimento É um programa de computador que reúne característ icas e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo. Geralmente facilitam a técnica RAD (de Rapid Application Development, ou "Desenvolvimento Rápido de Aplicativos"), que visa a maior produtividade dos desenvolvedores.

Page 40: Introdução a Linguagem Java

www.labes.ufpa.br

40

•  As características e ferramentas mais comuns encontradas nos IDEs são: –  Editor –  Compilador –  Linker –  Depurador (debugger) –  Modelagem (modelling) –  Geração de código –  Distribuição (deploy) –  Testes Automatizados (automated tests) –  Refatoração (refactoring)

Definição de IDE

Page 41: Introdução a Linguagem Java

www.labes.ufpa.br

41

•  Dentre as várias IDES existentes, pode-se destacar as seguintes IDEs que dão apoio ao desenvolvimento em Java: •  IntelliJ IDEA - paga •  Eclipse - livre •  NetBeans - livre •  JBuilder - paga •  Sun Java Studio Enterprise •  Jedit •  BlueJ •  OptimalJ •  …

IDEs Java Existentes

Page 42: Introdução a Linguagem Java

www.labes.ufpa.br

42

•  De forma resumida: •  Em geral comparar IDEs é algo polêmico, pois

depende muito da necessidade atual de cada desenvolvedor

•  Dentre as IDEs pagas, IntelliJ e JBuilder se destacam por oferecer diversos componentes “pré-fabricados” para apoio ao desenvolvimento RAD.

•  Dentre as IDEs livres, Eclipse e NetBeans são líderes de mercado

IDEs Java Existentes

Page 43: Introdução a Linguagem Java

www.labes.ufpa.br

43

•  A seguir neste curso serão apresentados de forma resumida o processo de instalação do NetBeans e do Eclipse.

•  Neste curso, a utilização de uma IDE é necessária para simplificar o processo de c o m p i l a ç ã o e t e s t e d o s c ó d i g o s desenvolvidos

IDEs Java Existentes

Page 44: Introdução a Linguagem Java

www.labes.ufpa.br

44

Instalando NetBeans

1- execute o instalador 2- defina componentes

4- confirme instalação

3- confirmar local de instalação

5- feche instalador

Page 45: Introdução a Linguagem Java

www.labes.ufpa.br

45

•  Após instalar, basta executar o aplicativo e terá acesso à interface do usuário:

Instalando NetBeans

Page 46: Introdução a Linguagem Java

www.labes.ufpa.br

46

Instalando Eclipse

1- inicie instalação

2- defina local de instalação

3- Aguarde e finalize

Page 47: Introdução a Linguagem Java

www.labes.ufpa.br

47

Instalando Eclipse

Após instalar, basta executar o aplicativo e terá acesso à interface do usuário:

Page 48: Introdução a Linguagem Java

www.labes.ufpa.br

Parte II Programação Básica

Page 49: Introdução a Linguagem Java

www.labes.ufpa.br

49

Partes básicas de um programa Java • Sentenças  e  Blocos  1  

• IdenHficadores  2  • Palavras  Reservadas  3  • Variáveis  4  • Literais  5  • Tipos  PrimiHvos  6  

Page 50: Introdução a Linguagem Java

www.labes.ufpa.br

50

•  Sentença – Uma ou mais linhas de código terminado por

um ponto e vírgula – Exemplo:

System.out.println(“Hello world”);

Sentenças e Blocos

Page 51: Introdução a Linguagem Java

www.labes.ufpa.br

51

•  Bloco –  É uma ou mais sentenças circundada por uma abertura e

fechamento de chaves que agrupam as sentenças como uma unidade.

–  Blocos de sentenças podem ser encadeados infinitamente.

–  É permitida qualquer quantidade de espaços em branco. – Exemplo:

public static void main( String[] args ){ System.out.println("Hello"); System.out.println("world”); }

Sentenças e Blocos

Page 52: Introdução a Linguagem Java

www.labes.ufpa.br

52

1. Na criação de blocos, é permitido colocar a chave junto com a sentença. Por exemplo: public static void main( String[] args ){

ou é permitida a chave na próxima linha, como, public static void main( String[] args )‏

{

2. É recomendada a identacão das sentenças após o início de um bloco. Por exemplo: public static void main( String[] args ){ System.out.println("Hello"); System.out.println("world");

}

Sentenças e Blocos

Page 53: Introdução a Linguagem Java

www.labes.ufpa.br

53

•  Identificadores –  São tokens que representam nomes de variáveis,

métodos, classes, etc. –  Exemplos de identificadores são: Hello, main, System,

out.

•  Da mesma forma que C e C++, identificadores Java são sensíveis ao caso. –  Isto significa que o identificador Hello não é o mesmo

que hello.

Identificadores

Page 54: Introdução a Linguagem Java

www.labes.ufpa.br

54

•  Identificadores podem iniciar com uma letra, underscore “_”, ou um sinal de “$”.

•  Letras podem ser minúsculas ou MAIUSCULAS

•  Caracteres subseqüentes podem ser números de 0 a 9.

•  Identificadores não podem utilizar palavras chave do Java, como class, public, void, etc.

Identificadores

Page 55: Introdução a Linguagem Java

www.labes.ufpa.br

55

1. Para nomes de classes, recomenda-se por a primeira letra da palavra como maiúsculo: ExemploDeNomeParaClasse

2. Para nomes de métodos e variáveis, a primeira letra

deve ser minúscula: esteNomeDeMetodoExemplo

Identificadores

Page 56: Introdução a Linguagem Java

www.labes.ufpa.br

56

3. No caso de identificadores com várias palavras, use maiúsculo para iniciar cada palavra exceto a primeira: charArray, fileNumber, ClassName.

4. Evite o uso de underscores no início de

identificador como em _read ou _write.

Identificadores

Page 57: Introdução a Linguagem Java

www.labes.ufpa.br

57

•  Palavras reservadas são identificadores pré-definidos reservados pelo Java para um propósito específico.

•  Não é permitido utilizar palavras chave como nomes de variáveis, classes, métodos, etc.

•  A seguir é mostrada uma tabelas com as palavras reservadas do Java

Palavras Reservadas

Page 58: Introdução a Linguagem Java

www.labes.ufpa.br

58

Palavras Reservadas

*- const e goto são palavras reservadas, mas não são utilizadas atualmente pelo Java

Page 59: Introdução a Linguagem Java

www.labes.ufpa.br

59

•  Uma variável representa um item de dado que é utilizado para armazenar estado de objetos.

•  Uma variável contém: –  Tipo de dado

• O tipo de dado indica o tipo de valores que a variável pode possuir.

– Nome • O nome da variável segue as regras para

identificadores.

Variáveis

Page 60: Introdução a Linguagem Java

www.labes.ufpa.br

60

•  A declaração de variáveis segue a seguinte estrutura:

<tipo de dado> <nome> [=valor inicial]; •  Nota: Valores entre <> são obrigatórios,

enquanto valores entre [] são opcionais.

Variáveis

Page 61: Introdução a Linguagem Java

www.labes.ufpa.br

61

Variáveis

package br.eln.java; public class ExemploDeVariaveis {  

public static void main( String[] args ){ //declara um tipo de dado com o nome da variável // result é do tipo de dado boolean boolean result;

  //declara um tipo de dado com o nome da variável

// option é do tipo de dado char char option; option = 'C'; //atribui 'C' em option

  //declara um tipo de dado com o nome da variável /*grade é do tipo de dado double que é inicializado para 0.0

*/ double grade = 0.0;

} }

Page 62: Introdução a Linguagem Java

www.labes.ufpa.br

62

1. É sempre bom inicializar variáveis na sua declaração.

2. Declare uma variável por linha de código. Por exemplos, a declaração de variáveis a seguir

double exam=0; double quiz=10; double grade = 0;

é preferível ao invés da seguinte, double exam=0, quiz=10, grade=0;

Variáveis

Page 63: Introdução a Linguagem Java

www.labes.ufpa.br

63

Variáveis

Tipo de dado Valor Default byte/short/int 0 long 0L float 0.0F double 0.0 boolean false char ‘\u0000’ Object null

Tabela que mostra os valores default de tipos de variáveis Java:

Page 64: Introdução a Linguagem Java

www.labes.ufpa.br

64

•  Literais são tokens que não são modificados, ou seja, são constantes.

•  Diferentes tipos de literais em Java são: –  Literais Inteiros –  Literais de Ponto Flutuante –  Literais Booleanos –  Literais Caracteres –  Literais String

Literais

Page 65: Introdução a Linguagem Java

www.labes.ufpa.br

65

Literais Inteiros •  Podem ser definidos em diferentes formatos:

–  Decimal (base 10) •  Sem notação especial •  exemplo: 12

–  Hexadecimal (base 16) •  Precedido por 0x ou 0X (zero) •  Exemplo:

–  Octal (base 8) •  Precedido por 0 (zero) •  Exemplo:

Literais

int octal = 014;int octal2= 08;

int hexadecimal = 0XC; int hexadecimal2 = 0xD;

valor excede escala octal que vai até “07”

Page 66: Introdução a Linguagem Java

www.labes.ufpa.br

66

Literais de Ponto Flutuante •  Representam decimais com partes fracionárias:

– Exemplo: 3.1416

•  Podem ser expressados segundo duas notações: – Padrão

– Científica ‏

Literais

double pFlutuante1 = 583.45;

double pFlutuante2 = 58345e-2; // 583.45double pFlutuante3 = 58345E-2; // 583.45

long pFlutuante4 = 583.45;Java não permite literal de ponto flutuante para long, que não possui ponto flutuantes

O uso de “e” e “E” na notação não muda o resultado final

double ou float

Page 67: Introdução a Linguagem Java

www.labes.ufpa.br

67

Literais Booleanos •  Podem possuir somente dois valores:

–  true ou false.

Literais

boolean bool1 = true; boolean bool2 = false;

boolean bool3 = 1;Diferente de outras linguagens, como C/C++, variáveis booleanas podem receber apenas valores booleanos(true/false), não sendo permitida a utilização de atribuição e testes utilizando números inteiros

Page 68: Introdução a Linguagem Java

www.labes.ufpa.br

68

Literais Caracteres •  No Java, literais caracteres representam um único código

Unico de caracteres

Caracter Unicode: –  Um caracter com conjunto de 16-bits que substitui o antigo

conjunto ASCII de 8-bits –  O Unicode permite a inclusão de símbolos e caracteres

especiais de outras linguagens além do inglês.

Literais

Page 69: Introdução a Linguagem Java

www.labes.ufpa.br

69

Literais Caracteres •  Por exemplo: –  A letra a é representada como ‘a’.

•  Caracteres Especiais

Literais

Função Caracter Line break ‘\n’ Carriage return ‘\r’

Backspace ‘\b’

Page 70: Introdução a Linguagem Java

www.labes.ufpa.br

70

Literais String •  Literais String representam múltipos caracteres e

são cercados por aspas duplas (“ ”)

•  Um exemplo de literal string podem ser “Hello World”.

Literais

Page 71: Introdução a Linguagem Java

www.labes.ufpa.br

71

•  A linguagem Java define 8 tipos de dados primitivos: –  boolean –  char –  byte –  short –  int –  long ‏ –  double –  float

Tipos Primitivos

Page 72: Introdução a Linguagem Java

www.labes.ufpa.br

72

Booleano •  Um tipo de dado booleano representa dois estados:

verdadeiro e falso (true e false).

•  Um exemplo é : boolean result = true;

•  O exemplo acima declara uma variável chamada

result como boolean e atribui o valor true.

Tipos Primitivos

Page 73: Introdução a Linguagem Java

www.labes.ufpa.br

73

Caracter •  Um tipo de dado caracter (char) representa um único

código de caracter Unicode. •  Seus literais devem estar entre aspas simples (’ ’). •  Por exemplo,

‘a’ //Uma letra a ‘\t’ //Tab

•  Para representar caracteres especial como ' (aspas simples) ou " (aspas duplas), utilize o caracter \ (barra invertida). Por exemplo:

'\'' //Para aspas simples '\"' //Para aspas duplas

Tipos Primitivos

Page 74: Introdução a Linguagem Java

www.labes.ufpa.br

74

Caracter – Caso String •  Apesar da String não ser um tipo de dado primitivo (é uma

Classe), alguns comentários podem ser feitos: –  Uma String representa um tipo de dado que contém

múltiplos caracteres. No Java, String é representado por uma classe, não é um tipo de dado primitivo.

–  Possui seus literais dentro de aspas duplas (“ ”).

–  Por exemplo, String message=“Hello world!”;

Tipos Primitivos

Page 75: Introdução a Linguagem Java

www.labes.ufpa.br

75

•  Inteiros – byte, short, int e long •  Tipos de dados inteiros em Java são de 3 formas:

2 //Valor Decimal 2 077 // 0 (zero) indica um valor octal 0xBACC //O 0x (zero e x) indica um valor hexadecimal

Tipos inteiros possuem int como tipo de dado default.

•  É possível atribuir um valor long adicionando a letra l ou L.

•  Por exemplo: 10L

Tipos Primitivos

Na definição de um valor long, é preferível utilizar L (maiúsculo) ao invés de l (minúsculo), para não confundir com o dígito 1

Page 76: Introdução a Linguagem Java

www.labes.ufpa.br

76

•  Tipos inteiros tem as seguintes escalas de valores:

Tipos Primitivos

Tipo Tamanho Range byte 8 bits - até -1 short 16 bits - até -1

int 32 bits - até -1

long 64 bits - até -1

72 72152 152

312 312

632 632

Page 77: Introdução a Linguagem Java

www.labes.ufpa.br

77

Ponto Flutuante: float e double •  Tipos de ponto flutuante possuem double como tipo

de dado default. •  Literais de ponto flutuante incluem decimais:

E ou e //(adiciona valor exponencial) F ou f //(atribui valor para float) D ou d //(atribuir valor para double)

•  Exemplos são, 3.14 //A simples valor de ponto flutuante (double) 6.02E23 //um grande valor de ponto flutuante 2.718F //um valor float simples 123.4E+306D//um grande valor double com o D

redundante

Tipos Primitivos

Page 78: Introdução a Linguagem Java

www.labes.ufpa.br

78

Ponto Flutuante: float e double •  Valores de ponto flutuante possuem as

seguintes escalas de valores:

Tipos Primitivos

Tipo Tamanho Range float 32 bits - até -1

double 64 bits - até -1

312632

312632

Page 79: Introdução a Linguagem Java

www.labes.ufpa.br

79

CLASSES, PACOTES, ATRIBUTOS E MÉTODOS

• Definição  de  Classes  1  

• Atributos  2  

• Métodos  3  

• Construtores  4  

• Referência  “this”  5  

• Modificadores  de  Acesso  6  

• Pacotes  7  

Page 80: Introdução a Linguagem Java

www.labes.ufpa.br

80

•  Para definir uma classe, escreve-se:

<modificador> class <nome> { <declaracaoDeAtributo>* <declaracaoConstrutor>* <declaracaoMetodo>* } – Onde:

•  <modificador> é um modificador de acesso, onde pode ser combinado com outros tipos de modificadores.

Definição de Classes

Page 81: Introdução a Linguagem Java

www.labes.ufpa.br

81

public class RegistroCompra { //mais códigos serão adicionados depois

} – Onde:

•  public – significa que a classe é acessível por outras classes fora do mesmo pacote

•  class - usado para definir uma classe em Java

• RegistroCompra – um identificador único que descreve a classe

Definição de Classes

Page 82: Introdução a Linguagem Java

www.labes.ufpa.br

82

• Pense em um nome apropriado para a classe. Nunca defina nomes como XYZ ou outro nome aleatório.

• Recomenda-se que nomes de classes iniciem com uma letra maiúscula

• O nome do arquivo da classe deve ter o mesmo nome da classe Java.

• Defina um arquivo para cada classe Java definida

Definição de Classes

Page 83: Introdução a Linguagem Java

www.labes.ufpa.br

83

•  Atributos em classes Java podem ser de representados por variáveis de 2 tipos: – Tipos de dados primitivos (long, char, int,...) – Referencias para Objetos (String, Pessoa,

Carro, etc.) •  Os atributos de uma classe podem ser

especificados como: – Variáveis de instância – Variáveis de classe

Atributos

Page 84: Introdução a Linguagem Java

www.labes.ufpa.br

84

•  Variáveis de Instância – Pertencem a uma instância de objeto – Valor de um atributo para um objeto é

diferente das instâncias para outros objetos •  Variáveis de classes (também chamadas de

variáveis membros estáticas)‏ – Variáveis que pertencem a toda a classe. –  Isto significa que eles possuem o mesmo

valor para todas as instâncias da mesma classe

Atributos

Page 85: Introdução a Linguagem Java

www.labes.ufpa.br

85

Variáveis de Instância public class RegistroCompra { // variáveis de instância

private String nomeProduto; private long codigo; private Date validade; private double precoCusto; private double precoVenda;

} –  Onde:

•  private agora significa que as variáveis são acessadas somente dentro da classe. Outros objetos não podem acessar as variáveis diretamente.

Atributos

Page 86: Introdução a Linguagem Java

www.labes.ufpa.br

86

Variáveis de classes (estáticas) public class RegistroCompra { // variáveis de instância

private String nomeProduto; private long codigo; private Date validade; private double precoCusto; private double precoVenda;

private static int quantidaComprasFechadas; } – É utilizado o modificador static para indicar

que a variável é estática.

Atributos

Page 87: Introdução a Linguagem Java

www.labes.ufpa.br

87

• Declare todas as variáveis de instância logo no início da definição da classe

• Declare uma variável em cada linha • Use tipos de dados adequados para cada variável • Declare variáveis de instância como privadas e defina métodos de acesso para cada.

• Conceito de encapsulamento

Atributos

Page 88: Introdução a Linguagem Java

www.labes.ufpa.br

88

•  Para declarar métodos em Java: <modificador> <tipoDeRetorno> <nome>(<parametros>*) { <sentencas>* } –  onde,

•  <modificador> pode assumir diferentes modificadores •  <tipoDeRetorno> pode ser de qualquer tipo (incluindo

void) ‏•  <nome> pode ser qualquer identificador válido •  <parametro> ::= <tipo_parametro> <nome_parametro>[,]

Métodos

Page 89: Introdução a Linguagem Java

www.labes.ufpa.br

89

public static int getQuantidaComprasFechadas() { return quantidaComprasFechadas;

}   public static void setQuantidaComprasFechadas(int quantidaComprasFechadas) {

RegistroCompra.quantidaComprasFechadas = quantidaComprasFechadas;

}   public long getCodigo() {

return codigo; }

public void setCodigo(long codigo) { this.codigo = codigo;

}

Métodos

Page 90: Introdução a Linguagem Java

www.labes.ufpa.br

90

• Recomenda-se que nomes de métodos devem iniciar com minúsculo.

• Recomenda-se que nomes de métodos representem ações

Métodos

Page 91: Introdução a Linguagem Java

www.labes.ufpa.br

91

•  Sobrescrevendo métodos –  Permite um método com mesmo nome mas com parâmetros

diferentes, para ter implementação e retorno diferentes –  Pode ser utilizado quando diferentes operações possuem

diferentes implementações.

•  Sempre lembre que sobrescrever métodos tem as seguintes propriedades: –  O mesmo nome de método –  Diferentes para ou diferente número de parâmetros –  Tipo de retorno pode ser diferente ou o mesmo

Métodos

Page 92: Introdução a Linguagem Java

www.labes.ufpa.br

92

•  Construtores são chamados na instanciação de um objeto.

•  Os construtores possuem as seguintes propriedades: –  Possuem o mesmo nome da classe –  Aceita modificador de acesso –  Não possuem tipo de retorno –  Não se pode acessar o construtor diretamente,

somente através do operador new.

Construtores

Page 93: Introdução a Linguagem Java

www.labes.ufpa.br

93

public class RegistroCompra { .....

public RegistroCompra() { //adicionar codigo de inicializacao

}

……….

Construtores

Page 94: Introdução a Linguagem Java

www.labes.ufpa.br

94

•  A referência this –  refere-se à instância do objeto corrente –  utilizado para acessar variáveis de instância.

– Só é permitido acesso para variáveis de instância e NÃO para variáveis de classe (estáticas)

Referência “this”

Page 95: Introdução a Linguagem Java

www.labes.ufpa.br

95

public class RegistroCompra { .....

private long codigo;public void setCodigo(long

codigo) {

this.codigo = codigo; }

……….

Referência “this”

Page 96: Introdução a Linguagem Java

www.labes.ufpa.br

96

•  Existem quatro diferentes tipos de modificadores de acesso em Java: –  public (Menos restritivo) ‏–  protected –  private (Mais restritivo) ‏–  default

•  Os três primeiros modificadores de acesso são explicitamente escritos em código para indicar o tipo de acesso, o quarto que é default não necessita ser utilizado obrigatoriamente.

Modificadores de Acesso

Page 97: Introdução a Linguagem Java

www.labes.ufpa.br

97

Modificadores de Acesso

private default/package

protected public

Mesma Classe Sim Sim Sim Sim

Mesmo Pacote Não Sim Sim Sim

Pacote diferente (sub-classe)

Não

Não

Sim Sim

Pacote diferente (não é sub-classe)

Não

Não

Não

Sim

Page 98: Introdução a Linguagem Java

www.labes.ufpa.br

98

•  Um pacote é um agrupamento de tipos relacionados provendo gerência de proteção de acesso e espaço de nomes – Note que tipos refere-se a classes,

interfaces, enumerações e tipos de anotações (os dois últimos são novos recursos a partir de Java 5).

Pacotes

Page 99: Introdução a Linguagem Java

www.labes.ufpa.br

99

Benefícios: •  Facilita a identificação de classes e interfaces

relacionados. •  Os nomes de pacotes devem ser diferentes de

existentes, para evitar conflito de espaços de nomes.

•  É possível permitir dentro do pacote acesso irrestrito de fora assim como restringir acesso de outros pacotes externos.

Pacotes

Page 100: Introdução a Linguagem Java

www.labes.ufpa.br

100

•  Para definir uma classe em um pacote, basta escrever o seguinte na primeira linha do código: package br.java.meupacote; public class MinhaClasse{ ……. }

Pacotes

Page 101: Introdução a Linguagem Java

www.labes.ufpa.br

101

Importando Pacotes: •  Para estar habilitado a utilizar classes fora do mesmo

pacote que a classe atual pertence é necessário importar explicitamente o pacote das classes.

•  Por default, todos os programas Java importam o pacote java.lang.*, o que permite a utilização de String e Integer dentro do programa sem ter importado qualquer pacote.

•  A sintaxe de import é: import br.java.meuPacote.*; import br.java.novoPacote.UmaClasse;

Pacotes

Page 102: Introdução a Linguagem Java

www.labes.ufpa.br

102

• O pacote java.lang.* é composto por aquelas classes que encapsulam os tipos primitivos da linguagem (Wrapper Classes)

Pacotes

Boolean - encapsula um primitivo boolean Character - encapsula um primitivo char Double - encapsula um primitivo double Float - encapsula um primitivo float Integer - encapsula um primitivo int Long - encapsula um primitivo long String - encapsula uma cadeia de caracteres

Page 103: Introdução a Linguagem Java

www.labes.ufpa.br

103

HERANÇA, INTERFACES E CASTING

• Herança  1  

• Classes  Abstratas  2  

• Interfaces  3  

• CasHng  de  Tipos  4  

Page 104: Introdução a Linguagem Java

www.labes.ufpa.br

104

•  Herança é o conceito aplicado quando um filho para uma classe (também chamado de sub classe) automaticamente herda variáveis e métodos da classe pai (super classe).

•  É uma das func iona l idades pr inc ipa is da programação orientada a objetos

•  Como benefício, permite o reuso de métodos e atributos, que são automaticamente compartilhados entre classes e subclasses

•  Cada subclasse fica responsável por estender e modificar o comportamento herdado

Herança

Page 105: Introdução a Linguagem Java

www.labes.ufpa.br

105

•  A palavra chave extends permite a herança em Java

•  A sub classe herda todos os membros “public” e “protected” (atributos e métodos) do pai, não importando a qual pacote a sub classe pertence

•  Se a sub classe está no mesmo pacote que o pai, ela também herda os membros ”private” (atributos e métodos) do pai

Herança

public class Funcionario extends Pessoa { private String nomeEmpresa; protected int cargaHoraria; . . . .

}

Page 106: Introdução a Linguagem Java

www.labes.ufpa.br

106

•  Os atributos herdados podem ser utilizados diretamente, assim como qualquer atributo.

•  É permitido declarar novos atributos na sub classe que não existam na super classe

•  É permitido declarar um atributo com o mesmo nome do que existe na super classe, dessa forma escondendo o atributo original (não recomendado).

•  A sub classe não tem acesso aos membros privados da classe pai. Mesmo assim, se a super classe tem método público ou protegido para acessar o atributo privados a sub classe poderá ter acesso aos dados.

Herança

Page 107: Introdução a Linguagem Java

www.labes.ufpa.br

107

•  Em Java , a classe Object é a “mãe” de todas as classes –  Todas as classes estendem da super classe Object –  A classe Object é a única classe que não tem super classe

•  Object define e implementa comportamento comum para todas as classes: –  getClass()‏ –  equals()‏ –  toString()‏ –  …

Herança

Object  

ClasseA   ClasseB   ClasseC  

Page 108: Introdução a Linguagem Java

www.labes.ufpa.br

108

Classes Final –  Classes que não podem ser estendidas –  Para declarar uma classe final:

public final NomeClasse { . . . }

Métodos Final –  Métodos que não podem ser sobrescritos –  Basta colocar o termo final na definição do método

• Métodos static são automaticamente final

Herança

Page 109: Introdução a Linguagem Java

www.labes.ufpa.br

109

•  Uma classe abstrata é uma classe que contém um ou mais métodos abtsratos

•  Uma classe abstrata não pode ser instanciada // O seguinte código vai dar erro de compilação MinhaClasseAbstrata a1 = new MinhaClasseAbstrata();

•  Qualquer outra classe (classe concreta) deve prover a implementação dos métodos abstratos

Classes Abstratas

Page 110: Introdução a Linguagem Java

www.labes.ufpa.br

110

Classes Abstratas public abstract class SerVivo {

public void respira() { System.out.println("Ser vivo respirando..."); }

public void come() { System.out.println("Ser vivo comendo..."); }

/** * Método abstrato anda() * Este método deve ser implementado por uma classe concreta */ public abstract void anda();

}

Page 111: Introdução a Linguagem Java

www.labes.ufpa.br

111

•  Quando uma classe concreta estende a classe abstrata SerVivo, deve implementar o método abstrato anda(), ou então a subclasse também deve ser uma classe abstrata (e não poderá ser instanciada)

Classes Abstratas

public class Homem extends SerVivo {  

@Override public void anda() {

System.out.println("Homem andando ... ");

}   }

Page 112: Introdução a Linguagem Java

www.labes.ufpa.br

112

•  Define um modo padrão e público de especificar o comportamento de classes (como um contrato)

•  Todos os métodos de uma interface são abstratos

•  Uma classe concreta deve implementar a interface

•  Is to permite que diferentes classes implementam um comportamento em comum

Interfaces

Page 113: Introdução a Linguagem Java

www.labes.ufpa.br

Capa

citaç

ão E

letro

norte

– 20

07 -

2008

113

l  Como exemplo, a interface Relacao é definida para representar os métodos que representam a relação natural entre objetos

Interfaces

public interface Relacao { public boolean maior(Object a, Object b);

  public boolean menor(Object a, Object b);

  public boolean igual(Object a, Object b);

}

Page 114: Introdução a Linguagem Java

www.labes.ufpa.br

Capa

citaç

ão E

letro

norte

– 20

07 -

2008

114

Interfaces

public boolean igual(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen == bLen);

}  

public boolean maior(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen > bLen);

}  

public boolean menor(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen < bLen);

} }

public class Linha implements Relacao {  

private double x1; private double x2; private double y1; private double y2;

  public Linha(double x1, double

x2, double y1, double y2) {

this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2;

}  

public double getTamanho() { double length = Math.sqrt((x2

- x1) * (x2 - x1) + (y2 - y1) * (y2

- y1)); return length;

}  

Page 115: Introdução a Linguagem Java

www.labes.ufpa.br

Capa

citaç

ão E

letro

norte

– 20

07 -

2008

115

Relacionamento com Classes l  Uma classe concreta pode ter somente uma super

classe, mas por outro lado pode implementar várias interfaces

-  Java não permite herança múltipla, mas interfaces fornecem uma alternativa.

l  Todos os métodos abstratos de todas as interfaces devem ser implementados por uma classe concreta

Interfaces

Page 116: Introdução a Linguagem Java

www.labes.ufpa.br

116

Herança entre Interfaces •  Interfaces não fazem parte da hierarquia de classes •  Porém, interface podem ter relacionamentos de

herança entre si

Interfaces

public interface RelacaoAmpliada extends Relacao{

public boolean diferenca(Object a, Object b);   }

Page 117: Introdução a Linguagem Java

www.labes.ufpa.br

117

•  Quando uma instância de objeto é criada de uma classe, pode-se afirmar que o objeto é do “tipo”da classe e das super classes

•  Uma instância de objeto de um tipo em particular pode ser utilizada em qualquer lugar onde seu tipo e os super tipos são invocados (incluindo interfaces implementadas)

Casting de Tipos

Page 118: Introdução a Linguagem Java

www.labes.ufpa.br

118

•  Exemplo:

–  contaCorrente1 é um objeto do tipo de ContaBancaria –  O objeto contaCorrente1 pode ser chamado em qualquer

lugar onde uma instância de ContaBancaria é chamada •  Isto permite o chamado polimorfismo

Casting de Tipos

Page 119: Introdução a Linguagem Java

www.labes.ufpa.br

119

Casting Implícito •  Uma instância de uma sub classe pode ser atribuída

a uma variável de uma super classe através do casting implícito

•  Exemple ContaCorrente contCorrente = new ContaCorrente(); Poupanca poupanca = new Poupanca(); ContaBancaria conta = contCorrente; // Casting implícito ContaBancaria conta2 = poupanca; // Casting implícito Object objeto = poupanca; // Casting implícito

Casting de Tipos

Page 120: Introdução a Linguagem Java

www.labes.ufpa.br

120

Casting Explícito •  Uma instância de objeto de uma super classe deve ser

atribuída a uma variável de uma classe filha através do casting explícito (se não fizer isso é lançado erro de compilação)

•  Exemplo:

Casting de Tipos

ContaBancaria conta = new ContaCorrente(); ContaCorrente contaCorrente = (ContaCorrente) conta;

ContaBancaria conta = new Poupanca(); ContaCorrente contaCorrente = (ContaCorrente) conta;

Não lança erro de compilação, mas lança erro em tempo de execução

Page 121: Introdução a Linguagem Java

www.labes.ufpa.br

121

Operador instanceof •  É possível checar o tipo de uma instância de objeto

utilizando instanceof antes do casting de tipos •  Exemplo

ContaBancaria conta1 = new ContaCorrente(); ContaBancaria conta2 = new Poupanca(); if( conta2 instanceof ContaCorrente ) { ContaCorrente contaCorrente = (ContaCorrente) conta2;

}

Casting de Tipos

Page 122: Introdução a Linguagem Java

www.labes.ufpa.br

122

Exercício

Page 123: Introdução a Linguagem Java

www.labes.ufpa.br

123

– Dado o modelo UML anterior: – Crie classes Java e Atributos

• Quando necessário, considere classes abstratas e herança

• Diferencie varáveis de instância e de classe

• Organize as classes em pacotes Java

Exercício

Page 124: Introdução a Linguagem Java

www.labes.ufpa.br

124

ESTRUTURAS DE CONTROLE

•  Estruturas  de  Decisão  1  •  Estruturas  de  RepeHção  2  •  Estruturas  de  Redirecionamento  3  

Page 125: Introdução a Linguagem Java

www.labes.ufpa.br

125

•  Em Java existem 3 tipos de estruturas de controle – Estruturas de controle de decisão

•  Permitem selecionar seções específicas do código para serem executadas (if-then-else, swicth)

– Estruturas de controle de repetição •  Permitem executar seções específicas um número repetido de

vezes (while, for, do-while)

–  Estruturas de controle de redirecionamento •  Permitem redirecionar o fluxo de execução de comandos (break,

continue, return );

Estruturas de Controle

Page 126: Introdução a Linguagem Java

www.labes.ufpa.br

126

•  Estruturas de Decisão podem ser dos seguintes tipos: – Sentenças if – Sentenças if-else – Sentenças If-else-if – Sentenças switch

Estruturas de Decisão

Page 127: Introdução a Linguagem Java

www.labes.ufpa.br

127

●  Sentenças if –  Especificam que a sentença (ou bloco de código) será

executada somente se uma certa expressão booleana for verdadeira.

if( expre_booleana ) sentença;

ou if( expre_booleana ){ sentença;

sentença; }

– Onde, •  expre_booleana representa uma expressão

ou variável booleana.

Estruturas de Decisão

Page 128: Introdução a Linguagem Java

www.labes.ufpa.br

128

Estruturas de Decisão

Sentença

true false

●  Sentenças if

Page 129: Introdução a Linguagem Java

www.labes.ufpa.br

129

Sentenças if-else – Utilizadas quando se deseja executar algo quando

a sentença é verdadeira, e algo diferentes quando é falsa.

if( expre_booleana ){ sentença;

} else{ sentença;

}

Estruturas de Decisão

Page 130: Introdução a Linguagem Java

www.labes.ufpa.br

130

Estruturas de Decisão

Sentença

true false

●  Sentenças if-else

Sentença

Page 131: Introdução a Linguagem Java

www.labes.ufpa.br

131

●  Sentenças If-else-If •  A sentença em uma cláusula else pode ser outra estrutura if-

else.

•  Este encadeamento de estruturas permite a criação de seleções mais complexas.

if( expre_booleana ){ sentença;

} else if( expre_booleana ) { sentença;

} else if( expre_booleana ) { sentença;

} else { sentença; }

Estruturas de Decisão

Page 132: Introdução a Linguagem Java

www.labes.ufpa.br

132

Estruturas de Decisão

Sentença

true false

●  Sentenças if-else-if

Sentença

true false

Page 133: Introdução a Linguagem Java

www.labes.ufpa.br

133

Erros Comuns 1. Não utilizar uma expressão booelana no if. Por exemplo

//ERRADO int number = 0; if( number ){ //alguma sentença }

A variável number não possui um valor booleano (Este caso difere Java de C/C++, onde este exemplo acima estaria correto).

2. Escrever elseif (junto) ao invés de else if (separado).

Estruturas de Decisão

Page 134: Introdução a Linguagem Java

www.labes.ufpa.br

134

Erros Comuns 3. Utilizar = ao invés de == para comparação.

O correto é utilizar: int number = 0;

if( number == 0 ){ //alguma sentença }

Estruturas de Decisão

Page 135: Introdução a Linguagem Java

www.labes.ufpa.br

135

Sentenças switch –  Permitem múltiplos testes simultâneos.

•  Setenças switch possuem a seguite forma: switch( expres_switch){ case seletor1: sentença;

break; case seletor2: sentença;

break;

..... default:

sentença; }

Estruturas de Decisão

Onde: express_switch: pode ser um valor inteiro ou caracter

seletor1..n: um valor inteiro único ou uma

constante caracter

Page 136: Introdução a Linguagem Java

www.labes.ufpa.br

136

Estruturas de Decisão

break true Sentença

false

break true Sentença

false

break true Sentença

false Bloco default

Page 137: Introdução a Linguagem Java

www.labes.ufpa.br

137

•  Estruturas de decisão podem ser dos seguintes tipos: – Loop while – Loop do-while – Loop for

Estruturas de Repetição

Page 138: Introdução a Linguagem Java

www.labes.ufpa.br

138

Loop while –  É uma sentença ou bloco que é repetido enquanto

alguma condição é satisfeita.

while( expre_booleana ){ sentença1; sentença2; . . . }

–  Enquanto expre_booleana é verdadeira as sentenças

do loop são executadas.

Estruturas de Repetição

Page 139: Introdução a Linguagem Java

www.labes.ufpa.br

139

Loop do-while –  similar ao loop while – A principal diferença é:

•  Os comandos dentro do loop do-while são executados no mínimo uma vez.

do{ sentença1; sentença2; . . . }while( boolean_expression );

Estruturas de Repetição

Page 140: Introdução a Linguagem Java

www.labes.ufpa.br

140

Loop for – Permite a execução do mesmo código um número

específico de vezes.

for(expressaoDeInicializacao;condLoop;expressaoEmCadaPasso) {

sentença1; sentença2; . . .

}

Onde: •  expressaoDeInicializacao –inicializa variável de loop. •  condLoop – compara a variável de loop com algum valor limite. •  expressaoEmCadaPasso - atualiza a variável de loop.

Estruturas de Repetição

Page 141: Introdução a Linguagem Java

www.labes.ufpa.br

141

•  O código acima é equivalente ao seguinte loop while

Estruturas de Repetição

int i; for( i = 0; i < 10; i++ ){

System.out.println(i); }

int i = 0; while( i < 10 ){

System.out.print(i); i++;

}

Loop for: Exemplo

Page 142: Introdução a Linguagem Java

www.labes.ufpa.br

142

•  Java possui 3 tipo de estruturas de redirecionamento: – break – continue – return

Estruturas de Redirecionamento

Page 143: Introdução a Linguagem Java

www.labes.ufpa.br

143

Break sem marcador –  Finaliza o comando switch atual, e segue o fluxo

de controle para a sentença imediatamente posterior ao switch.

–  Isto pode também ser aplicado para finalizar um loop for, while ou do-while

Estruturas de Redirecionamento

for (int i = 0; i < nomes.length; i++) { if (nomeBusca.equals(nomes[i]) { achou=true break; } }

Page 144: Introdução a Linguagem Java

www.labes.ufpa.br

144

•  Break com marcador –  Finalizar um comando externo ao contexto atual,

que é identificado por um marcador no comando break.

– O fluxo de controle é transferido para a sentença imediatamente após a sentença marcada.

– O trecho de programa a seguir representa uma busca em um array de duas dimensões. Dois loops encadeados varrem o array. Quando o valor é encontrado o break com marcador finaliza o comando “marcacaoBusca”, que é um loop externo

Estruturas de Redirecionamento

Page 145: Introdução a Linguagem Java

www.labes.ufpa.br

145

int[][] numeros = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int numeroBusca = 5; boolean encontrouNumero = false;

marcacaoBusca: for (int i = 0; i < numeros.length; i++) { for (int j = 0; j <

numeros[i].length; j++) { if (numeroBusca == numeros[i][j]) { encontrouNumero = true; break marcacaoBusca; } } } if (encontrouNumero) System.out.println(numeroBusca + "

Encontrado!"); else System.out.println(numeroBusca + "

Nao Encontrado!");

Estruturas de Redirecionamento Break com marcador: Exemplo

Finaliza o for externo marcado

Page 146: Introdução a Linguagem Java

www.labes.ufpa.br

146

•  Continue sem marcador – Simplesmente pula a iteração atual de um loop

Estruturas de Redirecionamento

String  nomes[]  =  {  "Java",  "C",  "C++",  "Java"  };      int  quan)dade  =  0;  

       for  (int  i  =  0;  i  <  nomes.length;  i++)  {        if  (nomes[i].equals("Java"))  {          conHnue;  //  pula  o  proximo  comando        }        quan)dade++;      }    System.out.println("Existem  "  +  quan)dade  +  "  nomes  Java  na  lista");  

Page 147: Introdução a Linguagem Java

www.labes.ufpa.br

147

•  Continue com marcador – Pula a iteração corrente e continua o fluxo para um

loop externo devidamente marcado

Estruturas de Redirecionamento

loopExterno: for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.println("Dentro do for j"); // mensagem1 if (j == 2) continue loopExterno; } System.out.println("Dentro do for i"); // mensagem2 } Nunca chega exibir a mensagem2

Quantas vezes a mensagem1 é exibida?

Page 148: Introdução a Linguagem Java

www.labes.ufpa.br

148

Return – Utilizado para sair do método corrente –  Fluxo de controle retorna ao comando que invocou

o método originalmente.

Estruturas de Redirecionamento

public String ComandoReturn(){ return "TextoQualquer";

} Em método void, basta colocar return;

Page 149: Introdução a Linguagem Java

www.labes.ufpa.br

149

TRATAMENTO DE EXCEÇÕES

• O  que  é  uma  Exceção?  1  • Tratamento  de  exceções  com  try/catch  2  

• Criando  e  Lançando  Exceções  3  

• Asserções  4  

Page 150: Introdução a Linguagem Java

www.labes.ufpa.br

150

•  Evento não esperado •  Erro que ocorre em tempo de execução •  Causa ruptura do fluxo normal do programa •  Exemplos

–  Erros de divisão por zero –  Acessar elementos de um array além do tamanho –  Entrada inválida –  Pane no disco rígido –  Abertura de arquivo não existente –  Estouro do Heap de memória

O que é uma Exceção?

Page 151: Introdução a Linguagem Java

www.labes.ufpa.br

151

O que é uma Exceção?

class DivisaoPorZero { public static void main(String args[]) {

System.out.println(3/0); System.out.println("me escreva"); } }

O código abaixo

Gera a seguinte saída:

Page 152: Introdução a Linguagem Java

www.labes.ufpa.br

152

•  Tratador default de exceções: –  Provido pelo runtime Java –  Imprime uma descrição da exceção –  Imprime a pilha de exceções

•  Hierarquia de métodos onde a exceção ocorreu

–  Faz o programa finalizar •  Quando uma exceção ocorre em um método, o

método cria um objeto exceção e lança ao sistema de execução –  Criar um objeto exceção e lançar no sistema de execução é

chamado “throwing an exception” –  Objetos de exceção contém informações sobre o erro,

incluindo o tipo e o estado do programa quando o erro ocorreu

O que é uma Exceção?

Page 153: Introdução a Linguagem Java

www.labes.ufpa.br

153

•  O sistema de execução busca pela pila de chamadas um método que trate a exceção

O que é uma Exceção?

Método  onde  ocorreu  erro  

Método  sem  um  tratador  de  exceção  

Método  com  um  tratador  de  exceção  

main  

Chamada de método

Chamada de método

Chamada de método

Page 154: Introdução a Linguagem Java

www.labes.ufpa.br

154

•  Buscando um tratador de exceção

O que é uma Exceção?

Método  onde  ocorreu  erro  

Método  sem  um  tratador  de  exceção  

Método  com  um  tratador  de  exceção  

main  

Procura tratador apropriado

Procura tratador apropriado

Lança exceção

Encaminha exceção

Captura exceção

Page 155: Introdução a Linguagem Java

www.labes.ufpa.br

155

Tratamento de exceções com try/catch •  U m m é t o d o p o d e

organizar suas exceções lançando-as para que um método posterior possa tratá-las.

•  Assim, somente métodos que “se importam” com os erros precisam tratá-los

•  Q u a l q u e r e x c e ç ã o lançada deve es tar explicitamente estar na assinatura do método (utilizando o throws).

metodo1 (){ try {

metodo2(); } catch (exception e) { processaErro(); } } metodo2 () throws exception {

metodo3(); } metodo3 () throws exception {

leituraArquivo(); }

Page 156: Introdução a Linguagem Java

www.labes.ufpa.br

156

Tratamento de exceções com try/catch

class  DivisaoPorZeroComTry  {      

 public  staHc  void  main(String  args[])  {        try  {          System.out.println(3  /  0);  

     System.out.println("me  escreva");      }  catch  (Arithme)cExcep)on  exc)  {        //  Divissao  por  zero  é  uma  Arithme)cExcep)on        System.out.println(exc);      }  finally{        //  Codigo  a  ser  excutado  antes  do  bloco  try  terminar        System.out.println(“passou  pelo  finally  ");      }      System.out.println("Apos  excecao.");    }  

}  

●  Exemplo

Page 157: Introdução a Linguagem Java

www.labes.ufpa.br

157

•  Java permite ao programador lançar exceções throw <ObjetoExcecao>;

•  Um exceção é um objeto – É necessário criar uma objeto exceção da mesma

forma como se cria qualquer objeto Java

•  Exemplo: throw new ArithmeticException(“teste...”);

Criando e Lançando Exceções

Page 158: Introdução a Linguagem Java

www.labes.ufpa.br

158

Criando Exceções Próprias •  Criar exceções próprias para um programa cria um

mecanismo específico para tratar as exceções no escopo do próprio sistema

•  Passos para seguir –  Criar uma classe que estenda a RuntimeException ou a

classe Exception –  Customize a classe

•  Membros e construtores podem ser adicionados à classe

•  Exemplo: class ExcecaoExemplo extends RuntimeException { /* algum codigo */ }

Criando e Lançando Exceções

Page 159: Introdução a Linguagem Java

www.labes.ufpa.br

159

Criando e Lançando Exceções

class TesteNegaString { public static void main(String args[]) { String input = "entrada invalida"; try { if (input.equals("entrada invalida")) { throw new ExcecaoExemplo(); } System.out.println("Aceitou string."); } catch (ExcecaoExemplo e) { System.out.println("Negou string!"); } } }

Lança exceção

Captura exceção

Page 160: Introdução a Linguagem Java

www.labes.ufpa.br

160

•  Permitem que o programador verifique se uma condição foi alcançada na execução do programa

•  Estende os comentários de tal forma que uma asserção indica ao leitor do código que uma condição particular deve sempre acontecer –  O programa informa se as asserções são verdadeiras ou

falsas –  Se uma asserção não é verdadeira, uma AssertionError é

lançada •  O usuário tem a opção de desligar a execução da

checagem de asserções

Asserções

Page 161: Introdução a Linguagem Java

www.labes.ufpa.br

161

Habilitando e Desabilitando Asserções •  Programa com asserções não funciona corretamente

em clientes que não habilitam tal propriedade •  Compilação

–  Código deve ser compilado com java 1.4 ou superior •  Habilitando asserções:

–  Ao invocar o interpretador, utilize a tag ”–enableassertions” ou “–ea”.

java –enableassertions MeuPrograma

Asserções

Page 162: Introdução a Linguagem Java

www.labes.ufpa.br

162

•  Habilitando e Desabilitando Asserções

Asserções

Eclipse

NetBeans

Propriedades

Page 163: Introdução a Linguagem Java

www.labes.ufpa.br

163

Asserções

Sintaxe: class AssercaoDeIdade {

public static void main(String args[]) {

int idade= 0; assert (idade > 0); // : String de saida

/* se idade é válida (i.e., idade>0) */ if (idade >= 18) { System.out.println("Você é um adulto! =)"); } }

}

Page 164: Introdução a Linguagem Java

www.labes.ufpa.br

164

Exercício

Page 165: Introdução a Linguagem Java

www.labes.ufpa.br

165

– Dado o modelo UML anterior, considere uma operação que lê dados de entrada do usuário e cadastra em banco os dados:

– Defina e codifique no mínimo 3 exceções Java que tenha significado ao contexto citado

Exercício

Page 166: Introdução a Linguagem Java

www.labes.ufpa.br

166

OPERAÇÕES MATEMÁTICAS E OPERADORES

Page 167: Introdução a Linguagem Java

www.labes.ufpa.br

167

•  Provê constantes e métodos pré-definidos para realizar diferentes operações matemáticas

•  Métodos e Constantes são variáveis de classe (estát icas), permit indo o acesso sem necessidade de instanciar a classe

•  Constantes: •  Math.E à 2.718281828459045 •  Math.PI à 3.141592653589793

java.lang.Math

Page 168: Introdução a Linguagem Java

www.labes.ufpa.br

168

•  Métodos: •  Absoluto de -5 = Math.abs(-5) •  Número randômico (máximo é 10) = Math.random() * 10 •  Número máximo e mínimo entre 3.5 e 1.2 = Math.max(3.5,1.2),Math.min(3.5,1.2) •  Funções teto e piso = Math.ceil(3.5), Math.floor(3.5) •  Número de Euler elevado a 1 = Math.exp(1) •  log 10 = Math.log(10) •  10 elevado a 3 = Math.pow(10, 3) •  Arrondamento do PI = Math.round(Math.PI) •  Raiz quadrada de 5 = Math.sqrt(5) •  10 radianos transformados em graus = Math.toDegrees(10) + " graus") •  Seno de 90 = Math.sin(Math.toRadians(90))

java.lang.Math

Page 169: Introdução a Linguagem Java

www.labes.ufpa.br

169

Operadores Aritméticos

Operador Uso Descrição

+ op1+op2 Soma op1 e op2

* op1*op2 Multiplica op1 por op2

/ op1/op2

Divide op1 por op2

% op1%op2

Computa o resto da divisão de op1 por op2

- op1-op2

Subtrai op1 por op2

Page 170: Introdução a Linguagem Java

www.labes.ufpa.br

170

Operadores Aritméticos

Operador Uso Descrição

++ op++ Incrementa op em 1; avalia o valor de op antes de ser incrementado

++ ++op Incrementa op em 1; avalia o valor de op depois de ser incrementado

-- op--

Subtrai op em 1; avalia o valor de op antes de ser incrementado

-- --op1

Subtrai op em 1; avalia o valor de op depois de ser incrementado

Operadores de incremento e decremento

Page 171: Introdução a Linguagem Java

www.labes.ufpa.br

171

Operadores Aritméticos

int i = 10; int j = 3; int k = 0; k = ++j + i; //resulta em k = 4+10 = 14

Operadores de incremento e decremento

int i = 10; int j = 3; int k = 0; k = j++ + i; //resulta em k = 3+10 = 13

Page 172: Introdução a Linguagem Java

www.labes.ufpa.br

172

•  Comparam dois valores e determinam o relacionamento entre estes valores

•  A saída da avaliação é true ou false.

Operadores Relacionais

Operador Uso Descrição

> op1>op2 op1 é maior que op2 >= op1>=op2 op1 é maior ou igual a op2 < op1<op2 op1 é menor que op2 <= pp1<=op2 op1 é menor ou igual a op2 == op1==op2 op1 é igual a op2

!= op1!=op2 op1 é diferente de op2

Page 173: Introdução a Linguagem Java

www.labes.ufpa.br

173

•  Possuem um ou dois operandos booleanos que produzem um resultado booleano.

•  Estes são os 6 operadores lógicos: –  && (AND lógico)‏ –  & (AND lógico booleano)‏ –  || (OR lógico) ‏ –  | (OR lógico booleano inclusivo)‏ –  ^ (OR lógico booleano exclusivo)‏ –  ! (NOT lógico)‏

Operadores Lógicos

Page 174: Introdução a Linguagem Java

www.labes.ufpa.br

174

● Operadores Lógicos && e & ●  Diferença básica:

-  &&  permite  avaliações  de  curto-­‐circuito  (ou  avaliações  parciais),  enquanto  &  não.    

●  Dada a expressão: exp1 && exp2

-  &&   irá   avaliar   a   expressão   exp1,   e   imediatamente  retornar  false  se  o  valor  de  exp1  for  falso.    

-  Em  contraste,  o  operador  &  sempre  avaliar  ambos  exp1  e  exp2  antes  de  retornar  a  resposta.    

Operadores Lógicos

Page 175: Introdução a Linguagem Java

www.labes.ufpa.br

175

public class TestAND { public static void

main( String[] args ){ int i = 0; int j = 10; boolean test= false;

//demonstra && test = (i > 10) && (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test);

//demonstra & test = (i > 10) & (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test);

} }

Operadores Lógicos

●  Operadores Lógicos && e &

Qual saída este programa gera no console?

Page 176: Introdução a Linguagem Java

www.labes.ufpa.br

176

● Operadores Lógicos || e | ●  Seguem a mesma lógica dos operadores && e &, ou seja:

-  ||  permite  avaliações  de  curto-­‐circuito  (ou  avaliações  parciais),  enquanto  |  não.  

●  Dada a expressão: exp1 || exp2

-  ||  irá  avaliar  a  expressão  exp1,  e  imediatamente  retornar  true  se  exp1  é  verdadeiro  

-  Em  contrastes,  o  operador  |  sempre  avaliar  as  duas  expressões  antes  de  retornar  a  resposta.      

Operadores Lógicos

Page 177: Introdução a Linguagem Java

www.labes.ufpa.br

177

•  O resultado de uma operação de OU exclusivo é verdadeiro, se e um dos operandos é verdadeiro e o outro é falso

•  Sempre os dois operandos serão avaliadospara calcular o resultado.

Operadores Lógicos

●  Operador Lógico ^ (OU exclusivo)

●  Operador Lógico ! (NÃO lógico) ●  O resultado de uma operação de NÃO lógico é a negação

do valor avaliada ●  Se é verdadeiro o resultado é falso, se é falso o resultado é

verdadeiro

Page 178: Introdução a Linguagem Java

www.labes.ufpa.br

178

•  Operador Lógico condicional ? : – É uma operador ternário.

•  Isto significa que recebe três argumentos de expressão condicional.

– A estrutura de uma expressão utilizando o operador condicional é:

exp1?exp2:exp3 onde, exp1 – é um expressão booleana que pode resultar em true ou false

– Resultado: Se exp1 é true, exp2 é o valor retornado. Se for false, então exp3 é retornada.

Operadores Lógicos

Page 179: Introdução a Linguagem Java

www.labes.ufpa.br

179

Operadores Lógicos ●  Operador Lógico condicional ? :

public class OperadorCondicional { public static void main( String[] args ){ String status = ""; int grade = 80; //pega status do estudante status = (grade >= 60)?"Passou":"Falhou"; //escreve status System.out.println( status ); } }  

Page 180: Introdução a Linguagem Java

www.labes.ufpa.br

180

Precedência de Operadores Posição Operador

1 [] . () 2 ! ~ ++ - +(unario) –(unario) () (cast) new 3 * / % 4 + - 5 < <= > >= instanceof

6 == != 7 & 8 ^ 9 | 10 && 11 || 12 ?:

Page 181: Introdução a Linguagem Java

www.labes.ufpa.br

181

•  Dada a seguinte expressão,

6%2*5+4/2+88-10 Pode-se re-escrever com alguns parentes baseado na precedência de operadores,

((6%2)*5)+(4/2)+88-10

Precedência de Operadores

Page 182: Introdução a Linguagem Java

www.labes.ufpa.br

Parte III Programação Avançada

Page 183: Introdução a Linguagem Java

www.labes.ufpa.br

183

COLEÇÕES JAVA

Page 184: Introdução a Linguagem Java

www.labes.ufpa.br

184

O que é uma Coleção? •  Um objeto coleção — algumas vezes chamados de

“container” — é simplesmente um objeto que agrupa múltiplos elementos em uma unidade

•  Coleções são utilizadas para armazenar, recuperar, manipular e comunicar dados agregados –  Tipicamente, representam itens de dados que

formam um grupo natural, como uma pasta de email (uma coleção de cartas), ou um diretório de telefones (um mapeamento entre nomes e números de telefones).

Framework de Coleções

Page 185: Introdução a Linguagem Java

www.labes.ufpa.br

185

•  O framework de coleções é uma arquitetura unificada para representar e manipular coleções

•  O framework de coleções possui: –  Interfaces –  Implementações –  Algoritmos

Framework de Coleções

Page 186: Introdução a Linguagem Java

www.labes.ufpa.br

186

Benefícios: •  Reduz esforço de programação •  Incrementa velocidade e qualidade dos programas •  Permite interoperabilidade entre APIS não

relacionadas –  As interfaces de coleções são padrão na troca de dados

entre APIS •  Reduz tempo de aprendizagem de novas APIS •  Reduz esforço para projetar novas APIS •  Promove o reuso de software

–  Novas estruturas de dados que esteja de acordo com as interfaces padrão de coleção são naturalmente reutilizáveis

Framework de Coleções

Page 187: Introdução a Linguagem Java

www.labes.ufpa.br

187

•  Interfaces Collection são tipos de dados abstratos que estão definidas na forma de interfaces Java

•  Interfaces definem como coleções são manipuladas independentemente dos seus detalhes de implementação internos – Comportamento polimórfico

•  Em Java (e em outras linguagens orientadas a objetos), interfaces genericamente formam uma hierarquia

Interfaces e Implementações

Page 188: Introdução a Linguagem Java

www.labes.ufpa.br

188

•  Hierarquia Básica de Interfaces

Interfaces e Implementações

Page 189: Introdução a Linguagem Java

www.labes.ufpa.br

189

•  Implementações são objetos utilizados para armazenar coleções, implementando as interfaces do framework

•  Cada implementação de propósito geral provê o s o p e r a d o r e s d a s i n t e r f a c e s q u e implementam

•  O framework de coleções Java também provê várias implementações para situações específicas

Interfaces e Implementações

Page 190: Introdução a Linguagem Java

www.labes.ufpa.br

190

Interfaces Implementações HashTable ResizableArray Árvore Linked List HashTable +

LinkedList

Set HashSet TreeSet LinkedHashSet

List ArrayList LinkedList

Map HashMap TreeMap LinkedHashMap

●  Implementações de Propósito geral

Interfaces e Implementações

Page 191: Introdução a Linguagem Java

www.labes.ufpa.br

191

•  Nas últimas versões do Java, algumas classes que tratam de coleções foram consideradas “legadas”: – Vector – Stack – Hashtable – Properties

Interfaces e Implementações

Page 192: Introdução a Linguagem Java

www.labes.ufpa.br

192

•  É a raiz para a hierarquia de coleções •  É o último denominador comum que as coleções

implementam –  Todo objeto coleção é um tipo da interface Collection

•  É utilizado para passar objetos de coleção e manipular quando generalização máxima é desejada –  Utilize a interface Collection como um tipo

•  JDK não provê implementação direta desta interface, mas prove implementações mais específicos como Set e List

Interface Collection

Page 193: Introdução a Linguagem Java

www.labes.ufpa.br

193

public interface Collection { boolean add(Object o); boolean addAll(Collection c); void clear(); boolean contains(Object o); boolean containsAll(Collection c); boolean equals(Object o); int hashCode(); boolean isEmpty(); Iterator iterator(); boolean remove(Object o); boolean removeAll(Collection c); boolean retainAll(Collection c); int size(); Object[] toArray(); Object[] toArray(Object[] a);

}

Interface Collection

Page 194: Introdução a Linguagem Java

www.labes.ufpa.br

194

Métodos de adição e remoção •  O método add() é definido genericamente o suficiente

para admitir a adição de itens duplicados ou não, o que depende das implementações da interface Collection

•  Isto garante que a coleção irá conter o elemento passado como parâmetro após a invocação do método.

add(Object obj) e remove(Object obj)

Operações em Coleções

…conjuntoA.add(new Integer(1)); conjuntoA.remove(new Integer(1));

Adiciona objeto

Remove objeto

Page 195: Introdução a Linguagem Java

www.labes.ufpa.br

195

Navegação Para navegar entre os elementos de uma coleção existem o for each e Iterator:

•  for each (a partir do Java 5) –  O construtor for each permite que se navegue por um array

ou collection de forma concisa

Operações em Coleções

…Collection<String> nomes = new ArrayList<String>();nomes.add("a");nomes.add("b");nomes.add("c");

for (String umNome: nomes) System.out.println(umNome.charAt(0));…

Page 196: Introdução a Linguagem Java

www.labes.ufpa.br

196

Navegação •  Iterator

–  Um Iterator é um objeto que permite a navegação em uma coleção e remover elementos da coleção de forma seletiva, caso desejado

Operações em Coleções

…Collection<String> nomes = new ArrayList<String>();nomes.add("a");nomes.add("b");nomes.add("c");for (Iterator it=nomes.iterator();it.hasNext();) System.out.println(String(it.next())s);…

Obtém iterator

Testa se ainda existem elementos

Obtém a referência do próximo objeto

Page 197: Introdução a Linguagem Java

www.labes.ufpa.br

197

…for (Iterator it=nomes.iterator();it.hasNext();)

if(it.next()!=null){ it.remove();

}…

•  Iterator e for each –  O construtor do for each escondo o Iterator, o que não

permite invocar o método remove(); –  Use explicitamente o Iterator caso queira navegar e filtrar os

dados da coleção

Operações em Coleções

Remove o objeto atual na navegação da coleção

Page 198: Introdução a Linguagem Java

www.labes.ufpa.br

198

Outras operações •  containsAll(Collection entrada) — retorna true se a coleção alvo

contém todos os elementos da coleção passada como parâmetro.

•  addAll(Collection entrada) — adiciona todos os elementos da coleção passada como parâmetro na coleção alvo.

•  removeAll(Collection entrada) — remove todos os elementos da coleção passada como parâmetro que também pertençam à coleção alvo.

•  retainAll(Collection entrada) — contrário do anterior, pois remove todos os elementos que não estejam em comum na coleção passada como parâmetro

•  clear() — remove todos os elementos da coleção

Operações em Coleções

Page 199: Introdução a Linguagem Java

www.labes.ufpa.br

199

•  Representa uma coleção que não pode ter elementos duplicados

•  Modela a abstração matemática de conjunto: –  Matérias de um curso de graduação –  Conjunto de pessoas em uma sala

•  Esta interface possui apenas os mesmos métodos herdados da interface Collection.

•  Apenas nas implementações desta interface são adicionadas operações para garantir que não conterá elementos repetidos

•  Não existe restrição nenhuma em relação a ordem em que os elementos são agrupados

Interface Set

Page 200: Introdução a Linguagem Java

www.labes.ufpa.br

200

Implementações da Interface Set •  HashSet – conjunto genérico e não ordenado que armazena

por valor hash •  TreeSet – árvore não balanceada cujos elementos estão

ordenados (garante tempo log(n) para operações básicas - add, remove and contains)

•  LinkedHashSet – um conjunto HashSet que amazena também a ordem de inserção

Interface Set

HashSet

1

3

2LinkedHashSet

Page 201: Introdução a Linguagem Java

www.labes.ufpa.br

201

HashSet, TreeSet e LinkedHashSet •  HashSet é mais rápido que TreeSet em várias

operações (tempo constante versus tempo log para as operações), mas não oferece nenhuma garantia de ordenamento

•  HashSet é a implementação mais comumente utilizada

•  LinkedHashSet provê quase o mesmo tempo de acesso de HashSet e não possui o custo de log como TreeSet.

Interface Set

Page 202: Introdução a Linguagem Java

www.labes.ufpa.br

202

•  Representa uma coleção ordenada (algumas vezes chamada de seqüência ) ‏

•  Lista pode conter elementos duplicados em sua definição

•  O usuário da lista geralmente tem controle preciso sobre a posição onde está cada elemento da lista

•  Pode acessar os elementos pelo valor inteiro de sua posição

•  Provê operações adicionais à interface Collection, que possuem as seguintes funções: acesso pela posição, busca, iteração e listagens por range

Interface List

Page 203: Introdução a Linguagem Java

www.labes.ufpa.br

203

public interface List<E> extends Collection<E> {  

E get(int index); E set(int index, E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection c); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); List<E> subList(int from, int to);

}  

Interface List

Page 204: Introdução a Linguagem Java

www.labes.ufpa.br

204

Implementações •  ArrayList

–  Oferece tempo constante de acesso, utiliza um array como representação interna e é a implementação de lista mais utilizada

•  LinkedList –  Utilizado para freqüentemente adicionar elementos ao topo

da lista, navegar e apagar elementos no interior da lista

Interface List

ArrayList

remove

LinkedList

Page 205: Introdução a Linguagem Java

www.labes.ufpa.br

205

•  Em relacionamentos entre objetos onde pode haver mais de um objeto envolvido, podem ser utilizados arrays ou coleções

•  Pela flexibilidade e facilidade de uso, naturalmente utilizam-se coleções Java para representar relacionamentos do lado “n”.

Coleção como Atributo

Relacionamentos n-ários

Page 206: Introdução a Linguagem Java

www.labes.ufpa.br

206

•  Codificação

Coleção como Atributo

public class Funcionario { private String nome; private String cpf; private Date dataAdmissao; private String tipo; private Date dataNascimento;

  private Funcionario chefe; private Collection subordinados;

  private Divisao lotacao; }

Page 207: Introdução a Linguagem Java

www.labes.ufpa.br

207

•  Codificação

Coleção como Atributo

public class Regional { private String nome; private String sigla; private String endereco;

  private Collection divisoes;

}

Page 208: Introdução a Linguagem Java

www.labes.ufpa.br

208

– Dado o modelo de súmulas de futebol: – Codifique os relacionamentos entre as

classes – Considere a cardinalidade e a direção – Quando determinado, defina o tipo de

ordenação (List ou Set)

Exercício

Page 209: Introdução a Linguagem Java

www.labes.ufpa.br

209

JAVA I/O – ACESSANDO ARQUIVOS

Page 210: Introdução a Linguagem Java

www.labes.ufpa.br

210

•  Representa as operações de entrada e saída de dados para um destino

•  Pode ser representado por diferentes tipos de fontes e destinos –  Arquivos em disco, aparelhos, outros programas, um socket

de rede, arrays em memória, entre outros. •  Pode operar com diferentes tipos de dados

–  Bytes simples, tipos de dados primitivos, caracteres específicos e objetos

•  Um programa Java utiliza a abstração de Stream para criar um canal de comunicação entre fonte e destino

O que é Java I/O

Page 211: Introdução a Linguagem Java

www.labes.ufpa.br

211 source:java.sun.com

O que é Java I/O

Input stream

Fonte  

Stream  

DesHno  

Page 212: Introdução a Linguagem Java

www.labes.ufpa.br

212

O que é Java I/O

Output stream

source:java.sun.com

DesHno  

Stream  

Fonte  

Page 213: Introdução a Linguagem Java

www.labes.ufpa.br

213

•  Representa uma abstração sobre os a r q u i v o s e d i r e t ó r i o s v e r d a d e i r o s armazenados no SO

•  Não é uma stream Java •  É muito importante I/O Java, pois streams

Java manipulam objetos da classe File •  P o s s u i o p e r a ç õ e s p a r a a c e s s a r

propriedades do arquivo ou diretório, tais como permissões de leitura, escrita, tamanho, etc.

Classe File

Page 214: Introdução a Linguagem Java

www.labes.ufpa.br

214

Classe File   public class FileInfoClass {

public static void main(String args[]) { String nomeArquivo = "arquivo.txt";//mude aqui o nome para o diretorio

que queira testar File arquivoRef = new File(nomeArquivo); System.out.println("Nome: " + arquivoRef.getName()); if (!arquivoRef.exists()) {

System.out.println(nomeArquivo + " nao existe"); /* Cria um diretorio temporario */ System.out.println("Criando diretorio temporario..."); nomeArquivo = "temp"; arquivoRef = new File(nomeArquivo); arquivoRef.mkdir(); System.out.println(nomeArquivo + (arquivoRef.exists() ? "existe" :

"nao existe")); System.out.println("Deleting temp directory..."); arquivoRef.delete(); System.out.println(nomeArquivo + " e um " + (arquivoRef.isFile() ?

"arquivo ." : "diretorio .")); }

…  

Cria objeto arquivo

Verifica se arquivo já existe

Cria um diretório temp

Apaga arquivo

Page 215: Introdução a Linguagem Java

www.labes.ufpa.br

215

…if (arquivoRef.isDirectory()) {

String content[] = arquivoRef.list(); System.out.println("O conteudo do diretorio"); for (int i = 0; i < content.length; i++) {

System.out.println(content[i]); }

} System.out.println(nomeArquivo + " tem tamanho = " +

arquivoRef.lastModified() ); if (!arquivoRef.canRead()) {

System.out.println(nomeArquivo + " nao pode ser lido"); return;

} System.out.println(nomeArquivo + " tem tamanho " +

arquivoRef.lastModified()); if (!arquivoRef.canWrite()) {

System.out.println(nomeArquivo + " nao pode ser escrito"); }

}  }  

Verifica se é diretório

Imprime nome do arquivo

Classe File

Page 216: Introdução a Linguagem Java

www.labes.ufpa.br

216

Leitura e Escrita de Arquivos Hierarquia

Page 217: Introdução a Linguagem Java

www.labes.ufpa.br

217

Leitura e Escrita de Arquivos

Programa

Fluxo de dados

Page 218: Introdução a Linguagem Java

www.labes.ufpa.br

218

•  Streams de Byte – Streams de dados binários – Classes raiz para streams de bytes:

•  Classe InputStream •  Classe OutputStream •  Ambas são classes abstratas

•  Streams de Character – Para caracteres Unicode – Classes raiz para streams de caracteres:

•  Classe Reader •  Classe Writer •  Ambas são abstratas

Leitura e Escrita de Arquivos

Page 219: Introdução a Linguagem Java

www.labes.ufpa.br

219

public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("eln.txt"); out = new FileOutputStream("saidaeln.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } // mais codigo finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } }

}

Leitura e Escrita de Arquivos FileInputStream e FileOutputStream

Cria referências

Lê da entrada e escreve na saída

Fecha referências aos arquivos

Page 220: Introdução a Linguagem Java

www.labes.ufpa.br

220

•  Leitura de Linhas •  Entrada e Saída baseada em caracteres é uma

operação muito “baixo nível” •  Entrada e Saída usualmente utiliza unidades

maiores que um simples caracter – Uma unidade comum é uma linha: uma string

com um caracter terminador no final – Um terminador de linha pode ser um retorno de

carro seguido de nova linha ("\r\n"), um único retorno de carro ("\r"), ou uma única nova linha ("\n").

Leitura e Escrita de Arquivos

Page 221: Introdução a Linguagem Java

www.labes.ufpa.br

221

public static void main(String[] args) {   File inputFile = new File("eln.txt"); File outputFile = new File("saidaeln.txt"); FileReader in; FileWriter out; try {

in = new FileReader(inputFile); out = new FileWriter(outputFile);

 BufferedReader inputStream = new

BufferedReader(in); PrintWriter outputStream = new

PrintWriter(out);

String l; while ((l = inputStream.readLine()) != null) {

System.out.println(l); outputStream.println(l);

}  

in.close(); out.close();

  } catch (FileNotFoundException e) {

e.printStackTrace(); } catch (IOException e) {

e.printStackTrace(); }

}

Leitura e Escrita de Arquivos ●  Leitura de Linhas

Page 222: Introdução a Linguagem Java

www.labes.ufpa.br

222

•  Uma operação de I/O sem buffer significa que cada chamada de leitura ou escrita é capturada diretamente pelo SO –  Isto pode fazer os programas ficarem ineficientes, a partir de

que cada requisição geralmente representa um acesso a disco, atividade de rede, ou alguma operação geralmente custosa.

•  Para reduzir este tipo de overhead, a plataforma Java implementa streams com buffer de I/O –  Streams com buffer de entrada lêem dados de área de

memória conhecida como buffer; a API nativa é chamada quando o buffer está vazio

–  Similarmente, Streams com buffer de saída escrevem dados para o buffer, e a API nativa é chamada quando o buffer estiver cheio.

Buffer de I/O

Page 223: Introdução a Linguagem Java

www.labes.ufpa.br

223

•  Um programa pode converter uma stream sem buffer em uma stream com buffer utilizando o “empacotamento”: –  Uma stream sem buffer é passada como

parâmetro no construtor de classe stream com buffer

•  Exemplo inputStream = new BufferedReader(new

FileReader(”entra.txt")); outputStream =new BufferedWriter(new

FileWriter(”sai.txt"));

Buffer de I/O

Page 224: Introdução a Linguagem Java

www.labes.ufpa.br

224

•  Geralmente não faz sentido enviar dados do buffer em pontos críticos, sem esperar pelo preenchimento do mesmo. Isto é conhecido como “flush” do buffer.

•  Alguns buffers permitem flush automático, que é especificado por um parâmetro opcional no construtor. –  Quando flush automático está habilitado, certos eventos

chave fazem com o buffer seja descarregado –  Por exemplo, um objeto PrintWriter com flush automático

descarrega os dados em toda invocação de println(). •  Para realizar o “flush” de arquivos manualmente, é

necessário invocar o método flush().

Buffer de I/O

Page 225: Introdução a Linguagem Java

www.labes.ufpa.br

225

•  Em Java existem três tipos de stream padrão: – Entrada Padrão, acessada por System.in – Saída Padrão, acessada por System.out – Erro Padrão, acessada por System.err

•  Estes objetos são definidos automaticamente e não precisam ser instanciados

•  System.out e System.err são definidas como objetos PrintStream (streams de escrita)

Entrada e Saída Padrão

Page 226: Introdução a Linguagem Java

www.labes.ufpa.br

Capa

citaç

ão E

letro

norte

– 20

07 -

2008

226

Entrada e Saída Padrão

public class LeituraEntradaPadrao {  

public static void main(String[] args) throws IOException { DataOutputStream output = new DataOutputStream(System.out); DataInputStream in = new DataInputStream(System.in);

  int c; while ((c = in.read()) != -1)

output.write(c); in.close(); //sempre fechar antes de terminar output.close();//sempre fechar antes de terminar

}   }

MacLima:bin adailton$ java br.eln.java.io.LeituraEntradaPadrao < ../eln.txt *************** inicio do arquivo linha 1 linha 2 linha3 fim do arquivo ************** MacLima:bin adailton$

Page 227: Introdução a Linguagem Java

www.labes.ufpa.br

227

•  Geralmente ler o conteúdo de entrada a partir da linha comando e com sigilo exige a definição de alguma classe utilitária para tal tarefa.

•  O Java SE 6 int roduziu a c lasse Console especificamente para facilitar esta tarefa.

•  Para ler uma senha, utilize o seguinte código: – Console cons = System.console(); – String username = cons.readLine(“Nome Usuario: "); – char[] passwd = cons.readPassword(“Senha: ");

Java 6: Classe Console

Page 228: Introdução a Linguagem Java

www.labes.ufpa.br

228

– Considere um arquivo de texto com o conteúdo no seguinte formato:

Exercício

Fulano 89 \n Fulano 23 \n Fulano 45 \n Beltrano 33 \n EOF

Nome Jogador

Minuto do jogo em que marcou gol Linha

Page 229: Introdução a Linguagem Java

www.labes.ufpa.br

229

– Codifique um método que receba como entrada o nome do arquivo, e processa o texto escrevendo na tela quantos gol cada jogador fez e o minuto do primeiro gol

Exercício

Page 230: Introdução a Linguagem Java

www.labes.ufpa.br

230

NOVAS FUNCIONALIDADES

Page 231: Introdução a Linguagem Java

www.labes.ufpa.br

231

Recentes Evoluções do Java

Loop for each Import Estático

Autoboxing Generics

Java Web Start Annotations

Java 5

Page 232: Introdução a Linguagem Java

www.labes.ufpa.br

232

Recentes Evoluções do Java

SplashScreen SystemTray

JDBC 4.0 Scripting (JavaScript, JavaFX e JRuby)

JAX-WS (Web Services) Melhorias de I/O (Console, Permissões)

Java 6

Page 233: Introdução a Linguagem Java

www.labes.ufpa.br

233

•  De maneira geral, a versão 5 do Java incluiu novas estruturas para a linguagem em si

•  A versão 6 adicionou várias melhorias de performance e funcionalidades relacionadas à plataforma, como acesso a banco, apoio a scripts, etc.

•  A versão 7 está no forno ainda, mas pretende adicionar novas estruturas para linguagem, como por exemplo tipagem dinâmica

Recentes Evoluções do Java

Page 234: Introdução a Linguagem Java

www.labes.ufpa.br

234

•  Permite que uma classe tenha acesso a membros estáticos (atributos e métodos) sem necessitar digitar explicitamente a classe originária, como em: double r = Math.cos(Math.PI * valor);

•  O import estático permite acesso a membros estáticos sem necessariamente utilizar herança. Assim, o programa importa somente os membros individualmente: import static java.lang.Math.PI;

•  ou import static java.lang.Math.*;

Import Estático

Page 235: Introdução a Linguagem Java

www.labes.ufpa.br

235

•  Uma vez importados, os membros estáticos podem ser utilizados diretamente: double r = cos(PI * theta);

•  A declaração de import estático é análogo ao import normal, pois permite acesso sem necessitar explicitar o path completo

Import Estático

import static java.lang.Math.PI; import static java.lang.Math.round;    public class ImportMathEstatico {  

public static void main(String args[]){ System.out.println(" Valor de PI = "+PI); System.out.println(" Valor de -5 arredondado =

"+round(-5)); } 

}

Page 236: Introdução a Linguagem Java

www.labes.ufpa.br

236

•  Utilize quando precisar ter acesso freqüente a membros estáticos de uma ou duas classes.

•  Se utilizar mal a funcionalidade de import estático, pode fazer o programa perder legibilidade e manutenibilidade, poluindo o código com todos os membros estáticos importados.

•  Se utilizado apropriadamente, o import estático pode fazer o programa mais legível (pois remove toda a repetição de nomes de classes)

Import Estático

Page 237: Introdução a Linguagem Java

www.labes.ufpa.br

237

•  Esse processo de empacotamento entre primitivos e objetos é algo intediante.

•  A partir do Java 5, o recurso de autoboxing faz esse empacotamento sozinho:

•  No Java 1.4 o código acima é inválido. No Java 5 ele compila perfeitamente.

Autoboxing

Integer inteiro1= new Integer(1); int valInteiro1 = inteiro1.intValue(); 

Integer inteiro2= 1; int valInteiro2 = inteiro1; 

Page 238: Introdução a Linguagem Java

www.labes.ufpa.br

238

•  Este caso se aplica a todos os tipos primitivos e seus correspondentes wrappers (float e Float, double e Double, etc.)

•  Isso não quer dizer que tipos primitivos e referências agora são a mesma coisa, isso é simplesmente um “adocicamento sintático” para facilitar a codificação.

•  Pode-se fazer o autoboxing diretamente para Object também, possibilitando passar um tipo primitivo para um método que recebe Object como argumento:

Autoboxing

Object val1 = 5; Object val2 = 5.0F;

Internamente val1 e val2 são empacotados no mesmo tipo de objeto?

Page 239: Introdução a Linguagem Java

www.labes.ufpa.br

239

Como são utilizadas? •  Annotations, ou simplesmente ”anotações”, são

utilizadas para afetar o modo como os programas são tratados por ferramentas e bibliotecas

•  Annotations são utilizados por ferramentas para produzir arquivos derivados –  Ferramentas: Compilador, IDE – Arquivos derivados: Novo código Java, descritor

de implantação, arquivos .class

Annotations

Page 240: Introdução a Linguagem Java

www.labes.ufpa.br

240

Porquê Annotations? •  Habilitam o estilo de “programação declarativa”

– Menor codificação, já que uma ferramenta pode gerar arquivos derivados automaticamente

–  Fácil modificar configurações •  Elimina a necessidade de manter “arquivos

dependentes” que precisam ser alterados sempre para estar sincronizado com o código fonte –  Informação é mantida no arquivo fonte

Annotations

Page 241: Introdução a Linguagem Java

www.labes.ufpa.br

241

•  A definição do tipo Annotation é similar ao modo de definir Interfaces Java –  Um “arroba” (@) precede a palavra reservada interface –  Cada,método define um elemento da Annotation –  Declaração de métodos não pode ter parâmetros e nem

lançar exceções –  Tipos de retorno são restritos a primitivos, String, Class,

enums, annotations, e arrays dos tipos anteriores –  Métodos podem ter valores default

Annotations

Definindo uma Annotation

Page 242: Introdução a Linguagem Java

www.labes.ufpa.br

242

public @interface RequerMelhoria { int id();

  String resumo();

  String analista() default "[naoDefinido]";

  String data() default "[naoImplementado]";

}

Definindo uma Annotation

Annotations

Item definido como método

Define valor default

Page 243: Introdução a Linguagem Java

www.labes.ufpa.br

243

•  Depois de definida, é possível utilizar uma Annotation na declaração de: –  classes, métodos, atributos

•  Uma é um tipo especial de modificador, e pode ser utilizado em qualquer lugar que outros modificadores (como public, static, ou final) podem ser utilizados –  Por convenção, Annotations precedem outros

modificadores – Annotations consistem em um arroba (@) seguido

de parêntesis com os elementos listados

Annotations

Como utilizar uma Annotation

Page 244: Introdução a Linguagem Java

www.labes.ufpa.br

244

public interface InterfaceTeste {   @RequerMelhoria( id = 123, resumo = "Permitir Jogo Adiado", analista = "Fulano de Tal", data = "4/1/2010" )

public void definirDataJogo(Date data);   }  

Como utilizar uma Annotation

Annotations

Page 245: Introdução a Linguagem Java

www.labes.ufpa.br

245

Restrições de Escopo em Annotations •  De maneira geral as anotações podem ser

restringidas de duas maneiras: – Escopo de uso: restringem a qual contexto a

Annotation estará disponível para ser acessada por ferramentas (código fonte, código .class, JRE, etc.)

–  Escopo de definição: restringem a quais elementos Java a Annotation pode ser aplicada (classe, atributo, método, etc.)

Annotations

Page 246: Introdução a Linguagem Java

www.labes.ufpa.br

246

•  Utiliza-se a meta-annotation @Retention, que possui 3 níveis: –  SOURCE: indica que a informação da Annotation será

colocada apenas no código fonte, mas não estará disponível no arquivo .class

–  CLASS (Default): indica que a informação da Annotation será colocada no arquivo .class, mas não estará disponível em tempo de execução (não será carregado pela JRE)

–  RUNTIME – indica que a informação será armazenada no arquivo .class e carregada pela JRE

Annotations

Escopo de Uso

Page 247: Introdução a Linguagem Java

www.labes.ufpa.br

247

Escopo de Uso

Annotations

@Retention(RetentionPolicy.RUNTIME) public @interface RequerMelhoria {

int id();  

String resumo();  

String analista() default "[naoDefinido]";  

String data() default "[naoImplementado]"; }

Define Escopo de Uso

Page 248: Introdução a Linguagem Java

www.labes.ufpa.br

248

•  Definição similar ao escopo de uso •  Utiliza-se a meta-annotation @Target, que possui vários

níveis, tais como: •  TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR,

LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE

Annotations

Escopo de Definição

@Target(ElementType.FIELD) public @interface RequerMelhoria {

int id();  

String resumo();  

String analista() default "[naoDefinido]";  

String data() default "[naoImplementado]"; }

Page 249: Introdução a Linguagem Java

www.labes.ufpa.br

249

@Target(ElementType.FIELD) public @interface RequerMelhoria {

int id();  

String resumo();  

String analista() default "[naoDefinido]";  

String data() default "[naoImplementado]"; }

public interface InterfaceTeste {   @RequerMelhoria( id = 123, resumo = "Permitir Jogo Adiado", analista = "Fulano de Tal", data = "4/1/2010" )

public void definirDataJogo(Date data);   }  

§ The annotation @RequerMelhoria is disallowed for this location

Annotations

Page 250: Introdução a Linguagem Java

www.labes.ufpa.br

250

•  Provêem abstração aos tipos –  Classes, Interfaces e Métodos podem ser parametrizados por

tipos ( este recurso é conhecido por programadores C++)

•  Generics permite código seguro para uso de tipos –  Se o código compila sem erros ou advertências, não irá

acontecer nenhuma ClassCastException inesperado em tempo de execução

Generics

…Collection<String> nomes = new ArrayList<String>();nomes.add("a");

for (String umNome: nomes) System.out.println(umNome.charAt(0));…

Esta definição já apresentada é permitida pelo uso de Generics

§ Não precisa fazer Casting para String

Page 251: Introdução a Linguagem Java

www.labes.ufpa.br

251

Definição de uma classe genérica: •  Definição: LinkedList<E> tem um parâmetro tipo E que

representa o tipo do elemento armazenado no interior da lista

Generics

public interface LinkedList<E> extends AbstractSequentialList<E> implements List<E>,Queue<E>, Clonable, java.io.Serializable { ……    }

§ O uso de “E” como parâmetro é apenas uma convenção § Este parâmetro segue a mesma r e g r a p a r a d e f i n i ç ã o d e identificadores para a linguagem J a v a ( p . e x : T, T I P O , t i P o , TIPO1,etc...)

Page 252: Introdução a Linguagem Java

www.labes.ufpa.br

252

•  Substituir o parâmetro tipo <E> pelo tipo concreto no argumento, como <Integer> ou <String> ou <MeuTipo>

–  LinkedList<Integer> pode armazenar somente Integer ou sub tipos deste

Generics

Uso de uma classe genérica:

…LinkedList<Integer> valores = new LinkedList<Integer>();valores.add(new Integer(1));valores.add(23);valores.add(“142”);String valor = valores.get(1);…

Não é permitido adicionar um valor String

Permitido pelo Autoboxing

Acesso a valor é verificado

Page 253: Introdução a Linguagem Java

www.labes.ufpa.br

253

•  Problema: Tipos de elementos em Collection –  Compilador não consegue verificar tipos de elementos (pois tudo é

Object)

–  Atribuição com casting de tipos

–  Podem ocorrer ClassCastException em tempo de execução do programa

•  Solução: Generics –  Diz ao compilador o tipo da coleção

–  Deixa o compilador fazer o casting

–  Permite a detecção em tempo de compilação

Generics

Porquê usar Generics?

Page 254: Introdução a Linguagem Java

www.labes.ufpa.br

254

•  Você pode codificar isto: –  Object o = new Integer(5);

•  Você pode codificar também:

–  Object[] or = new Integer[5];

•  Então é esperado que permitido o seguinte código: (Que na verdade NÃO pode!) –  ArrayList<Object> ao = new ArrayList<Integer>();

•  Isto poderia causar ClassCastException em tempo de execução

Generics

Generics e Sub Tipos

Page 255: Introdução a Linguagem Java

www.labes.ufpa.br

255

Generics

Generics e Sub Tipos

ArrayList<Integer> ai = new ArrayList<Integer>(); ArrayList<Object> ao = ai; // permitido em compilação ao.add(new Object()); Integer i = ai.get(0);

ArrayList<Number> an = new ArrayList<Number>(); an.add(new Integer(5)); an.add(new Long(1000L));

No seguinte caso, Long e Integer são subclasses de Number:

Page 256: Introdução a Linguagem Java

www.labes.ufpa.br

256

Generics

Uso de Coringas: Problema … static void printCollection(Collection<Object> c) { for (Object o : c) System.out.println(o); } … public static void main(String[] args) { Collection<String> cs = new Vector<String>(); printCollection(cs); // Erro de Compilacao List<Integer> li = new ArrayList<Integer>(10); printCollection(li); // Erro de Compilacao }

Utilize o argumento coringa <?> Collection<?> significa coleção de um tipo desconhecido

Page 257: Introdução a Linguagem Java

www.labes.ufpa.br

257

Generics

Uso de Coringas: Correto … static void printCollection(Collection<?> c) { for (Object o : c) System.out.println(o); } … public static void main(String[] args) { Collection<String> cs = new Vector<String>(); printCollection(cs); // Sem Erro List<Integer> li = new ArrayList<Integer>(10); printCollection(li); // Sem Erro }

O coringa <?> neste caso permite que o compilador interprete corretamente a entrada

Page 258: Introdução a Linguagem Java

www.labes.ufpa.br

258

Generics

Uso de Coringas: Definição de sub tipo … static void printCollection(Collection<? extends Number> c) { for (Object o : c) System.out.println(o); } … public static void main(String[] args) { Collection<String> cs = new Vector<String>(); printCollection(cs); // Erro de Compilação List<Integer> li = new ArrayList<Integer>(10); printCollection(li); // Sem Erro }

O uso de extends permite definir qual subclasses poderão ser passadas. (Não aceita o uso de implements para especificar o tipo)

Page 259: Introdução a Linguagem Java

www.labes.ufpa.br

259

public class InteroperabilidadeGenerics { public static void main(String[] args) { List<String> lgeneric = new LinkedList<String>(); List lsimples = lgeneric; lsimples.add(new Integer(4)); String s = ls.iterator().next(); } }

O que acontece com o seguinte código?

Generics

Page 260: Introdução a Linguagem Java

www.labes.ufpa.br

260

Definindo Classes Genéricas:

Generics

public class Par<primeiroTipo, segundoTipo> { primeiroTipo primeiro; segundoTipo segundo;   public Par(primeiroTipo f, segundoTipo s) { primeiro = f; segundo = s; }  

public primeiroTipo getPrimeiro() { return primeiro;

}  

public void setPrimeiro(primeiroTipo primeiro) { this.primeiro = primeiro;

}…

... public segundoTipo getSegundo() {

return segundo; }

  public void setSegundo(segundoTipo segundo) {

this.segundo = segundo; }

  }

Page 261: Introdução a Linguagem Java

www.labes.ufpa.br

261

Generics

public class MinhaClasseGenerica {  

public static void main(String[] args) {  

// Cria uma instancia de Par <primeiroTipo, segundoTipo> Number n1 = new Integer(5); String s1 = new String("Sol"); Par<Number, String> p1 = new Par<Number, String>(n1, s1); System.out.println(" Primeiro " + p1.getPrimeiro()); System.out.println(" Segundo " + p1.getSegundo());

  } 

}  

Utilizando Classes Genéricas:

Page 262: Introdução a Linguagem Java

www.labes.ufpa.br

Programação Orientada a Objetos na Linguagem Java

Prof. Adailton Magalhães Lima [email protected]