288
Desenvolvimento Desenvolvimento Orientado a Objetos Orientado a Objetos em Java em Java Prof. Rômulo Silva Prof. Rômulo Silva em Java em Java Fev/2010

Cur So Java

Embed Size (px)

Citation preview

Page 1: Cur So Java

Desenvolvimento Desenvolvimento Orientado a Objetos Orientado a Objetos

em Javaem Java

Prof. Rômulo SilvaProf. Rômulo Silva

em Javaem Java

Fev/2010

Page 2: Cur So Java

Objetivos

� Apresentar as estruturas sintáticas da linguagem Java e respectiva semântica

� Conhecer as principais bibliotecas e APIs que Java oferece

� Entender os conceitos e terminologia de

Prof. Rômulo SilvaProf. Rômulo Silva

� Entender os conceitos e terminologia de orientação a objetos e sua aplicabilidade em Java

� Conhecer uma ferramenta de desenvolvimento (IDE) utilizada no mercado

Page 3: Cur So Java

Ementa do Curso

� Orientação a Objetos:� Classes e Objetos� Herança� Polimorfismo� Interfaces de objetos� Classes Abstratas� Agregação e Composição

Prof. Rômulo SilvaProf. Rômulo Silva

� Agregação e Composição

� Linguagem Java:� Tipos Primitivos� Controle de fluxo em programas� Arrays� Escopo e Modularização� Tratamento de exceções� Coleções� Interface gráfica básica

Page 4: Cur So Java

Capítulo 1 - Introdução

Prof. Rômulo SilvaProf. Rômulo Silva

Page 5: Cur So Java

Linguagem Java

� Criada pela Sun Microsystems em 1995� Independente de sistema operacional e

plataformas� Orientada a objetos� Construções sintáticas semelhantes a C++

Prof. Rômulo SilvaProf. Rômulo Silva

� Construções sintáticas semelhantes a C++� Portabilidade:

� write once, run anywhere

� Utiliza Máquina Virtual

Page 6: Cur So Java

Máquina Virtual

� Especificação de uma máquina abstrata implementada em software

� Traduz o código compilado para a plataforma específica

Prof. Rômulo SilvaProf. Rômulo Silva

plataforma específica

Page 7: Cur So Java

Máquina VirtualThe image cannot be displayed. Your computer may not have enough memory to open the image, or the image may have been corrupted. Restart your computer, and then open the file again. If the red x still appears, you may have to delete the image and then insert it again.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

_ _

p r o g r a m a f o n t e ( . j a v a )

b y te c o d e ( .c l a s s )

com

pila

dor

Prof. Rômulo SilvaProf. Rômulo Silva

1 0 0 1 0 0 0 0 1 1 1 0 0 01 0 1 0 1 0 1 1 1 0 1 0 1 11 0 0 0 0 1 1 1 1 0 0 0 1 01 0 1 0 1 0 1 0 1 0 1 0 1 01 0 1 0 1 0 1 1 1 1 0 1 0 01 1 0 0 0 1 0 1 1 1 0 1 0 10 1 0 1 0 1 0 1 0 1 0 1 0 1

S o la r is W in d o w s X P L in u x

M á q u in a V i r tu a l p /S o l a r is

M á q u i n a V i r tu a l p /W i n d o w s X P

M á q u i n a V i r tu a l p /L i n u x

Page 8: Cur So Java

Linguagem Java

� Versão atual: 6.0 (ano base: 2008)� Não permite aritmética de ponteiros� Possui Garbage Collection (Coleta de lixo)� Suporte nativo para criação de programas

concorrentes/paralelos (threads)

Prof. Rômulo SilvaProf. Rômulo Silva

concorrentes/paralelos (threads)� Programação de sistemas distribuídos é

relativamente simples

Page 9: Cur So Java

Tecnologia Java

� Atualmente (ano base: 2008) existe uma série de produtos/ferramentas para o desenvolvimento de aplicações.

� Exs.:� JSP (Java Server Pages)

Prof. Rômulo SilvaProf. Rômulo Silva

� EJB (Enterprise Java Beans)� JDBC (Java Database Conectivity)� JNDI (Java Naming and Directory Interface)

Page 10: Cur So Java

Plataforma Java

� JSE (Java Standard Edition): ferramentas e APIs essenciais à maioria das aplicações

� JEE (Java Enterprise Editon): ferramentas e APIs para desenvolvimento de aplicações

Prof. Rômulo SilvaProf. Rômulo Silva

e APIs para desenvolvimento de aplicações distribuídas

� JME (Java Micro Edition): ferramentas e APIs para desenvolvimento de aplicações para aparelhos portáteis.

Page 11: Cur So Java

Plataforma Java

Prof. Rômulo SilvaProf. Rômulo Silva

Page 12: Cur So Java

JDK

� Java Development Kit: � Ferramentas de linha de comando para

compilar, depurar e executar programas• compilador (comando javac)

• depurador (comando jdb)

Prof. Rômulo SilvaProf. Rômulo Silva

� JRE (Java Runtime Enviroment):� Ambiente que executa os programas

Page 13: Cur So Java

Pós-instalação

� Para execução das ferramentas via linha de comando, após a instalação:� criar variável de ambiente $JAVA_HOME para

conter o diretório de instalação � Incluir $JAVA_HOME/bin no PATH do sistema

Prof. Rômulo SilvaProf. Rômulo Silva

Page 14: Cur So Java

Compilação e Execução

� via linha de comando:� Localização: $JAVA_HOME/bin/

� Compilação:• Comando javac

� Execução:

Prof. Rômulo SilvaProf. Rômulo Silva

• Comando java

� usando IDE Eclipse:� Opções de compilação são configuradas dentro

da própria IDE

Page 15: Cur So Java

Processo de compilação

� Arquivos fontes:� extensão .java

� Bytecodes: resultado do processo de compilação dos arquivos fontes� Código interpretado pela JVM (Java Virtual

Prof. Rômulo SilvaProf. Rômulo Silva

� Código interpretado pela JVM (Java Virtual Machine)

� Arquivos de bytecodes:� extensão .class

Page 16: Cur So Java

Execução de Aplicações

� Variável de ambiente CLASSPATH:� Armazena caminhos dos arquivos de bytecodes

(.class)� Pode ser sobreposta durante a execução:

• java –cp c:\dir1;c:\dir2 MinhaAplicacao

Prof. Rômulo SilvaProf. Rômulo Silva

Page 17: Cur So Java

Documentação da API

� Distribuída separada do JDK, disponível em formato HTML em http://java.sun.com

� Exibe a especificação de todas as classes das bibliotecas oferecidas pela linguagem.

Prof. Rômulo SilvaProf. Rômulo Silva

das bibliotecas oferecidas pela linguagem.

� Sugestão: baixe a documentação na sua máquina e consulte-a o tempo todo!!

Page 18: Cur So Java

IDEs

� Eclipse:� http://www.eclipse.org

� Netbeans:� http://www.netbeans.org

� JDeveloper

Prof. Rômulo SilvaProf. Rômulo Silva

� JDeveloper� http://www.oracle.com

� JBuilder� http://www.borland.com

Page 19: Cur So Java

Capítulo 3 – Criando a Primeira Aplicação Java

Prof. Rômulo SilvaProf. Rômulo Silva

Page 20: Cur So Java

Primeira Aplicação

� Arquivo fonte: PrimeiraAplicacao.java

public class PrimeiraAplicacao {

// este metodo eh o ponto de entrada do programa

public static void main(String args[]){

Prof. Rômulo SilvaProf. Rômulo Silva

public static void main(String args[]){

System.out.println("Minha primeira aplicação em

Java");

}

}

Page 21: Cur So Java

Elementos do programa

public class PrimeiraAplicacao {

// este metodo eh o ponto de entrada do programa

public static void main(String args[]){

Nome da classeComentário de linha

Prof. Rômulo SilvaProf. Rômulo Silva

System.out.println("Minha primeira aplicação em Java");

}

}

Nome do métodoChamada do método println

do objeto out da classe System

Page 22: Cur So Java

O método main

� Define o ponto de início de execução da aplicação (programa principal)

� Deve ter sempre a assinatura:� public static void main(String args[])

� O parâmetro args serve para passar

Prof. Rômulo SilvaProf. Rômulo Silva

� O parâmetro args serve para passar argumentos via linha comando, capturados como strings.� Ex.:

•java MinhaAplicacao arg1 arg2

� void indica que é um método sem retorno

Page 23: Cur So Java

Padrões de Codificação

� Importante: Java é case sensitive

� Padrões para nomeação de classes, variáveis e métodos� Facilitam a legibilidade do código

Prof. Rômulo SilvaProf. Rômulo Silva

� Facilitam a legibilidade do código� Melhoram a manutenibilidade

� Idéia básica: a forma de escrever o nome identifica a sua categoria (classe, método, variável, constante, ...)

Page 24: Cur So Java

Padrões de Codificação

� Nome de classe: apenas a letra inicial maiúscula de cada palavra � Ex:.

•PrimeiraAplicacao

•System

Prof. Rômulo SilvaProf. Rômulo Silva

� Nome de método: letras minúsculas e inicial maiúscula a partir da segunda palavra:� println

� main

� getValor

Page 25: Cur So Java

Padrões de codificação

� Arquivos fontes: � Um arquivo fonte contém a definição de uma

única classe� Nome do arquivo é igual o nome da classe� Extensão .java

Prof. Rômulo SilvaProf. Rômulo Silva

� Após a compilação:� É gerado um arquivo .class para cada .java

correspondente.

Page 26: Cur So Java

Exercício

� 1- Faça um outro programa, criando uma classechamada SegundaAplicacao, que imprima asseguintes mensagens na tela: “Segunda

Prof. Rômulo SilvaProf. Rômulo Silva

seguintes mensagens na tela: “SegundaAplicação em Java”, “Imprimindo 3

mensagens” e “Fim do Programa”.

Page 27: Cur So Java

Capítulo 4 – Tipos Primitivos

Prof. Rômulo SilvaProf. Rômulo Silva

Page 28: Cur So Java

Declaração de variáveis

� Sintaxe: tipo da variável seguido pelo nome da variável.� int quantidade;

Tipo da variável Nome da variável

Prof. Rômulo SilvaProf. Rômulo Silva

� String nome;

Tipo da variável Nome da variável

Page 29: Cur So Java

Hibridismo

� Java é uma linguagem híbrida:� Nem tudo é objeto

� Classificações dos tipos:� Primitivos ou básicos: têm tamanho fixo e NÃO

Prof. Rômulo SilvaProf. Rômulo Silva

� Primitivos ou básicos: têm tamanho fixo e NÃOsão objetos

• Ex.: valores numéricos, caracteres, booleanos

� Complexos (ou objetos): criados a partir da definição de uma classe

Page 30: Cur So Java

Tipos Primitivos

Tipo Tamanho Valor Mínimo Valor Máximo

boolean ------- ------- ------

char 16 bits Unicode 0 Unicode 216 - 1

byte 8 bits -128 +127

Prof. Rômulo SilvaProf. Rômulo Silva

short 16 bits -215 +215 –1

int 32 bits -231 +231 –1

long 64 bits -263 +263 -1

float 32 bits IEEE 754 IEEE 754

double 64 bits IEEE 754 IEEE 754

Page 31: Cur So Java

Tipos Primitivos

� Exemplos:� int i = 10;

� boolean cancelado = false;

� char ch1 = 'a';

� char ch2 = '\u0041'; // caracter a em

Unicode

Prof. Rômulo SilvaProf. Rômulo Silva

Unicode

� float f = 5.7F;

Page 32: Cur So Java

Variáveis Numéricas

� Operadores de � Incremento: ++ e +=� Decremento: -- e -=

� Exs.:int i = 5;

Prof. Rômulo SilvaProf. Rômulo Silva

i++; // incrementa i de 1, equivale a i = i + 1

System.out.println(i); // ira imprimir o valor 6

int j = 5;

j--; // decrementa i de 1, equivale a j = j - 1

System.out.println(j); // ira imprimir o valor 4

int k = 5;

k+=3; // incrementa i de 3, equivale a k = k + 3

System.out.println(k); // ira imprimir o valor 8

Page 33: Cur So Java

Pré-incremento e Pós-Decremento

int i = 5;

int j = i++;

System.out.println(i); // ira imprimir o valor 6

System.out.println(j); // ira imprimir o valor 5

Prof. Rômulo SilvaProf. Rômulo Silva

System.out.println(j); // ira imprimir o valor 5

int k = ++i;

System.out.println(i); // ira imprimir o valor 7

System.out.println(k); // ira imprimir o valor 7

Page 34: Cur So Java

Expressões Numéricas

� O resultado de expressões numéricas é automaticamente convertido para o tipo com a maior quantidade de bits.

� Ex.:� A soma de um inteiro e um ponto flutuante é

convertida para ponto flutuante

Prof. Rômulo SilvaProf. Rômulo Silva

convertida para ponto flutuanteint i = 5;

float x = 3;

float y;

y = x + i;

x + i é convertido

para float antes da

atribuição a y

Page 35: Cur So Java

Casting

� Conversão explícita de um tipo para outro� Tipos primitivos

� Utilizado quando se quer converter para um tipo que usa um número menor de bits para representar o número

� Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

� Ex.:double e = 2.718;

int y = (int) e; // irá truncar (y = 2)

Page 36: Cur So Java

Ponto Flutuante

� Literais de ponto flutuante são default considerados do tipo double.� Colocar F no fim do número quando desejar que

sejam considerados do tipo float

� Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

float numeroPI = 3.14F;

Literal interpretado

como do tipo float

Page 37: Cur So Java

Importante

� Strings em Java são objetos e não tipos primitivos !!!

Prof. Rômulo SilvaProf. Rômulo Silva

Page 38: Cur So Java

Exercícios

� 1- Faça um programa para calcular a o perímetroe a área de círculo de raio de 3 cm. (dados :Perímetro = 2πR e Área = πR2).

Prof. Rômulo SilvaProf. Rômulo Silva

Page 39: Cur So Java

Exercícios

� 2- Quais os valores de i, k e z em cada uma das

mensagens de impressão e porque?

Prof. Rômulo SilvaProf. Rômulo Silva

Page 40: Cur So Java

Exercícios

� 3- Altere o programa do exercício 1 para imprimir o valor inteiro do perímetro e da área do círculo, além do resultado em ponto flutuante

Prof. Rômulo SilvaProf. Rômulo Silva

Page 41: Cur So Java

Capítulo 5 –Controle de Fluxo

Prof. Rômulo SilvaProf. Rômulo Silva

Page 42: Cur So Java

Comando if

� Sintaxe: � if(expressão-booleana)

bloco1else

bloco2

Prof. Rômulo SilvaProf. Rômulo Silva

� O bloco else é opcional

Page 43: Cur So Java

Comando if

int x = 2;

int y = 5;

int z;

if(x < y)

expressão booleana

{

System.out.println("x é menor que y");

bloco de comandos

Prof. Rômulo SilvaProf. Rômulo Silva

else {

System.out.println("x é maior que y ");

z = y;

}

System.out.println("x é menor que y");

z = x;

}

Page 44: Cur So Java

Expressão booleana

� Operadores de comparação:� ==, !=, >, >=, <, <=

� Conectores lógicos:� && (AND)

Prof. Rômulo SilvaProf. Rômulo Silva

� && (AND)� || (OR)� ! (NOT)

Page 45: Cur So Java

Expressão booleana

� Observação:� Não confundir o operador de atribuição (=) com

o operador de comparação de igualdade (==)

Prof. Rômulo SilvaProf. Rômulo Silva

Page 46: Cur So Java

Comando for

� Sintaxe:� for(inicialização;expressão-

booleana;incremento)

bloco-de-comandosinicialização incremento

Prof. Rômulo SilvaProf. Rômulo Silva

� Ex.:

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

System.out.println("O valor de i:

" + i);

}

Page 47: Cur So Java

Comando while

� Sintaxe:� while(expressão-booleana)

Bloco-de-comandos

� Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

� Ex.:

int i = 0;

while(i < 10) {

System.out.println("O valor de i: " + i);

}

Page 48: Cur So Java

Comando do-while

� Sintaxe:� do

bloco-de-comandoswhile(expressão booleana)

Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

Ex.:

int i = 0;

do {

System.out.println("O valor de i: " + i);

}

while(i < 10)

Page 49: Cur So Java

Comando switch

� Sintaxe:switch(expressão-inteira) {

case VALOR1:bloco-de-comandos1break;

case VALOR2:bloco-de-comandos2

Prof. Rômulo SilvaProf. Rômulo Silva

bloco-de-comandos2break;

...case VALOR-N:

bloco-de-comandosNbreak;

default:bloco-de-comandos-default

}

Page 50: Cur So Java

Comando switch

� Ex.:int opcaoMenu;

...

switch(opcaoMenu) {

case 1: System.out.println("escolheu a opcao

1");

Prof. Rômulo SilvaProf. Rômulo Silva

1");

break;

case 2: System.out.println("escolheu a opcao

2");

break;

case 3: System.out.println("escolheu a opcao

3");

break;

default: System.out.println("escolheu outra

opcao ");

}

Page 51: Cur So Java

Comando switch

� É possível ter um único bloco de comandos para vários cases.

� Ex.:int opcaoMenu;

...

switch(opcaoMenu) {

case 1: System.out.println("escolheu a opcao 1");

Prof. Rômulo SilvaProf. Rômulo Silva

case 1: System.out.println("escolheu a opcao 1");

break;

case 2:

case 3:

System.out.println("opcões 2 e 3 retiradas");

break;

default: System.out.println("escolheu outra opcao");

}

Page 52: Cur So Java

Comando break

� Também pode ser usado para forçar a saída de loops

� Ex.:

int x = 0;

Prof. Rômulo SilvaProf. Rômulo Silva

int x = 0;

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

x = x + i;

if(x > 15)

break;

}

Page 53: Cur So Java

Comando continue

� Salta para o fim do bloco do loop e força o teste novamente.

� Ex.:int i = 0;

while(i < 10) {

if(i == 5) {

Prof. Rômulo SilvaProf. Rômulo Silva

if(i == 5) {

i++;

continue;

}

System.out.println(i);

i++;

}

Salta os comandos abaixo

Page 54: Cur So Java

Observações

� Evite usar break e continue dentro de loops� Comprometem a legibilidade do código

� Para criar um loop for infinito é

Prof. Rômulo SilvaProf. Rômulo Silva

� Para criar um loop for infinito é semelhante a C:

for(;;){

System.out.println("Está em loop infinito");

}

Page 55: Cur So Java

Exercícios

� 1 - Faça um programa que imprima os números de 1 a100 inclusive.

� 2 - Faça um programa que imprima o fatorial de 1 a 10inclusive.

Prof. Rômulo SilvaProf. Rômulo Silva

� 3 - Altere o programa do exercício 1 para imprimir umamensagem na tela quando o número for múltiplo de 3 oumúltiplo de 5.

� 4 - Faça um programa que calcule o resto da divisão por 9dos números de 1 a 100, e imprima o próprio resto dadivisão quando ele for igual a 2, 3, 5 ou 7. Para os outrosvalores imprima o dobro do resto

Page 56: Cur So Java

Capítulo 6 Capítulo 6 ––Classes e Classes e ObjetosObjetos

Prof. Rômulo SilvaProf. Rômulo Silva

Page 57: Cur So Java

Paradigma

� Um paradigma de programação é um modelo de construção de programas� Forma de abstração

� Orientação a objetos:

Prof. Rômulo SilvaProf. Rômulo Silva

� Orientação a objetos:� É um paradigma de programação� A solução do problema corresponde a interações

de objetos criados em tempo de execução

Page 58: Cur So Java

OO e Java

� Compreender as estruturas sintáticas é parte fundamental para construção de sistemas OO, porém não suficiente

� O entendimento dos conceitos de OO é que

Prof. Rômulo SilvaProf. Rômulo Silva

� O entendimento dos conceitos de OO é que permitem construir bons sistemas:� Manutenibilidade� Reusabilidade� Flexibilidade

Page 59: Cur So Java

Objetos

� Conceitos que possuem:� Identidade� Estado� Comportamento

Prof. Rômulo SilvaProf. Rômulo Silva

� Em Java:� Identidade: endereço do objeto na memória� Estado: valores armazenados no objeto� Comportamento: operações aplicáveis sobre o

objeto

Page 60: Cur So Java

Classes

� A classe é uma especificação das características de objetos:� Definição das variáveis dos objetos e das

operações que as manipulam

� Classes não existem em tempo de execução

Prof. Rômulo SilvaProf. Rômulo Silva

� Classes não existem em tempo de execução no contexto do programa, apenas seus objetos.

� Analogia:� Planta de um edifício (especificação da classe)� O edifício construído (objeto)

Page 61: Cur So Java

Terminologia OO

� Dados dos objetos:� Variáveis de instância ou atributos

� Operações:� Métodos ou mensagens

Prof. Rômulo SilvaProf. Rômulo Silva

� Métodos ou mensagens

� Membros: � Usado indistintamente para atributos e métodos

Page 62: Cur So Java

Estrutura de uma classe

class NomeClasse {

atributos

construtores

metodos

Prof. Rômulo SilvaProf. Rômulo Silva

metodos

}

� Os membros de uma classe podem vir em qualquer ordem� Seguir uma ordem facilita a legibilidade do

código

Page 63: Cur So Java

Ex. de classe

class MensagemTela {

String mensagem;

public MensagemTela(String msg) {

mensagem = msg;

}

variável de instância (atributo)

construtor

Prof. Rômulo SilvaProf. Rômulo Silva

public void imprime() {

System.out.println(mensagem);

}

public static void main(String args[]) {

MensagemTela msg = new MensagemTela(“Hello

World");

msg.imprime();

}

}

método

criação de objetochamada de método

Page 64: Cur So Java

Construtores

� Definem como construir um objeto da classe

� Devem ter o mesmo nome da classe

Prof. Rômulo SilvaProf. Rômulo Silva

� Não devem indicar retorno, pois retornam implicitamente um objeto da própria classe

� Criação de objeto (instanciação)� Invocação do construtor usando o operador new

Page 65: Cur So Java

Métodos

� Definem as operações válidas para o objeto (comportamento)

� Sintaxe:visibilidade tipo-retorno nome-método(lista-parâmetros) {

corpo-do-método}

Prof. Rômulo SilvaProf. Rômulo Silva

}

� Sintaxe da chamada (invocação):� objeto.nome-método(lista-parâmetros); p/ métodos void� XXX x = objeto.nome-método(lista-parâmetros); p/

métodos com retorno

Page 66: Cur So Java

Classes Pré-definidas

� Em Java existem várias classes pré-definidas que compõem a API da linguagem.

� Exs.:

Prof. Rômulo SilvaProf. Rômulo Silva

� Exs.:� System � Object� String

Page 67: Cur So Java

Classes x Tipo Primitivo

� Em uma linguagem OO pura (ex.: Smalltalk), tudo é objeto.

� Java é linguagem híbrida:� Valores de tipos primitivos (valores numéricos,

booleanos, bytes) não são objetos

Prof. Rômulo SilvaProf. Rômulo Silva

� Na prática:� A alocação de memória para objetos/tipos

privimitos é diferente� Tipo primitivo: variáveis armazenam o próprio

valor� Tipo objeto: variáveis armazenam o endereço

do objeto na memória (referência)

Page 68: Cur So Java

Memória – Tipo Primitivo

int x = 2;

int y = x;

M e m ó r ia

22

x y

Prof. Rômulo SilvaProf. Rômulo Silva

int y = x; 22

Page 69: Cur So Java

Memória – Tipo Objeto

MensagemTela msg1 = new MensagemTela("AAA");

MensagemTela msg2 = new MensagemTela("BBB");

The image cannot be displayed. Your computer may not have enough memory to open the image, or the image may have been corrupted. Restart your computer, and then open the file again. If the red x still appears, you may have to delete the image and then insert it again.

Memória

Prof. Rômulo SilvaProf. Rômulo Silva

“AAA”

“BBB”

msg1

msg2

Page 70: Cur So Java

Memória – Tipo Objeto

The image cannot be displayed. Your computer may not have enough memory to open the image, or the image may have been corrupted. Restart your computer, and then open the file again. If the red x still appears, you may have to delete the image and then insert it again.

M em óriamsg1 = msg2;

MensagemTela msg1 = new MensagemTela("AAA");

MensagemTela msg2 = new MensagemTela("BBB");

Prof. Rômulo SilvaProf. Rômulo Silva

“A A A ”

“B B B ”

m sg1

m sg2

Page 71: Cur So Java

Comparação de objetos

� O operador == compara valores de referências e não valores armazenados nos objetos

MensagemTela msg1 = new MensagemTela("AAA");

MensagemTela msg2 = new MensagemTela("AAA");

Prof. Rômulo SilvaProf. Rômulo Silva

“A A A ”

“A A A "

m s g 1

m s g 2

M e m ó ria

MensagemTela msg2 = new MensagemTela("AAA");

objetos diferentes

Page 72: Cur So Java

null

� Variáveis de tipo objeto não inicializadas tem valor null

� A chamada de um método sobre uma variável que tem valor null ocasiona o lançamento da exceção

Prof. Rômulo SilvaProf. Rômulo Silva

NullPointerException

� Ex.:

MensagemTela msg1;

msg1.imprime();

variável com valor null

Page 73: Cur So Java

Exercícios

� 1 - Implementar a classe Pessoa com os seguintesatributos: nome, idade e endereço. Crie um métodochamado imprime que imprima os dados da pessoa.

� 2 - Implemente uma classe Livro com os seguintesatributos: titulo e autor. Crie um método que imprima os

Prof. Rômulo SilvaProf. Rômulo Silva

atributos: titulo e autor. Crie um método que imprima osdados do livro.

� 3 - Altere a classe definida no exercício para incluir oatributo editora e um método que permita alterar a editorade um livro

Page 74: Cur So Java

Capítulo 7 Capítulo 7 –– ArraysArrays

Prof. Rômulo SilvaProf. Rômulo Silva

Page 75: Cur So Java

Arrays

� Estrutura semelhante a vetores e matrizes em Matemática

� Ex.:

int[] x = new int[5];

tipo dos elementos

Prof. Rômulo SilvaProf. Rômulo Silva

int[] x = new int[5];

x[0] = 20;

x[1] = 30;

x[2] = 40;

x[3] = 50;

x[4] = 60;

número de elementos

Page 76: Cur So Java

Arrays

� Sempre começam do índice 0

� É uma referência para elementos (tipos primitivos ou objetos)� Alocação da quantidade de elementos: operador

Prof. Rômulo SilvaProf. Rômulo Silva

� Alocação da quantidade de elementos: operador new

� A tentativa de acessar um índice inválido ocasiona o lançamento da exceção ArrayIndexOutOfBoundsException

Page 77: Cur So Java

Arrays

� Podem ser inicializados com literais diretamente:

int[] meuArray = { 10, 20, 30 };

� Não é possível alterar a quantidade de

Prof. Rômulo SilvaProf. Rômulo Silva

� Não é possível alterar a quantidade de elementos após a inicialização

Page 78: Cur So Java

Arrays

� Arrays sem inicialização dos elementos:� Tipos numéricos: elementos têm valor 0 (zero)

� Tipo booleano: elementos têm valor false

Tipos objetos: elementos têm valor

Prof. Rômulo SilvaProf. Rômulo Silva

� Tipos objetos: elementos têm valor null

Page 79: Cur So Java

Arrays de objetos

MensagemTela[] meuArray = new MensagemTela[3];

meuArray[0] = new MensagemTela("AAA");

meuArray[1] = new MensagemTela("BBB");

tipo dos elementos alocação do número de elementos

Prof. Rômulo SilvaProf. Rômulo Silva

meuArray[1] = new MensagemTela("BBB");

meuArray[2] = new MensagemTela("CCC");

inicialização do elemento da posição 2

Page 80: Cur So Java

Número de elementos

� O número de elementos pode ser obtido acessando-se a propriedade length

int[] meuArrayInt = new int[7];

...

for(int i = 0; i < meuArrayInt.length; i++){

número de elementos

Prof. Rômulo SilvaProf. Rômulo Silva

for(int i = 0; i < meuArrayInt.length; i++){

System.out.println(meuArrayInt[i]);

}

Page 81: Cur So Java

Arrays Multidimensionais

int[][] mat = new int[2][2];

mat[0][0] = 50;

mat[0][1] = 60; colunas

linhas

Prof. Rômulo SilvaProf. Rômulo Silva

mat[0][1] = 60;

mat[1][0] = 70;

mat[1][1] = 80;

colunas

Page 82: Cur So Java

Arrays Multidimensionais

� Em Java, matrizes são na verdade arrays de arrays.

dimensão não inicializada

Prof. Rômulo SilvaProf. Rômulo Silva

int[][] mat = new int[2][];

mat[0] = new int[3];

mat[1] = new int[4];

System.out.println(mat[1].length);

3 elementos na linha 0

4 elementos na linha 1

Page 83: Cur So Java

Arrays Multimensionais

� Inicialização usando literais:

� A classe System possui o método arrayCopy para copiar elementos de um

int[][] mat = { {10,20}, {30,40,50}, {60,70} };

Prof. Rômulo SilvaProf. Rômulo Silva

arrayCopy para copiar elementos de um array para outro.

int[] origem = {20,30,40};

int[] destino = new int[10];

System.arraycopy(origem,0,destino,3,2);

quantidade de elementos a serem copiados

posição de início da cópia

Page 84: Cur So Java

Arrays - varredura

� Utilizando a propriedade length:

int[] meuArray = {10,20,30};

for(int i = 0; i < meuArray.length; i++){

System.out.println(meuArray[i]);

Prof. Rômulo SilvaProf. Rômulo Silva

}

Page 85: Cur So Java

Arrays - varredura

� Utilizando enhanced-for (válido a partir da versão 5.0):� Não precisa testar a propriedade length

int[] meuArray = {10,20,30};

Prof. Rômulo SilvaProf. Rômulo Silva

for(int x: meuArray) {

System.out.println(x);

}

Page 86: Cur So Java

Exercícios

� 1- Crie uma classe Matriz de inteiros, cujo construtorrecebe como parâmetro o número de linhas e colunas, einicializa um array bidimensional com as dimensõescorrespondentes aos parâmetros passados. Crie métodospara atribuir e retornar valor de um elemento e outro paraimprimir todos os elementos da matriz. Defina o métodomain para testar a classe construída.

Prof. Rômulo SilvaProf. Rômulo Silva

main para testar a classe construída.

� 2 - Crie um array de 5 elementos da classe Pessoa,incialize-os e use um enhanced-for para varrer e imprimiros elementos.

Page 87: Cur So Java

Exercícios

� 3 - Crie um classe chamada TrianguloPascal cujoconstrutor receba como parâmetro o número linhas e crieum array bidimensional que os números do Triângulo dePascal até atingir o número de linhas informado. Abaixo émostrado o Triângulo de Pascal para 5 linhas.

1

Prof. Rômulo SilvaProf. Rômulo Silva

1 11 2 11 3 3 11 4 6 4 1

Page 88: Cur So Java

Capítulo 8 Capítulo 8 –– Orientação a Orientação a ObjetosObjetos

Prof. Rômulo SilvaProf. Rômulo Silva

Page 89: Cur So Java

Orientação a Objetos

� É possível escrever programas em Java sem utilizar os recursos OO, porém são:� difíceis de dar manutenção� difíceis de reutilizar

• Perdem os benefícios de OO

Prof. Rômulo SilvaProf. Rômulo Silva

Page 90: Cur So Java

Tipo Abstrato de Dados

� Um tipo é caracterizado pelas operações que você pode aplicar sobre ele:� Ex.:

• Operações aritméticas (+,-,*,/) sobre tipos numéricos

• Operação de concatenação (+) sobre strings

Prof. Rômulo SilvaProf. Rômulo Silva

� As linguagens de programação fornecem ao programador meios de definir novos tipos a partir dos existentes

Page 91: Cur So Java

Linguagens OO

� Os principais mecanismos (técnicas) para definição de novos tipos das linguagens OO, incluindo Java, são:� Herança� Sobreposição (overrinding)

Sobrecarga (overloading)

Prof. Rômulo SilvaProf. Rômulo Silva

� Sobrecarga (overloading)� Polimorfismo

Page 92: Cur So Java

Herança

� Chamada de generalização/especialização

� Define uma classe como uma extensão (especialização) de outra definida previamente

Prof. Rômulo SilvaProf. Rômulo Silva

previamente

� Efeito:� A classe derivada (especializada) herda todos os

atributos e métodos definidos na classe genérica

Page 93: Cur So Java

Herança - exemplo

class Pessoa {

String nome;

int idade;

public Pessoa(String nome, int idade) {

this.nome = nome;

this.idade = idade;

parâmetros

atributos

construtor

Prof. Rômulo SilvaProf. Rômulo Silva

}

public void incrementaIdade() {

idade++;

}

}

métodoreferência para o objeto sendo criado

Page 94: Cur So Java

Herança - exemplo

class Aluno extends Pessoa {

String matricula;

construtor

classe derivada (subclasse) classe base (superclasse)

Prof. Rômulo SilvaProf. Rômulo Silva

public Aluno(String nome, int idade, String matricula){

super(nome,idade);

this.matricula = matricula;

}

public String getMatricula() {

return matricula;

}

}

chamada para o construtor da superclasse

Page 95: Cur So Java

Herança – notação UML

� Aluno é uma especialização de Pessoa� Pessoa é uma generalização para Aluno� Todo Aluno é uma Pessoa

superclassePessoa

nomeidade

Prof. Rômulo SilvaProf. Rômulo Silva

subclasse

Aluno

matricula

getMatricula(): int

incrementaIdade(): void

Page 96: Cur So Java

Pessoa

nomeidade

incrementaIdade(): void

Herança – notação UML

atributos e método herdados pela classe Aluno

Prof. Rômulo SilvaProf. Rômulo Silva

Aluno

matricula

getMatricula(): int

atributo exclusivo da classe Aluno

método válido somente para Aluno

Page 97: Cur So Java

Herança - exemplo

� O método incrementaIdade() é válido para objetos do tipo Aluno:

Aluno meuAluno = new Aluno("Joao", 20, "12345-X");

meuAluno.incrementaIdade();

Prof. Rômulo SilvaProf. Rômulo Silva

� Variáveis do tipo Pessoa podem armazenar referências para objetos do tipo Aluno

método herdado da classe Pessoa

Pessoa p = new Aluno("Joao", 20, "12345-X");

p.incrementaIdade();

Page 98: Cur So Java

Herança – outro exemplo

� Veiculo é superclasse de Automovel e Motocicleta

� Todo Automovel é umVeiculo

� Toda Motocicleta é

Veiculo

Automovel Motocicleta

Prof. Rômulo SilvaProf. Rômulo Silva

� Toda Motocicleta é um Veiculo

� Todo Palio é umAutomovel

� Todo Corsa é umAutomovel

Palio Corsa

Page 99: Cur So Java

Herança

� As classes derivadas são um subtipo da classe base:� Relação ”é um”

� Aplicação da herança:

Prof. Rômulo SilvaProf. Rômulo Silva

� Aplicação da herança:� Reuso de código (implementação)

� Deve ser empregada com critério, pois é um relacionamento estático entre classes� Todos os objetos são afetados

Page 100: Cur So Java

Herança - Object

� Todas as classes que não especificam uma superclasse são derivadas da classe pré-definida Object

� Object é a raiz da hierarquia de herança

Prof. Rômulo SilvaProf. Rômulo Silva

� Object é a raiz da hierarquia de herança� superclasse de todas as classes no sistema

Page 101: Cur So Java

Herança Múltipla

� Herança múltipla:� Capacidade de uma classe ter mais de uma

classe base

A B

Prof. Rômulo SilvaProf. Rômulo Silva

C

C é derivada das classes A e B

Page 102: Cur So Java

Herança - observações

� Java NÃO permite herança múltipla de classes, como ocorrem em outras linguagens, como em C++.� Evitar ambigüidade

C objC = new C();

Prof. Rômulo SilvaProf. Rômulo Silva

C

m (): v o id

A

m (): v o id

B C objC = new C();

objC.m();

chamada ambígua

Page 103: Cur So Java

Referências

� Chamada de métodos da subclasse usando variáveis do tipo da superclasse são inválidos, mesmo que armazenam referência para objeto da subclasse.

� Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

Pessoa p = new Aluno("Joao", 20, "12345-X");

String matricula = p.getMatricula();

chamada inválida (erro de compilação)

Page 104: Cur So Java

Casting

� A chamada de um método da subclasse usando uma referência de objeto da superclasse é possível usando casting

� Ex.:

Prof. Rômulo SilvaProf. Rômulo Silva

� Ex.:

Pessoa p = new Aluno("Joao", 20, "12345-X");

String matricula = ((Aluno)p).getMatricula();

casting

Page 105: Cur So Java

ClassCastException

� Um casting inválido ocasiona o lançamento da exceção ClassCastException

� Ex.:

Pessoa p = new Pessoa("Maria", 30);

Prof. Rômulo SilvaProf. Rômulo Silva

String matricula = ((Aluno)p).getMatricula();

erro em tempo de execução

Page 106: Cur So Java

instanceof

� O operador instanceof permite testar se uma variável é uma referência para um tipo específico� Usado para evitar castings inválidos

Pessoa p;

Prof. Rômulo SilvaProf. Rômulo Silva

Pessoa p;

...

if(p instanceof Aluno) {

String matricula = ((Aluno)p).getMatricula();

}

Page 107: Cur So Java

Assinatura de um método

� É o que diferencia um método de outro do ponto de vista da chamada (invocação):� Nome do método� Quantidade, tipo e ordem dos parâmetrosclass Veiculo {String placa;

Prof. Rômulo SilvaProf. Rômulo Silva

String placa;int velocidade;

public Veiculo(String placa){this.placa = placa;

}

public void setVelocidade(int veloc){velocidade = veloc;

}}

assinatura

Page 108: Cur So Java

Sobreposição (overinding)

� É a sobrescrita de um método herdado

� Útil quando a classe derivada precisa especializar ou alterar algum comportamento definido na superclasse.

Prof. Rômulo SilvaProf. Rômulo Silva

comportamento definido na superclasse.

� A assinatura do método sobrescrito deve ser idêntica a do método definido na classe base

Page 109: Cur So Java

Sobreposição

Pessoa

Aluno Funcionario

getSalario(): float

Prof. Rômulo SilvaProf. Rômulo Silva

Diretor

getSalario(): float

Professor

getSalario(): float

métodos sobrepõem o métododefinido na classe Funcionario

Page 110: Cur So Java

Sobreposição - exemplo

class Funcionario extends Pessoa {

float salarioBase;

public Funcionario(String nome,

int idade,

float salarioBase) {

super(nome,idade);

this.salarioBase = salarioBase;

Prof. Rômulo SilvaProf. Rômulo Silva

this.salarioBase = salarioBase;

}

public float getSalario() {

return salarioBase;

}

}

salário do funcionário = salário base

Page 111: Cur So Java

Sobreposição - exemploclass Professor extends Funcionario {

boolean temAbono;public Professor(String nome,

int idade,float salarioBase,boolean temAbono) {

super(nome,idade,salarioBase);this.temAbono = temAbono;

método sobrescrito

Prof. Rômulo SilvaProf. Rômulo Silva

this.temAbono = temAbono;}public float getSalario() {

if(temAbono)return super.getSalario() + 200;//abono fixo.

else

return super.getSalario();// sem abono}

}chama o método definido

na superclasse

Page 112: Cur So Java

Sobreposição - exemplo

Funcionario f1 = new Funcionario("Joao",20,300);

float salarioF1 = f1.getSalario(); // R$ 300,00

Professor f2 = new Professor("Joao",20,300, true);

executa método definido na classe Funcionario

Prof. Rômulo SilvaProf. Rômulo Silva

Professor f2 = new Professor("Joao",20,300, true);

float salarioF2 = f2.getSalario(); //R$ 500,00

executa método definido na classe Professor

Page 113: Cur So Java

Sobreposição

� O método invocado de acordo com o tiporeal do objeto, e não de acordo com o tipo da variável declarada.

Funcionario f = new Professor("Joao",20,300, true);

float salario = f.getSalario(); //R$ 500,00

Prof. Rômulo SilvaProf. Rômulo Silva

float salario = f.getSalario(); //R$ 500,00

executa método definido na classe Professor

Page 114: Cur So Java

Sobrecarga (overloading)

� É a definição de métodos que possuem o mesmo nome, porém com assinaturas diferentes� Quantidade de parâmetros diferentes� Ordem dos parâmetros

Tipo dos parâmetros

Prof. Rômulo SilvaProf. Rômulo Silva

� Tipo dos parâmetros

� Tipo de retorno de todos os métodos devem ser iguais.� Tipo de retorno não faz parte da assinatura

Page 115: Cur So Java

Sobrecarga (overloading)

� Útil quando:� Se quer definir valores defaults para um ou mais

parâmetros� Se deseja disponibilizar um método que faça a

mesma tarefa, porém de forma diferente

Prof. Rômulo SilvaProf. Rômulo Silva

� Também pode ser aplicada aos construtores

Page 116: Cur So Java

Sobrecarga – exemploclass Professor extends Funcionario {...

public float getSalario() {if(temAbono) return super.getSalario() + 200;//abono fixo.

elsereturn super.getSalario();//sem abono

}

assinatura

Prof. Rômulo SilvaProf. Rômulo Silva

return super.getSalario();//sem abono}

public float getSalario(float horas) {return 20*horas;

}

...} assinatura

Page 117: Cur So Java

Sobrecarga - exemplo

Professor prof = new Professor("Jose", 20,300,true );

...

float sal1 = prof1.getSalario(); //irá retornar R$500

... executa a definição de

Prof. Rômulo SilvaProf. Rômulo Silva

...

float sal2 = prof1.getSalario(30);//irá retornar R$600

executa a definição de getSalario() sem parâmetro

executa a definição de getSalario() com

parâmetro do tipo float

Page 118: Cur So Java

Sobrecarga de construtores

class Professor extends Funcionario {

boolean temAbono;

public Professor(String nome,int idade,float salarioBase,boolean temAbono) {

super(nome,idade,salarioBase);

Construtor com 4 parâmetros

Prof. Rômulo SilvaProf. Rômulo Silva

super(nome,idade,salarioBase);this.temAbono = temAbono;

}

public Professor(String nome,int idade,float salarioBase) {

super(nome,idade,salarioBase);this.temAbono = false;

}...}

Construtor com 3 parâmetros

Page 119: Cur So Java

Polimorfimos

� Poli = muitos, morfismo = forma

� Capacidade de um objeto de um tipo

Prof. Rômulo SilvaProf. Rômulo Silva

� Capacidade de um objeto de um tipo substituir um objeto de outro tipo

Page 120: Cur So Java

Polimorfismo

� Capacidade de cada subclasse ter implementações diferentes para o mesmo método� Utilização de sobreposição

Prof. Rômulo SilvaProf. Rômulo Silva

� A versão (implementação) do método a ser chamada será determinada apenas em tempo de execução� late binding

� run-time binding

� dynamic binding

Page 121: Cur So Java

Polimorfismo - exemplo

Pessoa

Aluno Funcionario

getSalario(): float

Versões do métodogetSalario()

Prof. Rômulo SilvaProf. Rômulo Silva

Diretor

getSalario(): float

Professor

getSalario(): float

Page 122: Cur So Java

Polimorfismo - exemplo

class ImpostoRenda {

...

public void calculaImpostoRenda(Funcionario f){

...

float sal = f.getSalario();

...

Prof. Rômulo SilvaProf. Rômulo Silva

...

}

...

}

pode armazernar referência de Funcionario,

Professor ou Diretor

versão a ser chamada será determinada em tempo de execução

Page 123: Cur So Java

Exercícios

� 1 - Crie uma classe Veiculo que tenha os atributos ano,modelo, cor, placa e valor de mercado; e métodos queretornam os valores dos atributos e um que imprime asinformações do veiculo na tela. Crie as subclasses Automovele Motocicleta de Veiculo. Para automóveis há um atributoque armazena a quantidade de portas.

Prof. Rômulo SilvaProf. Rômulo Silva

� 2 - Altere as classes anteriores acrescentando um métodocalcularIPVA que retorna o valor do IPVA de acordo com asseguintes regras:� IPVA = 2% do valor de mercado do veículo� Se o automóvel tem mais de 10 anos, ele é isento do IPVA� Se a motocicleta tem mais de 7 anos, ela é isenta do IPVA

Page 124: Cur So Java

Exercícios

� 3 - Escreva uma classe que represente um ponto decoordenadas x e y.

� 4 - Escreva uma classe que represente um pixel: umponto que possui uma cor.

Prof. Rômulo SilvaProf. Rômulo Silva

� 5 - Escreva uma classe que represente um círculo usandoum ponto e um raio. Crie um método que calcule a áreado círculo.

� 6 - Crie uma classe Conta com os atributos número esaldo; e os métodos que permitam fazer o saque,depósito, e um para imprimir os dados da conta.

Page 125: Cur So Java

Capítulo 9 Capítulo 9 –– Pacotes, Pacotes, Modificadores de Acesso e Modificadores de Acesso e

Membros estáticosMembros estáticos

Prof. Rômulo SilvaProf. Rômulo Silva

Page 126: Cur So Java

Modularidade e Reutilização

� Uma classe tem granularidade muito fina para reutilização em sistemas complexos, com milhares de linhas de código

� Sistemas complexos precisam ser

Prof. Rômulo SilvaProf. Rômulo Silva

� Sistemas complexos precisam ser modularizados para facilitar a manutenção

� Solução em Java: uso de pacotes.

Page 127: Cur So Java

Pacotes

� Um pacote é um agrupamento de classes que formam um módulo de um sistema

� Sintaxe:� package nomedopacote;

� Convenção de nomeação:

Prof. Rômulo SilvaProf. Rômulo Silva

� Convenção de nomeação:� Em letras minúsculas� Agregar ao nome do pacote o domínio da

empresa (Internet) de trás para frente� Exs:

• package org.eclipse.core.runtime;

• package com.sun.java.swing;

Page 128: Cur So Java

Pacote

� Declaração de pacote deve vir antes da declaração da classe

� Ex.:package com.b3informatica.biblioteca;

Prof. Rômulo SilvaProf. Rômulo Silva

package com.b3informatica.biblioteca;

class Livro {

...

}

Page 129: Cur So Java

Pacotes - observações

� Toda classe deve pertencer a um único pacote

� Java cria o pacote default para classes que não declaram pacote

� Nome completo da classe:

Prof. Rômulo SilvaProf. Rômulo Silva

� Nome completo da classe: nomedopacote.NomedaClassepackage com.b3informatica.biblioteca;

class Livro {

...

}

� com.b3informatica.biblioteca.Livro

Page 130: Cur So Java

Pacotes - observações

� Classes com mesmo nome em pacotes diferentes são consideradas classes distintas

package com.empresa.biblioteca;

class Livro {

Prof. Rômulo SilvaProf. Rômulo Silva

class Livro {...}� com.empresa.biblioteca.Livro

package com.b3informatica.biblioteca;

class Livro {...}� com.b3informatica.biblioteca;

Page 131: Cur So Java

Reutilização de pacotes

� Para usar classes de um pacote deve-se importá-la� Sintaxe:

� import nomedopacote.NomedaClasse;

� Declaração de import deve antes da definição da classe cliente, após a declaração do pacote.

Prof. Rômulo SilvaProf. Rômulo Silva

package com.empresa.informatica;

import java.io.FileInputStream;

class Livro {

...

}

classe importada

Page 132: Cur So Java

Reutilização de pacotes

� Quando se deseja utilizar várias classes do mesmo pacote, pode-se usar * (asterisco) no lugar do nome da classe para importar todas as classes do pacote:package com.empresa.informatica;

Prof. Rômulo SilvaProf. Rômulo Silva

import java.io.*;

class Livro {

...

}

importa todas as classes do pacote java.io

Page 133: Cur So Java

Pacotes – observações

� A escolha de quais classes devem pertencer a um determinado pacote é em função dos critérios de modularização do sistema

� Em geral, agrupa-se classes que tratem do

Prof. Rômulo SilvaProf. Rômulo Silva

� Em geral, agrupa-se classes que tratem do mesmo assunto (domínio de aplicação)� Ex.: package com.empresa.contabilidade;

Page 134: Cur So Java

Modificadores de Visibilidade

� Definem o escopo de atributos, métodos e classes� Onde eles são visíveis (referenciáveis)

� Sintaxe:

Prof. Rômulo SilvaProf. Rômulo Silva

� Sintaxe:� modificador-visibilidade atributo;� modificador tipo-retorno nomeMetodo (lista-

parâmetros) {Corpo-metodo

}

Page 135: Cur So Java

Modificadores de Visibilidade - exemplo

class Livro {

private String titulo;

private String autor;

...

public String getTitulo() {

return titulo;

modificadores dos atributos

Prof. Rômulo SilvaProf. Rômulo Silva

return titulo;

}

}

modificador de método

Page 136: Cur So Java

Modificadores de Visiblidade

� Modificadores para atributos e métodos:� private: visíveis apenas dentro da classe

proprietária� protected: visíveis dentro da classe proprietária

e suas subclasses (classes derivadas)� public: visíveis a todas as classes

Prof. Rômulo SilvaProf. Rômulo Silva

� public: visíveis a todas as classes

� Atributos e métodos que não declaram modificadores de visibilidade, tem escopo package, isto é, são visíveis a todas classes do mesmo pacote

Page 137: Cur So Java

Modificadores de Visiblidade

� Somente o modificador public é válido para classes

� Classes sem declaração de modificador tem escopo package, isto é, são visíveis a apenas classes do mesmo pacote

Prof. Rômulo SilvaProf. Rômulo Silva

package com.empresa.biblioteca;

import java.io.*;

public class Livro { // classe pode ser

referenciada em outros pacotes

...

}

Page 138: Cur So Java

Modificadores de visibilidade - observações

� Os modificadores de visibilidade junto com a declaração de pacotes definem o encapsulamento dos objetos.

� Encapsulamento é um dos grandes

Prof. Rômulo SilvaProf. Rômulo Silva

� Encapsulamento é um dos grandes benefícios de OO:� as classes expõem o mínimo de informação para

as classes clientes� permite alterações na implementação sem

afetar as classes clientes� minimizar dependências

Page 139: Cur So Java

Membros estáticos

� Atributos e métodos estáticos são únicos por classe, compartilhado por todos os objetos da classe

� A alocação de memória para os atributos é

Prof. Rômulo SilvaProf. Rômulo Silva

� A alocação de memória para os atributos é feita durante a carga da classe, antes mesmo de ser criada qualquer instância

� Os membros estáticos devem ser referenciados usando o nome da classe ao invés de variáveis de tipo objeto.

Page 140: Cur So Java

Membros estáticospublic class ContaInstancia {private static int nroInstancias;

public ContaInstancia() {nroInstancias++;

}

public static void imprimeNroInstancias() {

chamada de método estático

Prof. Rômulo SilvaProf. Rômulo Silva

public static void imprimeNroInstancias() {System.out.println("Nro de Instâncias:"+

nroInstancias);}

public static void main(String[] args) {ContaInstancia c1 = new ContaInstancia();ContaInstancia c2 = new ContaInstancia();ContaInstancia c3 = new ContaInstancia();ContaInstancia.imprimeNroInstancias();

}}

Page 141: Cur So Java

Membros estáticos -observações

� Na terminologia de Orientação a Objetos, atributos e métodos estáticos são chamados de variáveis de classe e métodos de classe, respectivamente.

Prof. Rômulo SilvaProf. Rômulo Silva

� Porque o método main é estático:� Para ser executado sem que haja nenhuma

instância criada

Page 142: Cur So Java

Variáveis de classe

� Podem ser inicializadas na própria declaração ou dentro de um bloco static:

public class ContaInstancia {private static int nroInstancias = 0;

...

ou

Prof. Rômulo SilvaProf. Rômulo Silva

ou

public class ContaInstancia {private static int nroInstancias;static {

nroInstancias = 0;}

...

Page 143: Cur So Java

Membros final

� A palavra final indica que o membro não pode ser alterado, após ser inicializado.

� Método: não pode ser sobreposto nas subclasses

� Atributo: ao lado de static, será tratado

Prof. Rômulo SilvaProf. Rômulo Silva

� Atributo: ao lado de static, será tratado como uma constante

� Classe: não permite criação de classes derivadas.

Page 144: Cur So Java

Membros final - exemplo

� A classe pré-definida java.lang.Math define as constantes matemáticas PI e E da seguinte forma:

� public static final double PI = 3.141592653589793;

Prof. Rômulo SilvaProf. Rômulo Silva

� public static final double E = 2.718281828459045;

Page 145: Cur So Java

Exercícios

� 1 - Em geral, as classes definem a visibilidade de suasvariáveis de instância como private, e os métodos quemanipulam as variáveis como public. Qual a vantagem deassim proceder?

� 2 - Crie um método estático para a classe Conta do capítuloanterior que faça uma transferência de valor entre duas contas.

Prof. Rômulo SilvaProf. Rômulo Silva

anterior que faça uma transferência de valor entre duas contas.

� 3 - O construtor da classe padrão java.lang.Math temvisibilidade private e todos os demais métodos são estáticos.Qual a razão disto?

� 4 - Em orientação a objetos, é comum encontrar situaçõesonde é preciso garantir a existência de uma única instância deuma determinada classe. Como é possível garantir isso usandomodificadores de acesso?

Page 146: Cur So Java

Capítulo 10 Capítulo 10 –– Classes Classes Abstratas e InterfacesAbstratas e Interfaces

Prof. Rômulo SilvaProf. Rômulo Silva

Page 147: Cur So Java

Problema

� Como fornecer uma implementação para o método da classe Figura abaixo???

Figura

desenha()

Prof. Rômulo SilvaProf. Rômulo Silva

Circulo

desenha()

Quadrado

desenha()

Triangulo

desenha()

Page 148: Cur So Java

Solução: Métodos Abstratos

� Método abstrato:� Um método que conhecemos sua interface

(assinatura), mas não se sabe como implementá-lo.

� A implementação será fornecida por subclasses utilizando sobreposição

Sintaxe:

Prof. Rômulo SilvaProf. Rômulo Silva

� Sintaxe:� Visibilidade abstract tipo-retorno

nomeMetodo(lista-parametros);

� Classes que possuem um método abstrato devem ser declaradas como abstratas

Page 149: Cur So Java

Classes e Métodos Abstratos - exemplo

public abstract class Figura {

...

public abstract void desenha();

}

Prof. Rômulo SilvaProf. Rômulo Silva

método sem implementação

Page 150: Cur So Java

Classes Abstratas -observações

� Uma classe abstrata não pode ser instanciada� Compilador não pode garantir que existe uma

implementação para cada método

...

Prof. Rômulo SilvaProf. Rômulo Silva

Figura f = new Figura();

f.desenha();

...

erro de compilação

Page 151: Cur So Java

Interfaces

� Uma interface é uma coleção de assinaturas de métodos, que em conjunto definem um contrato entre uma classe utilitária e suas clientes.� Métodos não têm implementação

Prof. Rômulo SilvaProf. Rômulo Silva

� Sintaxe:� interface NomeInterface {

assinaturasMetodos}

Page 152: Cur So Java

Interfaces - exemplo

interface Conjunto {

void addElemento(Object elem);

void removeElemento(Object elem);

Object getElemento(int pos);

}

Prof. Rômulo SilvaProf. Rômulo Silva

}

� Convenção de nomeação: a mesma para classes� Alguns programadores gostam de incluir um I

maiúsculo no início para facilitar a identificação em outros pontos do código•interface IConjunto { ...}

Page 153: Cur So Java

Interfaces

� Várias classes podem fornecer implementações diferentes para a mesma interface

� Útil para promover o desacoplamento entre

Prof. Rômulo SilvaProf. Rômulo Silva

� Útil para promover o desacoplamento entre especificação/implementação

� Permite a troca de uma implementação sem afetar as classes clientes.

Page 154: Cur So Java

Interfaces - exemplopackage com.empresa.Conjuntos;

import java.util.Vector;

public class MeuConjunto implements Conjunto {

private Vector elementos;

public MeuConjunto() {elementos = new Vector();

}

Prof. Rômulo SilvaProf. Rômulo Silva

}

public void addElemento(Object x) {if(!elementos.contains(x))elementos.addElement(x);

}public void removeElemento(Object x) {

boolean achou = elementos.removeElement(x); }public Object getElemento(int pos) {

return elementos.elementAt(pos); }

}

implementaçãode interface

Page 155: Cur So Java

Interfaces - observações

� Na terminologia OO, diz-se que uma classe implementa ou assume uma interface

� Uma classe, mesmo que não declare implementações de interfaces, possui uma

Prof. Rômulo SilvaProf. Rômulo Silva

implementações de interfaces, possui uma interface implícita:� Formada pelas assinaturas do métodos públicos

Page 156: Cur So Java

Interfaces – notação UML

Conjunto<<interface>>

addElemento(Object x): voidremoveElemento(Object x): voidgetElemento(int pos): Object

Prof. Rômulo SilvaProf. Rômulo Silva

MeuConjunto

getElemento(int pos): Object

Page 157: Cur So Java

Interfaces

� Mais de uma classe pode implementar a mesma interface

Conjunto<<interface>>

addElemento(Object x): voidremoveElemento(Object x): void

Prof. Rômulo SilvaProf. Rômulo Silva

MeuConjunto

removeElemento(Object x): voidgetElemento(int pos): Object

ConjuntoTamFixo

Page 158: Cur So Java

Interfaces

� O uso de interface aumenta a flexibilidade do código:� amplia a capacidade de polimorfismo� objetos que têm a mesma interface podem ser

usados indistintamente em relação aos métodos que compõem a interface

Prof. Rômulo SilvaProf. Rômulo Silva

que compõem a interface

� Podem ser usadas em declarações de atributos, variáveis locais ou parâmetros de métodos

Page 159: Cur So Java

Interfaces

� Polimorfismo:...

Conjunto conj;

...

String str = "um elemento";

MeuConjunto

Conjunto<<interface>>

addElemento(Object x): voidremoveElemento(Object x): voidgetElemento(int pos): Object

ConjuntoTamFixo

Prof. Rômulo SilvaProf. Rômulo Silva

String str = "um elemento";

conj.addElemento(str);

...

válido para objetosda classe Conjunto e ConjuntoTamFixo

Page 160: Cur So Java

Interfaces - herança

� Uma interface pode estender outras interfaces, herdando as assinaturas dos métodos

� Ao contrário de classes, pode ocorrer

Prof. Rômulo SilvaProf. Rômulo Silva

� Ao contrário de classes, pode ocorrer herança múltipla� Não há ambigüidade, pois não há

implementações reais de métodos, apenas assinaturas

Page 161: Cur So Java

Herança de Interfaces -exemplo

interface A {

void metodoA(int x);

}

interface B {

int metodoB();

}

public class X implements A {

...

public void metodoA(int x) {

...

}

}

public class Y implements C {

...

Prof. Rômulo SilvaProf. Rômulo Silva

interface C extends A, B {

void metodoC();

}

...

public void metodoA(int x) {

...

}

public int metodoB() {

...

}

public void metodoC() {

...

}

}

interface C herda as assinaturas

definidas em A e B

Page 162: Cur So Java

Interfaces - observações

� Se uma classe que assume uma interface não provê implementação para algum método da interface, ela deve ser obrigatoriamente declarada como abstract

Prof. Rômulo SilvaProf. Rômulo Silva

� Uma mesma classe pode assumir mais de uma interface simultaneamente.

Page 163: Cur So Java

Interfaces - exemplo

interface A {

void metodoA(int x);

}

interface B {

int metodoB();

}

class Z implements A, B {

...

public void metodoA(int x)

{

...

}

public int metodoB() {

Prof. Rômulo SilvaProf. Rômulo Silva

interface C extends A, B {

void metodoC();

}

...

}

}

Page 164: Cur So Java

Interfaces - observações

� Princípio de OO para reutilização/substituição de componentes:� “Programar mais para interfaces que para

implementações concretas”� Acoplamentos fracos

Prof. Rômulo SilvaProf. Rômulo Silva

� No momento de projetar as classes, procurar pensar mais em termos de interfaces (contrato dos métodos)

Page 165: Cur So Java

Exercícios

� 1 - Defina uma interface Node que represente umelemento de uma lista e que especifique uma assinaturade método void imprime(). Defina uma classe Lista

que implementa uma lista de nodes, com os métodos:� boolean isVazia(): retorna true se a lista está vazia� void addNode(Node x): adiciona um elemento na lista

Prof. Rômulo SilvaProf. Rômulo Silva

� void imprime(): imprime todos os elementos da lista.

O construtor da lista deve receber o número máximo deelementos como parâmetro.Crie duas classes, por exemplo: Pessoa e Livro, queimplementem a interface Node e crie instâncias paratestar a classe Lista.

Page 166: Cur So Java

Exercícios

� 2 - Crie um esqueleto de programa para fazer otratamento de transações bancárias. Cada transação temum código e um número específico de campos. Astransações são enviadas para o servidor como um string,porém cada transação sabe como gerar o string da formacomo o servidor espera. Forneça uma solução usando osrecursos de classes abstratas e interfaces.

Prof. Rômulo SilvaProf. Rômulo Silva

recursos de classes abstratas e interfaces.

Page 167: Cur So Java

Capítulo 11 Capítulo 11 –– Tratamento Tratamento de Exceçõesde Exceções

Prof. Rômulo SilvaProf. Rômulo Silva

Page 168: Cur So Java

Tipos de Erros

� Erros de lógica de programação:� Divisão por zero

� Erros relacionados ao ambiente de

Prof. Rômulo SilvaProf. Rômulo Silva

� Erros relacionados ao ambiente de execução, contudo contornáveis:� Indisponibilidade de rede

� Erros incontornáveis:� Falta de memória, erro interno da JVM

Page 169: Cur So Java

Tratamento de Exceções

� Em Java, uma exceção é um tipo especial de objeto, “lançado” quando ocorre um erro.

� O objeto “lançado” pode ser capturado e

Prof. Rômulo SilvaProf. Rômulo Silva

� O objeto “lançado” pode ser capturado e tratado de maneira simples e elegante.

Page 170: Cur So Java

Tratamento de Exceções

� Sintaxe:try {// bloco de comandos...}catch(TipoExcecao1 e) {// bloco de tratamento da exceção 1...

Prof. Rômulo SilvaProf. Rômulo Silva

...}catch(TipoExcecao2 e) {// bloco de tratamento da exceção 2...}...catch(TipoExcecaoN e) {// bloco de tratamento da exceção N...}

Page 171: Cur So Java

Exceções pré-definidas

� ArrayIndexOutOfBoundsException:� Lançada quando é referenciada uma posição

inválida de um array

� NullPointerException:� Lançada quando se tenta invocar um método

usando uma referência nula.

Prof. Rômulo SilvaProf. Rômulo Silva

usando uma referência nula.

� FileNotFoundException:� Lançada quando se tenta ler um arquivo

inexistente

Page 172: Cur So Java

Tipos de Exceções

� Checked:� Tratamento obrigatório (exigido pelo

compilador)• Ex.: FileNotFoundException

� Unchecked:

Prof. Rômulo SilvaProf. Rômulo Silva

� Tratamento opcional• Ex.: ArrayIndexOutOfBoundsException

� Exceções definidas pelo programador devem ser do tipo checked

Page 173: Cur So Java

Definição de Exceções

� São classes que estendem a classe pré-definida java.lang.Exception

public class ConfiguracaoException

extends Exception {

Prof. Rômulo SilvaProf. Rômulo Silva

public ConfiguracaoException(String nome) {

super("A Config. "+ nome + “ é inválida");

}

}

Page 174: Cur So Java

Lançamento de exceções

� Para lançar usa-se a palavra reservada throw (sem s):

...

Configuracao c = arq.LeConfiguracao();

if(c.getNumConfiguracao() < 0) {

throw new ConfiguracaoException(arq.getNome());

Prof. Rômulo SilvaProf. Rômulo Silva

throw new ConfiguracaoException(arq.getNome());

}

...lança uma exceção

Page 175: Cur So Java

Lançamento de exceções

� O lançamento de exceção interrompe o fluxo normal do programa, subindo de escopo até encontrar um bloco catchapropriado.

Prof. Rômulo SilvaProf. Rômulo Silva

� A ocorrência de exceções do tipo unchecked, quando não tratadas ocasionam a queda da aplicação.

Page 176: Cur So Java

Lançamento de exceções

� Métodos que não tratam exceções do tipo checked devem declarar na sua assinatura o lançamento das exceções

� cláusula throws (com s)

Prof. Rômulo SilvaProf. Rômulo Silva

� Responsabilidade de tratamento fica para a classe cliente

Page 177: Cur So Java

Cláusula throws

public class Aplicacao {

...

public void setConfiguracao(Arquivo arq) throws

ConfiguracaoException {

Configuracao c = arq.LeConfiguracao();

if(c.getNumConfiguracao() < 0) {

throw new

Prof. Rômulo SilvaProf. Rômulo Silva

throw new

ConfiguracaoException(arq.getNome());

}

...

}delega tratamento para a classe cliente

Page 178: Cur So Java

Cláusula throws

� Um método pode lançar mais de uma exceção

� Sintaxe:public tipo-retorno nomeMetodo(lista-

Prof. Rômulo SilvaProf. Rômulo Silva

public tipo-retorno nomeMetodo(lista-

parametros) throws TipoExcecao1,

TipoExcecao2, ..., TipoExcecaoN {

// corpo do método

...

}

Page 179: Cur So Java

finally

� Bloco opcional usado junto a um bloco try-catch

� O conteúdo do bloco é executado independentemente se ocorre exceção ou não

Prof. Rômulo SilvaProf. Rômulo Silva

� Se ocorre exceção, é executado após o bloco catch da exceção lançada.

Page 180: Cur So Java

finally

try {

...

}

catch(TipoExcecao1 e) {

...

}

...

Prof. Rômulo SilvaProf. Rômulo Silva

...

catch(TipoExcecaoN e) {

...

}

finally {

//bloco sempre executado

...

}

Page 181: Cur So Java

Exercícios

� 1 - Crie uma exceção ListaCheiaException e altere ométodo void addNode(Node x) da classe Listaproposta no exercício 1 do capítulo 10 para lançá-laquando houver a tentativa de inserir um nó na lista que játenha atingindo o tamanho máximo. Faça um teste ondeocorra o lançamento da exceção.

Prof. Rômulo SilvaProf. Rômulo Silva

� 2 - Crie uma exceção ExecucaoTransacaoException

e remodele a aplicação de transações bancárias, propostano exercício 2 do capítulo 10 , para que quando o servidorretorne erros da execução da transação, seja lançadauma exceção apropriada.

Page 182: Cur So Java

Capítulo 12 Capítulo 12 –– CollectionsCollections

Prof. Rômulo SilvaProf. Rômulo Silva

Page 183: Cur So Java

Estruturas de Dados

� A maioria das aplicações precisam de estruturas de dados que armazenem coleções de objetos:� Listas, pilhas, filas, árvores binárias, tabelas hash, etc.

� O pacote java.util define uma série de classes e interfaces para implementação e tratamento de

Prof. Rômulo SilvaProf. Rômulo Silva

interfaces para implementação e tratamento de coleções.� Collections Framework

� Obs.: a partir da versão 5.0, as coleções são parametrizadas.

Page 184: Cur So Java

Interface java.util.Collection

� boolean add(E obj)

� void clear()

� boolean contains(E obj)

� boolean isEmpty()

Prof. Rômulo SilvaProf. Rômulo Silva

� boolean isEmpty()

� Iterator<E> iterator()

� boolean remove(E obj)

� int size()

Page 185: Cur So Java

Interfaces do pacote java.util

java.util.Collection

<<interface>>

java.util.List

<<interface>>

java.util.Set

<<interface>>

Prof. Rômulo SilvaProf. Rômulo Silva

� List:� Seqüência definida� Elementos indexados

� Set:� Seqüência arbitrária� Não há elementos repetidos

Page 186: Cur So Java

Implementações da interface Set

� HashSet:� Implementação de hash table

� TreeSet� Implementação de uma árvore rubro-negra

Prof. Rômulo SilvaProf. Rômulo Silva

� Implementação de uma árvore rubro-negra (Red-black Tree)

� LinkedHashSet� Implementação de lista ligada e hash table com

inserção ordenada

Page 187: Cur So Java

Implementações da interface List

� ArrayList� Implementação de lista usando array

redimensionável.

� LinkedList

Prof. Rômulo SilvaProf. Rômulo Silva

� LinkedList� Implementação de lista duplamente encadeada

� Vector� Implementação de array redimensionável

sincronizado

Page 188: Cur So Java

Interface Map<K,V>

� Mapeia chaves a valores.

� Não pode haver chaves repetidas.

� V put(K chave, V valor)

Prof. Rômulo SilvaProf. Rômulo Silva

� V put(K chave, V valor)

� V remove (Object chave)

� boolean containsKey(Object chave)

� boolean containsValue (Object valor)

Page 189: Cur So Java

Implementações da Interface Map<K,V>

� HashMap� Implementação de hash table não sincronizada

que admita valores null para chaves e valores.

� TreeMap� Implementação de uma árvore rubro-negra

(Red-black)

Prof. Rômulo SilvaProf. Rômulo Silva

(Red-black)

� LinkedHashMap� Implementação de lista ligada e hash table com

inserção ordenada.

� Hashtable� Implementação de hash table sincronizada que

não permite chaves e nem valores nulos

Page 190: Cur So Java

Interface Queue

� Usada em implementações de filas

� Implementações:� PriorityQueue: fila implementada através de

uma estrutura de dados heap

Prof. Rômulo SilvaProf. Rômulo Silva

uma estrutura de dados heap� ConcurrentLinkedQueue: fila bloqueante não

limitada baseada em nós ligados.� ArrayBlockingQueue: fila bloqueante limitada

usando array

Page 191: Cur So Java

classe ArrayList

� Implementa a interface java.util.Listusando um array interno.

ArrayList<String> lista = new

ArrayList<String>();

Prof. Rômulo SilvaProf. Rômulo Silva

ArrayList<String>();

lista.add("elem1");

lista.add("elem2");

lista.add("elem3");

Page 192: Cur So Java

classe LinkedList

� Implementa uma lista, com métodos adicionais para inserção/remoção de elementos no início e no fim da lista

LinkedList<String> lista = new

LinkedList<String>();

Prof. Rômulo SilvaProf. Rômulo Silva

LinkedList<String>();

lista.addFirst("elem1");

lista.addLast("elem2");

lista.addFirst("elem3");

Page 193: Cur So Java

Classe java.util.Collections

� Consiste exclusivamente de métodos estáticos que operam sobre ou retornam coleções.� static <T> int binarySearch(List<? extends

T> list, T key, Comparator<? super T> c)

� static <T> T max(Collection<? extends

Prof. Rômulo SilvaProf. Rômulo Silva

� static <T> T max(Collection<? extends

T> coll, Comparator<? super T> comp)

� static <T> T min(Collection<? extends

T> coll, Comparator<? super T> comp)

� static <T> void sort(List<T> list)

� static <T> void sort(List<T> list,

Comparator<? super T> c)

Page 194: Cur So Java

Exercícios

� 1 - Crie uma lista de objetos da classe Pessoa e ordena alista e imprima-a ordenada.

� 2 - Crie uma tabela hash tal que o nome da pessoa sejaassociado ao respectivo objeto da classe Pessoa. Emseguida imprima todas as chaves da tabela hash.

Prof. Rômulo SilvaProf. Rômulo Silva

seguida imprima todas as chaves da tabela hash.

Page 195: Cur So Java

Genéricos (Generics)

� Semelhante a idéia de templates de C++, porém não há expansão de código comoem C++.

� Permite escrever métodos genéricos, com algoritmo comum operando sobre tiposdiferentes.

Prof. Rômulo SilvaProf. Rômulo Silva

diferentes.

� Pode ser aplicado a métodos individuais oua classes

� Indicado pela declaração entre os sinais <e >

Page 196: Cur So Java

Genéricos – uso em métodos

public class MinhaClasse {

public static <E> void imprimeArray(E[]

arrayEntrada) {

for(E elemento: arrayEntrada)

System.out.printf(“%s”, elemento);

}

Prof. Rômulo SilvaProf. Rômulo Silva

}

public static void main(String args[]) {

Integer[] x = {5,10,7,11};

imprimeArray(x);

String[] y = {“str1”, “str2”, “str3”};

imprimeArray(y);

}

Page 197: Cur So Java

Genéricos – uso em classepublic class Pilha<E> {

private final int tam;

private int topo;

private E[] elementos;

public Pilha(int s) {

tam = s;

topo = -1;

elementos = (E[]) new Object[tam];

}

public void push(E valor) {

Prof. Rômulo SilvaProf. Rômulo Silva

public void push(E valor) {

if(topo == tam-1)

throw new RuntimeException(“pilha cheia”);

elementos[++topo] = valor;

}

public E pop() {

if(topo == -1)

throw new RuntimeException(“pilha vazia”);

return elementos[topo--];

}

}

Page 198: Cur So Java

Genéricos – uso em classe

…Pilha<String> p = new Pilha<String> (5);

p.push(“str1”);

p.push(“str2”);

p.push(“str3”);

Prof. Rômulo SilvaProf. Rômulo Silva

p.push(“str3”);

String s = p.pop();

Page 199: Cur So Java

Genéricos - observação

� É possível instanciar uma classe genéricasem indicar o tipo. Neste caso, ficasubentendido que o parâmetro da classeserá do tipo Object

Prof. Rômulo SilvaProf. Rômulo Silva

� Ex.:Pilha p = new Pilha(5);// elementos

do tipo Object

Pilha p2 = new Pilha<Integer>(7);//

elementos do tipo Integer

Page 200: Cur So Java

Genéricos e Subtipos

� Se A é subtipo de B e G uma classe genéricaentão:

G<A> NÃO é subtipo de G<B>� Ex.: Considere classe Professor sendo subtipo de Pessoa:

List<Professor> lista1 = new ArrayList<Professor>();

Prof. Rômulo SilvaProf. Rômulo Silva

List<Professor> lista1 = new ArrayList<Professor>();

List<Pessoa> lista2 = lista1; // ERRO DE COMPILAÇÃO!!!

� Se List<Professor> fosse subtipo de List<Pessoa>seria possível:

lista2.add(new Pessoa(“Joao”,36));// agora tem uma

Pessoa na lista de professores que não é

Professor!!!

Page 201: Cur So Java

Genéricos – tipo Curinga

� Sintaxe: < ? >� Indica um tipo desconhecido� Coleções com tipo curinga podem ter seus

elementos lidos, mas não pode recebernovos elementos

Prof. Rômulo SilvaProf. Rômulo Silva

novos elementos� Ex.:

void printCollection(Collection<?> c) { …}

aceita uma como parâmetro uma coleção de qualquer tipo.

Page 202: Cur So Java

Genéricos – tipo Curinga

� Limites:� Superior: <? extends T>

indica que aceita T e seus descendentes

� Inferior: <? super T>

Prof. Rômulo SilvaProf. Rômulo Silva

indica que aceita T e seus ascendentes

� Ex.:public void imprimeLista(List<? extends Pessoa>

lista) {//aceita Pessoa e Professor

for(Pessoa p: lista)

imprime(p);

}

Page 203: Cur So Java

Capítulo 13 Capítulo 13 –– Pacote Pacote Padrão, Entrada e SaídaPadrão, Entrada e Saída

Prof. Rômulo SilvaProf. Rômulo Silva

Page 204: Cur So Java

Pacote Padrão – java.lang

� Não precisa fazer import para usar usas classes (importado automaticamente)

� Principais classes:� Object

� System

Prof. Rômulo SilvaProf. Rômulo Silva

� String

� Thread

� Wrappers (Integer, Long, Float, Boolean, ...)� Exceções (Exception, NullPointerException,

...)� Interfaces (Comparable)

Page 205: Cur So Java

java.lang.Object

� Raiz da hierarquia de classes do sistema� Principais métodos:

� boolean equals(Object): retorna true se duas referências de objetos são iguais (apontam para o mesmo objeto)

� String toString(): transforma uma referência

Prof. Rômulo SilvaProf. Rômulo Silva

� String toString(): transforma uma referência de objeto para String.

� Class getClass(): retorna um objeto representado a classe do objeto (metaclasse)

Page 206: Cur So Java

java.lang.System

� Atributos estáticos que representam o sistema� System.in : entrada padrão do sistema� System.out : saída padrão do sistema� System.err : saída padrão de erro

Principais métodos:

Prof. Rômulo SilvaProf. Rômulo Silva

� Principais métodos:� String getProperty(String p): retorna

valores de propriedades do sistema (versão da máquina virtual, separador de arquivo, sistema operacional)

� void exit(int codigoSaida)

Page 207: Cur So Java

java.lang.Math

� Provê constantes matemáticas (PI e E), métodos estáticos para cálculo de funções matemáticas

� Principais métodos:� double pow(double a, double b)

Prof. Rômulo SilvaProf. Rômulo Silva

� double sqrt(double a)

� long round(double a)

� int round(float a)

� double random()

Page 208: Cur So Java

java.lang.String

� Implementa um objeto que armazena uma cadeia de caracteres

� Principais métodos:� char charAt(int pos)

� byte[] getBytes()

Prof. Rômulo SilvaProf. Rômulo Silva

� int length()

� String substring(int indiceInicio, int

indiceFim)

� String valueOf(int) : converte um inteiro para string

Page 209: Cur So Java

java.lang.String -comparação

� Cuidado!!: variáveis inicializadas com literais de String iguais apontam para um mesmo objeto

String str1 = "azul";

String str2 = "azul";Irá retornar true

Prof. Rômulo SilvaProf. Rômulo Silva

String str2 = "azul";

if(str1 == str2) { //compara referências str1 e str2

System.out.println(“objetos iguais");

}

else {

System.out.println(“objetos diferentes");

}

Irá retornar true

Page 210: Cur So Java

java.lang.String -comparação

� Variáveis inicializadas usando os construtores da classe String nunca apontam para um mesmo objeto

String str1 = new String("azul");

Prof. Rômulo SilvaProf. Rômulo Silva

String str2 = new String("azul");

if(str1 == str2){ //compara referências str1 e str2

System.out.println("objetos iguais");

}

else {

System.out.println("objetos diferentes");

}

Irá retornar false

Page 211: Cur So Java

java.lang.String -comparação

� Para evitar confusão nas comparações de strings, use sempre o método equals.

� Método equals da classe String:� Sobreposto de Object

Prof. Rômulo SilvaProf. Rômulo Silva

� Sobreposto de Object� Retorna true se duas strings contém a mesma

seqüência de caracteres

Page 212: Cur So Java

java.lang.String -comparação

String str1 = new String("azul");

String str2 = new String("azul");

if(str1.equals(str2)){ //compara conteúdo de str1 e

str2

System.out.println("strings iguais");

}

else {Irá retornar true

Prof. Rômulo SilvaProf. Rômulo Silva

else {

System.out.println("strings diferentes");

}

Irá retornar true

Page 213: Cur So Java

Pacote java.io

� Define várias interfaces e classes para tratamento de entrada e saída

� Classe java.io.File:� Usada para representar o sistema de arquivos� Métodos para testar existência de arquivos,

Prof. Rômulo SilvaProf. Rômulo Silva

� Métodos para testar existência de arquivos, listar diretórios, verificar permissões, etc.

� A existência de um objeto File não implica na existência real do arquivo

Page 214: Cur So Java

java.io.File

� Principais métodos:� boolean exists()

� boolean isFile()

� boolean isDirectory()

� String[] list()

Prof. Rômulo SilvaProf. Rômulo Silva

� String getAbsolutePath()

� boolean createNewFile()

� boolean mkdir()

Page 215: Cur So Java

java.io.File - exemplo

...

File f = new File("c:\\temp");

if(f.isDirectory()) {

String[] arqs = f.list();

Prof. Rômulo SilvaProf. Rômulo Silva

String[] arqs = f.list();

...

Page 216: Cur So Java

Fluxos de Entrada e Saída

� Em Java, toda operação de entrada/saída necessita da criação de fluxos (streams)

� O pacote java.io define dois grupos de classes de streams:

Prof. Rômulo SilvaProf. Rômulo Silva

classes de streams:� Streams de caracteres� Streams de bytes

Page 217: Cur So Java

Streams de bytes

InputStream

FileInputStream

ByteArrayInputStream

OutputStream

FileOutputStream

ByteArrayOutputStream

Prof. Rômulo SilvaProf. Rômulo Silva

FilterInputStream

BufferedInputStream

FilterOutputStream

BufferedOutputStream

Page 218: Cur So Java

Streams de Caracteres

Writer

OutputStreamWriter

BufferedWriter

Reader

InputStreamReader

BufferedReader

Prof. Rômulo SilvaProf. Rômulo Silva

FileWriterFileReader

Page 219: Cur So Java

Streams de bytes

� InputStream

� Classe genérica (abstrata)� Principais subclasses: FileInputStream e BufferedInputStream

� Métodos principais: •int read() : lê um byte

Prof. Rômulo SilvaProf. Rômulo Silva

•int read() : lê um byte

•int read(byte[] buffer): coloca os bytes lidos

no array do parâmetro e retorna a quantidade de bytes

lidos

•void close(): fecha o stream

Page 220: Cur So Java

java.io.FileInputStream

File f = new File("c:\\arquivo.txt");try {

FileInputStream in = new FileInputStream(f); //cria streambyte[] buf = new byte[1024];int qtdBytesLidos = in.read(buf); //le streamwhile(qtdBytesLidos != -1) {

String dados = new String(buf);System.out.println(dados);in.read(buf);

Prof. Rômulo SilvaProf. Rômulo Silva

in.read(buf);}in.close(); //fecha stream

}catch(FileNotFoundException e){

System.out.println("Não encontrou arquivo");}catch(IOException e){

System.out.println("Erro na leitura");}

-1 indica fim de arquivo

Page 221: Cur So Java

Stream de bytes

� OutputStream

� Classe genérica (abstrata)� Principais subclasses: FileOutputStream e BufferedOutputStream

� Principais métodos:•void write(int b)

Prof. Rômulo SilvaProf. Rômulo Silva

•void write(int b)

•void write(byte[] buffer)

•close()

•flush()

Page 222: Cur So Java

Streams de Caracteres

� Reader

� Classe genérica (abstrata)� Principais subclasses: BufferedReader eInputStreamReader

•int read() : lê um caracter

•int read(char[] buffer) : coloca caracteres

Prof. Rômulo SilvaProf. Rômulo Silva

•int read(char[] buffer) : coloca caracteres

lidos no array passado como parâmetro e retorna a

quantidade de caracteres lidos

•close() : fecha o stream

Page 223: Cur So Java

Streams de Caracteres

� Writer

� Classe genérica (abstrata)� Principais subclasses: BufferedWriter e OutputStreamWriter

� Principais métodos:•void write(int c)

Prof. Rômulo SilvaProf. Rômulo Silva

•void write(int c)

•void write(char[] buffer)

•close()

•flush()

Page 224: Cur So Java

Leitura/Escrita de arquivos texto

� Leitura: usar FileReader dentro de um BufferedReader

� Leitura bufferizada

� Escrita: usar FileWriter dentro de um

Prof. Rômulo SilvaProf. Rômulo Silva

BufferedWriter

� Escrita bufferizada

Page 225: Cur So Java

Leitura de Arquivos texto -exemplo

File f = new File("c:\\arquivo.txt");try {

BufferedReader in = new BufferedReader( newFileReader(f)); //cria o streamString linha = in.readLine(); //le uma linha do arquivo textowhile(linha != null) {

System.out.println(linha);linha = in.readLine();

Prof. Rômulo SilvaProf. Rômulo Silva

linha = in.readLine();}in.close(); //fecha o stream

}catch(FileNotFoundException e){

System.out.println("Não encontrou arquivo");}catch(IOException e){

System.out.println("Erro na leitura");}

Page 226: Cur So Java

Escrita de arquivos texto -exemplo

File f = new File("c:\\arquivo.txt");

try {

BufferedWriter out = new BufferedWriter( new

FileWriter(f)); //cria o stream

String linha = "linha para o arquivo";

out.write(linha); //escreve a linha no stream

out.close(); //fecha o stream

Prof. Rômulo SilvaProf. Rômulo Silva

out.close(); //fecha o stream

}

catch(FileNotFoundException e){

System.out.println("Não encontrou arquivo");

}

catch(IOException e){

System.out.println("Erro na leitura");

}

Page 227: Cur So Java

Leitura do teclado

� System.in : é um objeto estático do tipo InputStream que representa a entrada padrão (teclado)

� Para ler no formato de strings ao invés de bytes: embrulhar o objeto System.indentro com

Prof. Rômulo SilvaProf. Rômulo Silva

dentro BufferedReader com InputStreamReader

� Método String readLine(): retorna uma string com a linha lida

� Para ler números: usar classes Wrapperspara converter a string lida para número

Page 228: Cur So Java

Leitura do teclado - exemplo

try {

BufferedReader entrada = new BufferedReader(new

InputStreamReader(System.in)); //cria o stream

System.out.println("Digite um numero inteiro");

String linha = entrada.readLine();

int numero = Integer.parseInt(linha);

System.out.println(numero);

Prof. Rômulo SilvaProf. Rômulo Silva

System.out.println(numero);

}

catch(IOException e){

System.out.println("Erro na leitura");

}

Page 229: Cur So Java

Exercícios

� 1- Crie uma classe nomeada ListaInteiros,que implemente uma lista de inteiros, usando otipo primitivo int. Teste a classe criada.

� 2 - Faça um programa que leia um arquivo texto e

Prof. Rômulo SilvaProf. Rômulo Silva

� 2 - Faça um programa que leia um arquivo texto eimprima o seu conteúdo na console.

Page 230: Cur So Java

Exercícios

� 3 - Implemente uma agenda em um arquivo texto,onde cada registro contenha as seguintesinformações separadas por 2 pontos: nome, datade nascimento, endereço, telefone, e-mail. Crieuma classe para representar os registros, comum atributo para cada campo correspondente; e

Prof. Rômulo SilvaProf. Rômulo Silva

um atributo para cada campo correspondente; efaça a leitura do arquivo carregando os registrosem uma lista e imprimindo-os em seguida.Sugestão: utilize a classejava.util.StringTokenizer.

Page 231: Cur So Java

Capítulo 14 Capítulo 14 –– Interfaces Interfaces Gráficas de Usuário Gráficas de Usuário ––

AWT e SwingAWT e Swing

Prof. Rômulo SilvaProf. Rômulo Silva

Page 232: Cur So Java

Abstract Window Toolkit -AWT

� Lançada no Java 1.0 � Oferece componentes gráficos como

botões, janelas, campos de texto, etc.� A distribuição de componentes na tela é

determinada por gerenciadores de leiaute� A interação entre usuário e aplicação é

Prof. Rômulo SilvaProf. Rômulo Silva

� A interação entre usuário e aplicação é baseada em eventos� Modelo de eventos foi reformulado no Java 1.1

� Aparência e comportamento dependente de plataforma

� Classes e interfaces dos pacotes java.awte java.awt.event

Page 233: Cur So Java

Swing

� Lançado na versão 1.2� Conhecido como JFC (Java Foundation Classes)

� Fornece interface mais rica que AWT� Menos dependente de plataforma

Prof. Rômulo SilvaProf. Rômulo Silva

� Menos dependente de plataforma� Utiliza e expande os tipos de eventos e

gerenciadores de leiaute definidos no AWT� Hoje, usa-se sempre que possível Swing e

não mais objetos do AWT

Page 234: Cur So Java

Swing

� java.awt.Container são objetos contêiners: usado para incluir outros objetos gráficos

� javax.swing.JComponent é a superclasse da maioria de componentes gráficos do Swing.

Prof. Rômulo SilvaProf. Rômulo Silva

Swing. ja v a .la n g .O b je c t

ja v a x .sw in g .J C o m p o n e n t

ja va .a w t.C o n ta in e r

ja v a .a w t.C o m p o n e n t

Page 235: Cur So Java

javax.swing.JComponent

� Alugns métodos:� void setPreferredSize(Dimension d)

� void setEnabled(boolean b)

� void setForeground(Color c)

� void setBackground(Color c)

Prof. Rômulo SilvaProf. Rômulo Silva

� void setFont(Font c)

Page 236: Cur So Java

Swing - Componentes

� Principais componentes:� JLabel

� JTextField

� JButton

� JRadioButton

Prof. Rômulo SilvaProf. Rômulo Silva

� JCheckBox

� JComboBox

� JList

� JPanel

Page 237: Cur So Java

Swing - Componentes

Prof. Rômulo SilvaProf. Rômulo Silva

Page 238: Cur So Java

Swing - contêiners

� Todas as aplicações gráficas devem utilizar um dos seguintes contêiners para conter os demais objetos gráficos:� javax.swing.JFrame: usado para conter

objetos gráficos do Swing.

Prof. Rômulo SilvaProf. Rômulo Silva

� JApplet: usado para conter objetos gráficos do Swing para rodar dentro de browsers

� JPanel: contêiner de propósito geral para leiaute em camadas

Page 239: Cur So Java

Swing - contêiners

� Os objetos gráficos não são adicionados diretamente em JFrame ou JApplet� É necessário adicionar os componentes no

contêiner opaco (independente de plataforma) implementado no JFrame ou JApplet:

� Para obter o contêiner opaco:

Prof. Rômulo SilvaProf. Rômulo Silva

� Para obter o contêiner opaco:JFrame fr = new JFrame();

Container c = fr.getContentPane();

Ou

JApplet applet = new JApplet();

Container c = applet.getContentPane();

Page 240: Cur So Java

Swing - exemploimport java.awt.*;import javax.swing.*;

public class MinhaAplicacao extends JFrame {

public MinhaAplicacao() {super("Título da Minha Aplicacao");Container c = this.getContentPane(); //obtem o contêiner interno

do JFramec.setLayout(new FlowLayout()); //configura leiaute do JFrameJLabel rotuloNome = new JLabel("Nome"); //cria rótuloJTextField txtNome = new JTextField("valor inicial do campo");c.add(rotuloNome); //adciona rótulo no contêiner interno do

JFrame

Inclui pacotes de objetosAWT e Swing

Prof. Rômulo SilvaProf. Rômulo Silva

c.add(rotuloNome); //adciona rótulo no contêiner interno do JFrame

c.add(txtNome);JLabel rotuloEndereco = new JLabel("Endereco");JTextField txtEndereco = new JTextField("valor inicial");c.add(rotuloEndereco);c.add(txtEndereco);setSize(500,300); //configura tamanho inicial para o JFramesetVisible(true); // coloca o JFrame visível

}

public static void main(String[] args) {MinhaAplicacao aplic = new MinhaAplicacao(); //cria um JFrame

}}

Criação da aplicação

Page 241: Cur So Java

Swing - exemplo

Prof. Rômulo SilvaProf. Rômulo Silva

Page 242: Cur So Java

Swing – Gerenciadores de Leiaute

� Implementam um algoritmo de posicionamento e redimensionamento de objetos adicionados a um contêiner

� Principais gerenciadores de leiaute:� FlowLayout

Prof. Rômulo SilvaProf. Rômulo Silva

� BorderLayout

� GridLayout

Page 243: Cur So Java

FlowLayout

� É o leiaute mais simples� Posiciona os componentes em seqüência,

um ao lado do outro.� O componentes são, por default,

posicionados justificados no centro.

Prof. Rômulo SilvaProf. Rômulo Silva

posicionados justificados no centro. � Leiaute default para JPanel

Page 244: Cur So Java

FlowLayoutimport java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class TesteFlowLayout extends Jframe {

public TesteFlowLayout(){

super("Teste de FlowLayout");

Container c = getContentPane();

c.setLayout(new FlowLayout());

c.add(new JLabel("Nome"));

Prof. Rômulo SilvaProf. Rômulo Silva

c.add(new JLabel("Nome"));

c.add(new JTextField("Joao da Silva"));

c.add(new JButton("Confirma"));

setSize(300,100);

setVisible(true);

}

public static void main(String[] args) {

TesteFlowLayout fr = new TesteFlowLayout();

}

}

Page 245: Cur So Java

BorderLayout

� Implementa um leiaute geográfico, dividindo o contêiner em 5 regiões: NORTH, SOUTH, WEST, EAST e CENTER

� Default para JFrame e JApplet

� Objetos são adicionados nas regiões.

Prof. Rômulo SilvaProf. Rômulo Silva

� Objetos são adicionados nas regiões.CENTER

SOUTH

EASTWEST

NORTH

Page 246: Cur So Java

BorderLayout - exemploimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class TesteBorderLayout extends JFrame {

public TesteBorderLayout(){super("Teste de BorderLayout");Container c = getContentPane();c.setLayout(new BorderLayout());JTextArea area = new JTextArea();

Prof. Rômulo SilvaProf. Rômulo Silva

JTextArea area = new JTextArea();area.setText("linha1/nlinha2/nlinha3");c.add(new JLabel("Nome"), BorderLayout.WEST);c.add(new JTextField("Joao da Silva"), BorderLayout.EAST);c.add(new JButton("Confirma"), BorderLayout.SOUTH);c.add(new JTextArea("linha1\nlinha2\nlinha3"),

BorderLayout.CENTER);setSize(400,120);setVisible(true);

}public static void main(String[] args) {

TesteBorderLayout fr = new TesteBorderLayout();}

}

Page 247: Cur So Java

BorderLayout - regras

� NORTH e SOUTH têm prioridade no uso da largura e altura limitada pelo preferredSize do componente

� WEST e EAST tem altura limitada pela existência ou não de componentes no NORTH e SOUTH e largura limitada pelo

Prof. Rômulo SilvaProf. Rômulo Silva

NORTH e SOUTH e largura limitada pelo preferredSize do componente

� CENTER ignora preferredSize e ocupa todo o espaço que puder, mas limitado pela existência de objetos em NORTH, SOUTH, WEST e EAST

� Aceita somente um objeto por região

Page 248: Cur So Java

GridLayout

� Posiciona os componentes em uma forma de tabela com linhas e colunas.

� Cada célula aceita somente um objeto� Células não preenchidas ficarão em branco� Componente adicionado a uma célula ocupa

Prof. Rômulo SilvaProf. Rômulo Silva

� Componente adicionado a uma célula ocupa toda a célula

� Ignora o preferredSize dos objetos

Page 249: Cur So Java

GridLayout - exemploimport java.awt.*;import java.awt.event.*;import javax.swing.*;

public class TesteGridLayout extendsJFrame {

public TesteGridLayout(){super("Teste de GridLayout");Container c = getContentPane();c.setLayout(new GridLayout(3,2));c.add(new JLabel("Nome"));

Prof. Rômulo SilvaProf. Rômulo Silva

c.add(new JLabel("Nome"));c.add(new JTextField("Joao da Silva"));c.add(new JCheckBox("Funcionario", true));c.add(new JCheckBox("Estrangeiro"));c.add(new JButton("Confirma"));c.add(new JButton("Cancela"));setSize(300,130);setVisible(true);

}public static void main(String[] args) {

TesteGridLayout fr = new TesteGridLayout();}

}

Page 250: Cur So Java

Swing – composição de leiautes

� Quando é necessário acrescentar mais de um componente na mesma célula ou região:� Cria-se um contêiner de propósito geral

(JPanel) com o leiaute apropriado� Adiciona-se os objetos ao JPanel criado

Prof. Rômulo SilvaProf. Rômulo Silva

� Adiciona-se os objetos ao JPanel criado� Adiciona o JPanel na célula ou região

� A construção de GUIs faz-se combinando componentes, contêiners e leiautes adequados.

Page 251: Cur So Java

Combinação de Leiautes -exemplo

import java.awt.*;import java.awt.event.*;import javax.swing.*;

public class TestaCombinacaoLeiauteextends JFrame {

public TestaCombinacaoLeiaute(){super("Teste de BorderLayout");Container c = getContentPane();c.setLayout(new BorderLayout());JTextArea area = new JTextArea();

Prof. Rômulo SilvaProf. Rômulo Silva

JTextArea area = new JTextArea(); area.setText("linha1/nlinha2/nlinha3");c.add(new JLabel("Nome"), BorderLayout.WEST);c.add(new JTextField("Joao da Silva"), BorderLayout.EAST);JPanel painelBotoes = new JPanel();painelBotoes.setLayout(new FlowLayout());painelBotoes.add(new JButton("Confirma"));painelBotoes.add(new JButton("Cancela"));c.add(painelBotoes , BorderLayout.SOUTH);c.add(new JTextArea("linha1\nlinha2\nlinha3"),

BorderLayout.CENTER);setSize(400,120);setVisible(true);

}...

Composição de leiautes

Page 252: Cur So Java

Swing – mais Leiautes

� BoxLayout

� GridBagLayout

� CardLayout

Prof. Rômulo SilvaProf. Rômulo Silva

Page 253: Cur So Java

Swing - Eventos

� Definidos nos pacotes java.awt.event e javax.swing.event

java.lang.Object

java.util.EventObject

Prof. Rômulo SilvaProf. Rômulo Silva

ActionEvent ItemEvent ComponentEvent

FocusEvent WindowEventInputEvent

KeyEvent MouseEvent

java.awt.AWTEvent

AdjustmentEvent

PainEventContainerEvent

Page 254: Cur So Java

Swing - Eventos

� Gerados automaticamente pela JVM (máquina virtual) durante a interação do usuário com os objetos gráficos da aplicação

Prof. Rômulo SilvaProf. Rômulo Silva

� Tratamento de eventos é feito através da criação de classes:� Devem implementar interfaces pré-definidas

(listeners) para o tipo de evento específico� Utilização do padrão de projetos Observer

Page 255: Cur So Java

Swing - Listeners

� São interfaces que devem ser implementadas por classes que tratam os eventos

A d ju s tm e n tL is te n e r

A c t io n L is te n e r

ja v a .u t i l .E v e n tL is te n e r< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

Prof. Rômulo SilvaProf. Rômulo Silva

C o m p o n e n tL is te n e r

C o n ta in e rL is te n e r

F o c u s L is te n e r

I te m L is te n e r

K e y L is te n e r

M o u s e L is te n e r

W in d o w L is te n e r

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

< < in te r fa c e > >

Page 256: Cur So Java

Swing – Tratamento de Eventos

� Passos:1. Criar objetos gráficos (botões, janelas, campos

de texto, caixas de seleção, etc.)2. Criar classes que implementam os listeners

para o eventos desejados.3. Criar objetos das classes listeners e registrá-los

Prof. Rômulo SilvaProf. Rômulo Silva

3. Criar objetos das classes listeners e registrá-los junto ao objeto gráfico correspondente.

Page 257: Cur So Java

Tratamento de Eventos -exemplo

import java.awt.*;import javax.swing.*;

public class TesteTratamentoEventos extends JFrame {public TesteTratamentoEventos() {super("Teste de Tratamento de Eventos");Container c = this.getContentPane();c.setLayout(new FlowLayout());c.add(new JLabel("Nome"));JTextField txtNome = new JTextField("valor inicial");

Prof. Rômulo SilvaProf. Rômulo Silva

JTextField txtNome = new JTextField("valor inicial");txtNome.setPreferredSize(new Dimension(100,20));JButton btnAlteraNome = new JButton("Altera");TratadorEventoBotao t = new

TratadorEventoBotao(txtNome);btnAlteraNome.addActionListener(t);c.add(txtNome);c.add(btnAlteraNome);setSize(new Dimension(300,150));setVisible(true);

}...

Cria e registra listenerdo botão

Page 258: Cur So Java

Tratamento de Eventos –exemplo (listener)

import java.awt.event.*;

import javax.swing.JTextField;

public class TratadorEventoBotao

implements ActionListener {

JTextField txtCampo;

public TratadorEventoBotao(JTextField txtCampo){

Método chamado automaticamente na geração de um

evento do tipo ActionEvent

Prof. Rômulo SilvaProf. Rômulo Silva

public TratadorEventoBotao(JTextField txtCampo){

this.txtCampo = txtCampo;

}

public void actionPerformed(ActionEvent e){

String dadosCampo = txtCampo.getText();

txtCampo.setText(dadosCampo.toUpperCase()); //coloca em maiusculo

}

}

Page 259: Cur So Java

Tratamento de Eventos -possibilidades

� Uma mesma classe pode implementar o tratamento de vários tipos de eventos � Implementa os métodos definidos em cada interface Listener

public class XXX implements ActionListener, KeyListener {

public void actionPerformed(ActionEvent e){...

Prof. Rômulo SilvaProf. Rômulo Silva

...}

public void keyPressed(KeyEvent e){...}public void keyTyped(KeyEvent e) {...}public void keyReleased(KeyEvent e){... }

}

métodos de KeyListener

método de ActionListener

Page 260: Cur So Java

Tratamento de Eventos -possibilidades

� Um mesmo objeto pode tratar o mesmo tipo de evento para vários objetos gráficos

public class XXX implements ActionListener {

...

public void actionPerformed(ActionEvent e){

Object obj = e.getSource();

Prof. Rômulo SilvaProf. Rômulo Silva

Object obj = e.getSource();

if(obj == btn1) {

...

}

if(obj == btn2){

...

}

...

}

}

Retorna o objeto que gerou o evento

Faz o tratamentoespecífico para

cada objeto

Page 261: Cur So Java

Principais eventos, Listeners e seus métodos

Prof. Rômulo SilvaProf. Rômulo Silva

Page 262: Cur So Java

Applets

� Uma aplicação que roda dentro de um browser� Cria-se uma classe que derive JApplet para conter

os objetos gráficos� Adição de objetos gráficos é semelhante à utilizada

com Jframes

� Deve-se sobrepor os métodos:

Prof. Rômulo SilvaProf. Rômulo Silva

� Deve-se sobrepor os métodos:� void init(): inicialização de componentes do applet� void start(): o que fazer quando o applet iniciar� void stop(): o que fazer antes de parar � void destroy(): o que fazer quando o applet terminar

Page 263: Cur So Java

Applet – ciclo de vida

Prof. Rômulo SilvaProf. Rômulo Silva

Page 264: Cur So Java

Applet - exemploimport javax.swing.*;import java.awt.*;

public class TesteApplet extends JApplet {

public TesteApplet(){}

public void init() {

Chamado automaticamente pelo browser

Prof. Rômulo SilvaProf. Rômulo Silva

public void init() {Container c = this.getContentPane();c.setLayout(new FlowLayout());c.add(new JLabel("Nome"));c.add(new JTextField("Joao da Silva"));setSize(300,130);

}}

Page 265: Cur So Java

Applets - observações

� Um Applet possui várias restrições por razões de segurança:� Não pode ler/escrever arquivos na máquina

cliente� Não pode iniciar a execução de um programa na

máquina cliente

Prof. Rômulo SilvaProf. Rômulo Silva

máquina cliente� Não tem acesso a maior parte das propriedades

do sistema.

� Essas restrições só podem ser alteradas com permissão do cliente

Page 266: Cur So Java

Exercícios

� 1- Faça um programa utilizando os componentesSwing e gerenciadores de leiaute adequadospara obter-se uma tela como abaixo:

Prof. Rômulo SilvaProf. Rômulo Silva

Page 267: Cur So Java

Exercícios

� 2- Implemente o tratamento de eventos para os botões da seguinte forma:� Ao pressionar Copiar, o conteúdo do JTextField é adicionado

ao JTextPane� Ao pressionar Limpar, o conteúdo do JTextField é limpado

� Ao pressionar sair, a aplicação termina a execução

Prof. Rômulo SilvaProf. Rômulo Silva

� Ao pressionar sair, a aplicação termina a execução

Page 268: Cur So Java

Exercícios

� 3-Altere o programa do exercício anterior para que seja exibida uma tela como abaixo:Na área indicada da figura devem ser exibidos os formulários 1 e 2 conforme se pressiona os botões à esquerda. O formulário 1 deve ser exatamente a tela mostrada no exercício 1. O formulário 2 deve ser conforme a apresentação abaixo. (Sugestão: pesquise sobre o gerenciador de leiaute CardLayout).

Prof. Rômulo SilvaProf. Rômulo Silva

gerenciador de leiaute CardLayout).

Formulário 1

Formulário 2

Área de exibição de Formulários

Page 269: Cur So Java

Interfaces Gráficas Interfaces Gráficas de Usuário de Usuário --

Prof. Rômulo SilvaProf. Rômulo Silva

de Usuário de Usuário --complementoscomplementos

Page 270: Cur So Java

Principais Eventos e respectivos Listeners

Prof. Rômulo SilvaProf. Rômulo Silva

Page 271: Cur So Java

Classes Adaptadoras

� Alguns listeners especificam vários métodos� Ex.: WindowListener

• windowActivated(WindowEvent e)

• windowClosed(WindowEvent e)

• windowClosing(WindowEvent e)

• windowDeactivated(WindowEvent e)

Prof. Rômulo SilvaProf. Rômulo Silva

• windowDeactivated(WindowEvent e)

• windowDeiconified(WindowEvent e)

• windowIconified(WindowEvent e)

• windowOpened(WindowEvent e)

� Porém, muitas vezes a aplicação necessita tratar apenas um ou alguns métodos especificados na interface listener.

Page 272: Cur So Java

Classes Adaptadoras

� Usadas quando precisa-se implementar apenas alguns métodos especificados pelo listener

� Java fornece classes adaptadoras prontas para alguns listeners.

Prof. Rômulo SilvaProf. Rômulo Silva

� Padrão de nome: � WindowListener -> WindowAdapter� MouseListener -> MouseAdapter� KeyListener -> KeyAdapter� ...

Page 273: Cur So Java

Classes Adaptadoras

� Implementam a interface Listenercorrespondente, tal que todos os métodos têm implementação vazia, isto é, { }

� Maneira de usar: criar classe para

Prof. Rômulo SilvaProf. Rômulo Silva

� Maneira de usar: criar classe para tratamento de evento fazendo herança da classe adaptadora� E implementar apenas os métodos pertinentes à

aplicação sendo desenvolvida.

Page 274: Cur So Java

Classes Adaptadoras – exemplo

public class MinhaAplicacao extends JFrame {

...

this.addWindowListener(new TrataEventoJanela());

...

}

Prof. Rômulo SilvaProf. Rômulo Silva

// em outro arquivopublic class TrataEventoJanela extends WindowAdapter {

public void windowClosed(WindowEvent e) {

// aqui implementa-se o tratamento desejado

...

}

}

Page 275: Cur So Java

Classes Internas

� É uma classe definida dentro de outra classe, ou localmente dentro de um método

� Deve ser usada com critério, para evitar criação de códigos de difícil legibilidade

Prof. Rômulo SilvaProf. Rômulo Silva

criação de códigos de difícil legibilidade

� Principal uso: tratamento de eventos de interfaces gráficas de usuário

Page 276: Cur So Java

Classes Internas - esquema

public class ClasseExterna {public ClasseExterna() { // construtor

...}...

private ClasseInterna {

Prof. Rômulo SilvaProf. Rômulo Silva

private ClasseInterna {public ClasseInterna() { // construtor

...}

...} // fim de ClasseInterna

} // fim de ClasseExterna

Page 277: Cur So Java

Classe Interna - exemplopublic class MinhaAplicacao extends JFrame {

public MinhaAplicacao() {// construtor

...

JButton btn = new JButton(“OK”);

btn.addActionListener( new TrataEventoBotal());

...

}

Prof. Rômulo SilvaProf. Rômulo Silva

// ainda dentro da classe MinhaAplicacao…private class TrataEventoBotao implements

ActionListener {

...

public void actionPerformed(ActionEvent e) {

...

}

}// fim da classe TrataEventoBotao

}// fim da classe MinhaAplicacao

Page 278: Cur So Java

Classe Internas - observações

� A classe interna pode ser declarada como private, protected, public ou sem nada (“package”)� private: apenas a classe externa pode instanciar

objetos da classe interna� public: outras classes podem instanciar objetos

Prof. Rômulo SilvaProf. Rômulo Silva

� public: outras classes podem instanciar objetos da classe interna

� protected: somente a classe externa e as derivadas da classe externa podem instanciar objetos da classe interna

� “package”: todas as classe no mesmo pacote podem referenciar a classe interna

Page 279: Cur So Java

Classes Internas - Observações

� Classe interna tem acesso direto aos atributos e métodos da classe externa

� Instanciação de classe interna:Externa e = new Externa(…);

Prof. Rômulo SilvaProf. Rômulo Silva

Externa e = new Externa(…);Externa.Interna obj = e.new Interna(…);

� Se definida dentro de um método não pode fazer uso dos modificadores public, protected e private.

Page 280: Cur So Java

Classes Anônimas

� É uma classe interna sem nome, declarada dentro de um método, mais precisamente dentro de uma instrução

� A classe só existe dentro do escopo do método

Prof. Rômulo SilvaProf. Rômulo Silva

método

� Usada quando o objeto será criado uma única vez

� Uso mais comum: tratamento de eventos de interfaces gráficas

Page 281: Cur So Java

Classes Anônimas

� Podem ser criadas a partir de uma interface ou classe abstrata declarada anteriormente

c.metodoClasseC( new XXX() {//aqui vem os métodos da classe anônima

Prof. Rômulo SilvaProf. Rômulo Silva

//aqui vem os métodos da classe anônima});

� onde XXX é interface ou classe abstrata

Page 282: Cur So Java

Classes Anônimas - exemplopublic class MinhaAplicacao extends JFrame {

private JTextField txt;private JButton btn;public MinhaAplicacao() {

...txt = new JTextField(“”);btn = new JButton(“OK”);btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

interface

Prof. Rômulo SilvaProf. Rômulo Silva

public void actionPerformed(ActionEvent e) {txt.setText(“Tudo ok!!”);

}} );

...} // fim construtor de Minhaplicacao

...

} classe anônima

Page 283: Cur So Java

Classes Anônimas – outro exemplo

public class MinhaAplicacao extends JFrame {public MinhaAplicacao() {

...JTextField txt = new JTextField(“”);txt.addKeyListener(new KeyAdapter() {

public void keyTyped(KeyEvent e) {...

}

classe abstrata

Prof. Rômulo SilvaProf. Rômulo Silva

}} );

...} // fim construtor de Minhaplicacao

...

}

Page 284: Cur So Java

JDBC (Java Database Connection)

� Interface para conexão com bancos de dados baseado em SQL

� Para usá-lo é preciso ter um driver JDBC� O driver é uma implementação de interfaces que

fazem parte da especificação JDBC feita pela Sun.

Prof. Rômulo SilvaProf. Rômulo Silva

Sun.� Em geral os fabricantes dos diversos bancos de

dados (Oracle, SQL Server, MySQL, …) implementam drivers JDBC

� Pacotes principais: •java.sql

•javax.sql

Page 285: Cur So Java

Pacote java.sql

� Principais Interfaces:� SQLInput� SQLOutput� Driver� Connection

Prof. Rômulo SilvaProf. Rômulo Silva

� ResultSet� Statement� PreparedStatement� CallableStatement

Page 286: Cur So Java

JDBC – gerenciador de drivers

� DriverManager� Provê métodos estáticos para:

• Retornar um Driver

• Estabelcer uma conexão

• Registrar um driver

Prof. Rômulo SilvaProf. Rômulo Silva

Page 287: Cur So Java

JDBC – drivers mais comuns

SGBD Nome do driver JDBC Formato de URL

MySQL com.mysql.jdbc.Driver jdbc:mysql://nomeHost/nomeBanco

ORACLE oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@nomeHost:nroPorta:nomeBanco

Prof. Rômulo SilvaProf. Rômulo Silva

DB2 COM.ibm.db2.jdbc.net.DB2Driver jdbc:db2:nomeHost:nroPorta/nomeBanco

Sybase com.sybase.jdbc.SybDriver jdbc:sybase:Tds:nomeHost:nroPorta/nomeBanco

Page 288: Cur So Java

JDBC – exemplo de utilização

String driver = “com.mysql.jdbc.Driver”;

String db_URL = “jdbc:mysql://localhost/dbPessoa”;

Class.forName(driver); // carrega driver

Connection con = DriverManager.getConnection(db_URL,

“usuario”, “senha”);

Statement cmd = con.createStatement();

Prof. Rômulo SilvaProf. Rômulo Silva

Statement cmd = con.createStatement();

ResultSet rs = cmd.executeQuery(“SELECT nome, idade

FROM Pessoa”);

while( rs.next()) { // imprime resultado da consulta

System.out.println(rs.getString(“nome”));

System.out.println(rs.getInt(“idade”));

}