Upload
haron-martins
View
357
Download
1
Embed Size (px)
Citation preview
Desenvolvimento Desenvolvimento Orientado a Objetos Orientado a Objetos
em Javaem Java
Prof. Rômulo SilvaProf. Rômulo Silva
em Javaem Java
Fev/2010
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
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
Capítulo 1 - Introdução
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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
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)
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.
Plataforma Java
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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
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
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!!
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
Capítulo 3 – Criando a Primeira Aplicação Java
Prof. Rômulo SilvaProf. Rômulo Silva
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");
}
}
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
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
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, ...)
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
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.
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”.
Capítulo 4 – Tipos Primitivos
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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;
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
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
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
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)
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
Importante
� Strings em Java são objetos e não tipos primitivos !!!
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
Capítulo 5 –Controle de Fluxo
Prof. Rômulo SilvaProf. Rômulo Silva
Comando if
� Sintaxe: � if(expressão-booleana)
bloco1else
bloco2
Prof. Rômulo SilvaProf. Rômulo Silva
� O bloco else é opcional
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;
}
Expressão booleana
� Operadores de comparação:� ==, !=, >, >=, <, <=
� Conectores lógicos:� && (AND)
Prof. Rômulo SilvaProf. Rômulo Silva
� && (AND)� || (OR)� ! (NOT)
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
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);
}
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);
}
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)
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
}
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 ");
}
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");
}
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;
}
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
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");
}
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
Capítulo 6 Capítulo 6 ––Classes e Classes e ObjetosObjetos
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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)
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
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
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
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
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
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
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)
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
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
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
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
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
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
Capítulo 7 Capítulo 7 –– ArraysArrays
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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
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
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]);
}
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
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
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
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
}
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);
}
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.
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
Capítulo 8 Capítulo 8 –– Orientação a Orientação a ObjetosObjetos
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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
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
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
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
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
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
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();
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
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
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
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
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
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)
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
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
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();
}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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.
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;
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 {
...
}
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
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;
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
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
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;
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
}
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
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
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
...
}
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
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.
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();
}}
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
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;}
...
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.
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;
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?
Capítulo 10 Capítulo 10 –– Classes Classes Abstratas e InterfacesAbstratas e Interfaces
Prof. Rômulo SilvaProf. Rômulo Silva
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()
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
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
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
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}
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 { ...}
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.
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
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
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
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
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
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
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
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
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.
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();
}
...
}
}
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)
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.
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.
Capítulo 11 Capítulo 11 –– Tratamento Tratamento de Exceçõesde Exceções
Prof. Rômulo SilvaProf. Rômulo Silva
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
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.
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...}
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
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
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");
}
}
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
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.
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
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
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
...
}
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.
finally
try {
...
}
catch(TipoExcecao1 e) {
...
}
...
Prof. Rômulo SilvaProf. Rômulo Silva
...
catch(TipoExcecaoN e) {
...
}
finally {
//bloco sempre executado
...
}
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.
Capítulo 12 Capítulo 12 –– CollectionsCollections
Prof. Rômulo SilvaProf. Rômulo Silva
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.
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()
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
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
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
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)
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
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
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");
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");
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)
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.
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 >
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);
}
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--];
}
}
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();
…
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
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!!!
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.
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);
}
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
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)
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)
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)
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()
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
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
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
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
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
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
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()
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();
...
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
Streams de bytes
InputStream
FileInputStream
ByteArrayInputStream
OutputStream
FileOutputStream
ByteArrayOutputStream
Prof. Rômulo SilvaProf. Rômulo Silva
FilterInputStream
BufferedInputStream
FilterOutputStream
BufferedOutputStream
Streams de Caracteres
Writer
OutputStreamWriter
BufferedWriter
Reader
InputStreamReader
BufferedReader
Prof. Rômulo SilvaProf. Rômulo Silva
FileWriterFileReader
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
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
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()
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
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()
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
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");}
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");
}
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
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");
}
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.
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.
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
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
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
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
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)
Swing - Componentes
� Principais componentes:� JLabel
� JTextField
� JButton
� JRadioButton
Prof. Rômulo SilvaProf. Rômulo Silva
� JCheckBox
� JComboBox
� JList
� JPanel
Swing - Componentes
Prof. Rômulo SilvaProf. Rômulo Silva
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
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();
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
Swing - exemplo
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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();
}
}
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
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();}
}
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
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
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();}
}
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.
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
Swing – mais Leiautes
� BoxLayout
� GridBagLayout
� CardLayout
Prof. Rômulo SilvaProf. Rômulo Silva
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
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
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 > >
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.
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
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
}
}
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
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
Principais eventos, Listeners e seus métodos
Prof. Rômulo SilvaProf. Rômulo Silva
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
Applet – ciclo de vida
Prof. Rômulo SilvaProf. Rômulo Silva
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);
}}
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
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
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
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
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
Principais Eventos e respectivos Listeners
Prof. Rômulo SilvaProf. Rômulo Silva
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.
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� ...
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.
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
...
}
}
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
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
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
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
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.
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
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
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
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
...
}
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
Pacote java.sql
� Principais Interfaces:� SQLInput� SQLOutput� Driver� Connection
Prof. Rômulo SilvaProf. Rômulo Silva
� ResultSet� Statement� PreparedStatement� CallableStatement
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
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
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”));
}