Você está na página 1de 53

Programao Orientada a

Objetos Utilizando Java

Relevncia e Motivao
Tcnicas a serem utilizadas na prtica
Desenvolver software de qualidade
Impacto econmico e social

Pedro de Alcntara dos Santos Neto


e-mail: pasn@ufpi.edu.br
Home Page: http:// www.ufpi.br/pasn

Objetivos
Discutir aspectos de qualidade e
modularidade de software
Introduzir conceitos de POO e Java
Indicar como programas em Java podem
ser adequadamente escritos e
estruturados
Utilizar ambientes de programao em
Java
Desenvolver uma aplicao de mdio
porte

Qualidade do Software

Impacto Econmico e Social


Segurana de pessoas
Disponibilidade de servios essenciais
Competitividade: produtores/consumidores
Melhores produtos a um menor custo

Crise de Software
25% dos projetos so cancelados
O tempo de desenvolvimento bem
maior do que o estimado
75% dos sistemas no funcionam como
planejado
A manuteno e reutilizao so
difceis e custosas

Cancelamentos
10240
5120
2560
1280
640
320
160
80
40
20
10
0

10

20

30

40

50 %

Atrasos
10240
5120
2560
1280
640
320
160
80
40
20
10
0

Causas da Crise

Planejado

Essncias e Acidentes
M qualidade das linguagens,
ferramentas e metodologias
Complexidade dos sistemas
Dificuldade de formalizao

Real

10

20

30

40

50

60

Meses

Impacto de Qualidade em
Manuteno

Qualidade do Software

Correo
Robustez
Extensibilidade
Reusabilidade
Compatibilidade

Eficincia
Portabilidade
Testabilidade
Integridade
Adequao ao uso

70% do custo de software corresponde


a manuteno
Essncia: modificao de requisitos
Acidente: depurao

Manuteno

Melhorias
9%
Debugging
12%
Urgncias
12%

Hw Outros
3%
6%

Programao
record Pessoa
nome : string;
idade : integer;
end
procedure aniversario
begin
.....

Requisitos
41%

Formato
dos Dados
17%

nome idade nascimento


abstrao

Pedro 25

14/11/1974

formalizao

Objeto Conta Bancria

Programao Orientada a Objetos


Foco nos dados (objetos) do sistema,
no nas funes
Estruturao do programa baseada
nos dados, no nas funes
As funes mudam mais do que os
dados

Crdito

Saldo

Nmero

875,32

21.342-7

Dbito

Estados do Objeto Conta

Histrico de JAVA
Iniciou como uma linguagem de
programao para equipamentos
eletrnicos (microondas, PDAs, ...)
Inicialmente denominada OAK

Crdito

Crdito

Saldo

Nmero

Saldo

Nmero

875,32 21.342-7

875,32 21.342-7
Dbito

Dbito

Crdito(20)

Crdito

Crdito

Saldo

Nmero

Saldo

Nmero

895,32 21.342-7

Pequena, confivel e portvel

875,32 21.342-7
Dbito

Dbito

Uma Linguagem Moderna

Java
Java uma linguagem simples, orientada
a objetos, distribuda, interpretada,
robusta, segura, independente de
arquitetura, portvel, de alto
desempenho, suportando multithreads e
dinmica.
Sun Microsystems, 1995

Ideal para a Internet !


Sua afirmao se deu com o
surgimento do HotJava

Java Simples
Sintaxe familiar a vrios programadores
(baseada em C e C++)
Elimina vrias redundncias de C++
Simples para algumas aplicaes,
desde que se conhea alguns pacotes
Simples dado tudo que a linguagem
oferece

Java Eliminou...
Variveis e funes globais
Ponteiros
goto, struct e union
Nmero varivel de argumentos
Tipos fracos
Remoo de objetos
Classes parametrizadas!

Java Orientada a Objetos


Objetos e Classes
Encapsulamento de dados e operaes
Subtipos e Herana
Polimorfismo
Ligaes dinmicas (dynamic binding)
Criao e remoo dinmica de objetos

Implementaes de Java

Interpretada
Bytecodes da JVM
Independente de plataforma

Compilada

Alta performance?

Cdigo nativo em C ou C++

Java Portvel
Em tese, reduo de custos com
migrao, instalao, treinamento, etc.
Na prtica, ainda necessrio depurar
programas antes de migrar para outra
plataforma

Java Distribuda
Oferece suporte de alto nvel para
acesso a Internet / WWW (pacote
java.net)
Objetos distribudos com RMI e CORBA
Suporte para acesso a arquivos
remotos, banco de dados, etc.

Java Robusta
Ausncia de ponteiros
Fortemente tipada
Coleta de lixo automtica
Excees tipadas
Acesso a arrays verificado
Variveis so inicializadas
automaticamente

Programa em Java

Formado por 3 elementos

Compilando e Executando

Declarao de Pacotes
Utilizao de imports
Definies de classes

O Programa HelloWorld

javac NomedaClasse.java
Gerao de um arquivo .class

Execuo:
java NomedaClasse Argumentos

class HelloWorld {
public static void main (String args[]){
System.out.println(Hello World!);

Compilao:

Execuo de um Applet:
appletviewer ArquivoHtml.html

Compilando e Executando

Palavras Chaves
abstract, boolean, break, byte, case, catch,
char, class, const, continue, defalt, do ,
double, else, extends, false, final, finally, float,
for, goto, if, implements, import, intanceof, int,
interface, long, native, new, null, package,
private, protected, public, return, short, static,
super, switch, syncronized, this, throw,
throws, transient, true, try, void, volatile, while

Use uma IDE


Eclipse (recomendado)
NetBeans

Identificadores
Nomear variveis, mtodos, classes e
labels.
No pode ser palavra reservada e deve
iniciar com letra, $ ou _.

louco
intGrande
$valor1
3_variavel
!verdade

// vlido
// vlido
// vlido
// invlido
// invlido

Tipos de Dados Primitivos

Tipos Numricos:
byte bt = 100;
short st = -4;
int it = 10;
long lg = 300L;
float ft = 2.5;
double db = 6.5e10;

// -128..+127
// -32768..+32767
// -231..+231-1
// -263..+263-1
// 32bit
// 64bit

Tipos de Dados Primitivos

Caracteres e Cadeias (strings)

Tipos de Dados Primitivos

\b
\f
\n
\r
\t
\\
\
\
\xhh

char ch = a;
// caracter
char ch1 = 48
// caracter a
Integer val = a; // caracter com int
String st = Tipo; // cadeia de carac.
char hx = 0xA;
// valor hexadec 10
String b = Hello Java!\n;
// ?
String c = Falaram \Hello Java!\; // ?

Tipos de Dados Primitivos

+
*
/
%
++
--

Tipo boolean

Matrizes
Declarao (int inteiros[]; double d[];)
Construo (inteiros=new int[5];)
Inicializao
inteiros[1]=1; inteiros[2]=2;

Operadores Comparativos
==
!=
<
>
<=
>=
&&
||

if (a==3) {...}
if (a!=5) {...}
t = a < b;
x = a > b;
if (a<=b) {...}
j = ~a >= b;
if (a=0 && b=2)
if (a<3 || c>=5)

Igual
no igual
menor
maior
menor igual
maior igual
AND
OR

backspace
formfeed
newline
car return
tab
\

hexadecimal

Operadores Matemticos

boolean souGrande=true;
boolean verdadefalsa=false;

Cdigos de escape para caracteres

a=a+1
b=b-1
c=c*2
d=d/4
e=e%2
f=-f
a++
b--

adio
subtrao
multiplicao
diviso
resto
negao
incremento
decremento

Exerccio em Sala

Crie um pequeno programa em Java


para testar as expresses anteriores,
utilizando as variveis a e b, com
valores 3 e 6, respectivamente.

Operadores Binrios
~
&
|
^
<<
>>

a=~a;
a=a&0x22;
a=a|b;
a=a^b;
a=<<a;
a=a<<2;

complemento binrio
AND
OR
XOR
deslocamento esquerda
deslocamento direita

Exerccio em Sala
Faa um pequeno programa em Java para
testar o funcionamento dos operadores
binrios

Fluxo de Controle (if .. else)


class TernarioComIf {
public static void main(String args[]) {
short v1 = 10, short v2 = 5, menor=0;
if(v1<v2)
menor=v1;
else
menor=v2;
System.out.println(menor);
}
}

O Operador Ternrio (?)

O Operador Ternrio (?)


a = x ? b : c;

class Ternario {
public static void main(String args[]) {
short v1 = 10;
short v2 = 5;
short menor;
menor = (v1 < v2)? v1 : v2;
System.out.println(menor);
}
}

Switch (teste de mltipla escolha)


class SwitchApp {
public static void main(String args[]) throws Exception{
System.out.println(Tecle opcao);
char opt = (char)System.in.read();
switch (opt) {
case 1: System.out.println(Nada...);
break;
case s: case S:
System.out.println(Sim);
break;
case n: case N:
System.out.println(No); break;
default:
System.out.println(Erro); break;
}
}
}

Enquanto (While)

Faa .. Enquanto (Do .. While)

class Whileapp {
public static void main(String args[]) throws Exception{
System.out.println(Tecle um nmeral:);
char nu = (char)System.in.read();
while (nu <> 5) {
System.out.println(Tente novamente);
System.out.println(Tecle nmeral:);
nu = (char)System.in.read();
}
System.out.println(Acertou!!!!);
}
}

class DoWhileApp {
public static void main(String args[])
throws Exception {
char lt;
do {
System.out.println(Tecle uma letra:);
lt = (char)System.in.read();
} while ( c != f);
System.out.println(Acertou!!!!);
}
}

Para (For)
class testeArgs {
public static void main(String args[]) {
int i;
System.out.println(args.length);
for(i=0;i<args.length;i++)
System.out.println(args[i]);
}
}

Classes e Objetos

class ForLoopApp {
public static void main(String args[]) {
for (int i = 0; i < 10; i++) {
if (i == 7) continue;
// retorna ao for 1
System.out.println(for 1: i= + i);
}
System.out.println(for 1 final i= + i);
for (i = 10; i > 0; i--) {
if (i == 3) break;
// sai do for 2
System.out.println(for 2: i= + i);
}
System.out.println(for 2 final: i= + i);
}
}

Classe de Contas

Objetos
mtodos + atributos
estado encapsulado

Para (For)

Classes
Agrupamento de objetos do mesmo tipo

Crdito

Crdito

Saldo

Nmero

Saldo

Nmero

875,32

21.342-7

875,32

21.342-7

Dbito

Dbito

Classe de Contas: Assinaturas


class Conta {
void credito (double valor) {}
void debito (double valor) {}
String numero() {}
double saldo() {}
Conta (String n) {}
}

Classe de Contas: Descrio


class Conta {
private String numero;
private double saldo;
void credito (double valor)
{saldo = saldo + valor;}
void debito (double valor)
{saldo = saldo - valor;}
String numero() {return numero;}
double saldo() {return saldo;}
Conta (String n) {numero = n; saldo = 0;}
}

Criao Dinmica de Objetos


...
Conta conta1;
conta1 = new Conta(21.342-7);
conta1.credito(500.87);
conta1.debito(45.00);
System.out.println(conta1.saldo());
....

Descries de Classes
Componentes abertos e fechados
Podem ser facilmente estendidos,
sem alterar os sistemas
Podem ser prontamente utilizados
para construir sistemas

Classe de Bancos: Assinatura


class Banco {
void cadastro(Conta c) {}
void credito(String num, double val) {}
void debito(String num, double val) {}
double saldo(String num) {}
void transfere(String d, String p, double v) {}
Banco () {}
}

Classe de Bancos: Descrio


private Conta procurar(String n) {
int
i = 0;
boolean achou = false;
while ((! achou) && (i < indice)) {
if (contas[i].numero() == n) achou = true;
else i = i + 1;
}
if (achou == true) return contas[i];
else return null;
}

Classe de Bancos: Descrio


class Banco {
private Conta[]
private int

contas;
indice = 0;

void cadastro(Conta c) {
contas[indice] = c;
indice = indice + 1;
}

Classe de Bancos: Descrio


void debito(String num, double val) {
Conta
c;
c = this.procurar(num);
if (c != null)
c.debito(val);
else
System.out.println("Conta Inexistente!");
}

Classe de Bancos: Construtor

Banco( ) ?
Construtor da Classe
Inicializao de um objeto da classe
Caso no sejam declarados construtores,
utiliza-se o construtor default

Banco( ) {
contas=new Conta[50];
}

Exerccio em Sala
Completar a implementao da
classe Banco com o construtor e os
mtodos transfere e saldo.
Implementar um programa principal
que crie objetos das classes
definidas, testando sua utilizao.

Lista de Contas: Assinatura

Quais so os mtodos necessrios?


class ListaDeContas {
void inserir (Conta c) {}
void retirar (Conta c) {}
Conta procurar (String num) {}
}

Mais Sobre Construtores

Mltiplos Construtores
Overloading (Sobrecarga)
public class Circulo {
double x, y, r;
Circulo(double x, double y, double r) {
this.x=x; this.y=y; this.r=r; }
Circulo(double r) {x=0.0; y=0.0; this.r=r;}
Circulo(Circulo c) {x=c.x; y=c.y; this.r=c.r;}
Circulo() {x=0.0; y=0.0; r=0.0;}
}

Lista de Contas
null

Listas de Contas: Descrio


class ListaDeContas {
private Conta conta;
private ListaDeContas prox;
void inserir (Conta c) {
if (this.conta == null) {
this.conta = c;
prox = new ListaDeContas();
} else prox.inserir(c);
}

Listas de Contas: Descrio


void retirar (Conta c) {
if (conta != null) {
if (conta == c) {
this.conta = prox.conta;
this.prox = prox.prox;
} else prox.retirar(c);
}
}

Listas de Contas: Descrio


Conta procurar (String num) {
if (conta == null) return null;
else {
if (conta.numero() == num)
return conta;
else return prox.procurar(num)
}
}

Banco: Descrio Modular


class BancoModular {
private ListaDeContas;
void cadastro(Conta c) {contas.inserir(c);}
void debito(String num, double val) {
Conta
c;
c = contas.procurar(num);
if (c != null)
c.debito(val);
else
System.out.println("Conta inexistente!");
}

Exerccio em Sala
Completar a implementao da classe
BancoModular com os mtodos
transfere e saldo.
Compare as duas implementaes de
bancos: Banco e BancoModular. Quais
as vantagens e desvantagens de cada
abordagem?

Dever de Casa 1

Dever de Casa

Desenvolva um sistema simples para


controle de estoque, contendo pelo
menos as classes Produto e Estoque, e
as seguintes operaes: alterar as
propriedades dos produtos (nome,
preo, quantidade em estoque), retirar
um produto do estoque, e verificar que
produtos precisam ser repostos.

Dever de Casa 2

Defina em Java uma classe Pilha, de


pilhas de inteiros, tendo mtodos para
realizar as seguintes operaes:
push, insere um dado elemento no topo da
pilha;
top, d como resultado o elemento que
est no topo da pilha;
pop, retira o elemento que est no topo da
pilha..

Tipos de Mdulos em Java

Pacotes e Diretrios

Cada pacote associado a um diretrio do


sistema operacional
Os arquivos neste diretrio tm o mesmo
cabealho:
package nome_do_pacote;
Cada arquivo define uma ou mais classes
que fazem parte do pacote
Subdiretrios no correspondem a
subpacotes

Nomeando Pacotes

public

Modificadores de Acesso

private
atributos, mtodos e inicializadores
declarao s pode ser utilizada na classe
onde ela introduzida

Protected
atributos, mtodos e inicializadores
declarao s pode ser utilizada no pacote
onde ela introduzida, ou nas subclasses
da classe onde ela introduzida

atributos, mtodos, inicializadores e


classes
declarao pode ser utilizada ( visvel) em
qualquer lugar

O nome de um pacote deve ser parte


do nome do seu diretrio associado:
o pacote exemplos.banco, deve estar no
diretrio /home/pasn/java/exemplos/banco,
assumindo que o compilador Java foi
informado para procurar pacotes em
/
home/pasn/java

Modificadores de Acesso

Classes
agrupam definies de mtodos, atributos,
inicializadores, etc.
definem tipos
Pacotes
agrupam definies de classes
relacionadas
estruturam sistemas de grande porte,
facilitando a localizao das classes
oferece um maior nvel de abstrao: h
mais classes do que pacotes

default
atributos, mtodos, inicializadores e
classes
declarao s pode ser utilizada no pacote
onde ela introduzida

Importao de Pacotes

Importando definio de tipo especfica:


package segundo.pacote;
import primeiro.pacote.NomeDoTipo;

Importando todas definies pblicas:


package segundo.pacote;
import primeiro.pacote.*;

Pacotes da Biblioteca Java


Acesso a Internet e WWW (java.net)
Applets (java.applet)
Definio de interfaces grficas
(java.awt)
Suporte a objetos distribudos (java.rmi)
Interface com Banco de Dados
(java.sql)
Bsicos: threads e manipulao de
strings (java.lang), arquivos (java.io),
utilitrios de propsito geral (java.util)

Importao de Pacotes: Detalhes


Tanto NomeDoTipo quanto
primeiro.pacote.NomeDoTipo podem
ser usados no corpo de
segundo.pacote
segundo.pacote no pode definir um
tipo com nome NomeDoTipo
Importao de pacotes no transitiva
nem distribui sobre os arquivos de um
pacote

Outros Modificadores de Acesso

Outros Modificadores de Acesso

Static

Classes, Mtodos e Variveis


Construes Finais no podem ser
mudadas
Variveis: Constantes
Classes: No podem ser estendidas
Mtodos: No podem ser redefinidos

Outros Modificadores de Acesso

Mtodos e Variveis
Construes Estticas so associadas a
uma classe e no a instncias da classe
class Estatica {
static int x=0;
Estatica() { x++;}
}

Final

Static
Variveis estticas podem ser
referenciadas atravs de qualquer
instncia da classe ou atravs do nome
da classe. Ex:
1. Estatica e1 = new Estatica();
2. Estatica e2 = new Estatica();
3. e1.x = 100;
4. e2.x = 200;
5. Int OutroX = Estatica.x;

Exerccio em Sala

Outros Modificadores de Acesso

Static

Toda aplicao deve conter um mtodo


esttico.

Estruture o exemplo de contas e


bancos utilizando pacotes

Mtodos estticos s podem acessar


variveis estticas e outros mtodos
estticos.
Para acessar variveis no estticas ou
mtodos no estticos deve-se instanciar
uma classe.

Dever de Casa 3

Dever de Casa

Estruture o sistema de controle de


estoque usando pacotes
Implemente a classe Estoque usando a
classe Vector ou a classe Hashtable
(ambas do pacote java.util).

OBS: Verifique no help quais so os


construtores da classe e os mtodos a
serem utilizados !

Objeto Poupana

Estados do Objeto Poupana


Crdito(20)

Crdito

Crdito

Crdito

Crdito

Crdito
Saldo

Nmero

875,32

21.342-7

Saldo

Nmero

875,32

21.342-7

Saldo Nmero
R. Juros

Saldo

Nmero

875,32 21.342-7

Dbito

R. Juros

875,32 21.342-7
Dbito
Dbito

Dbito

Crdito
Saldo Nmero

Saldo

Nmero

895,32 21.342-7

R. Juros

875,32 21.342-7
Dbito
Dbito

Estados do Objeto Poupana


R.Juros(0.01)
Crdito

Crdito

Crdito
Saldo Nmero

Saldo

Crdito

Nmero

875,32 21.342-7

R. Juros

875,32 21.342-7

Saldo Nmero

Saldo

Nmero

884,07 21.342-7

Dbito
Dbito

R. Juros

875,32 21.342-7
Dbito
Dbito

Classe de Bancos: Assinatura


class BancoD {
void cadastro_conta(Conta c) {}
void cadastro_poupanca(PoupancaD p) {}
void credito_conta(String num, double val) {}
void credito_poupanca(String num, double
val) {}
...
BancoD () {}
}

Classe de Bancos: Descrio


void cadastro_conta(Conta c) {
contas[indicec] = c;
indicec = indicec + 1;
}
void cadastro_poupanca(PoupancaD p) {
poupancas[indicep] = p;
indicep = indicep + 1;
}

Classe de Poupanas: Descrio


class PoupancaD {
private String numero;
private double saldo;
void credito (double valor) {saldo = saldo +
valor;}
String numero() {return numero;}
...
void rende_juros (double t)
{this.credito(saldo * t);}
}

Classe de Bancos: Descrio


class BancoD {
private Conta[] contas;
private PoupancaD[] poupancas;
private int indicep, indicec = 0;

Classe de Bancos: Descrio


private Conta procura_conta(String n) {
int
i = 0;
boolean achou = false;
while ((! achou) && (i < indicec)) {
if (contas[i].numero() == n) achou = true;
else i = i + 1;
}
if (achou == true) return contas[i];
else return null;
} ...

Problemas

Duplicao desnecessria de cdigo:

Subtipos e Subclasses
Poupana

A definio de PoupanaD uma simples


extenso da definio de Conta
Clientes de Conta que precisam trabalhar
tambm com PoupanaD tero que ter
cdigo especial para manipular poupanas

Falta refletir relao entre tipos do


mundo real

Conta

Subclasses

Comportamento

Herana

Objetos da subclasse comportam-se como


os objetos da superclasse

Substituio

Reuso de Cdigo
A descrio da superclasse pode ser
usada para definir a subclasse

Extensibilidade

objetos da subclasse podem ser usados no


lugar de objetos da superclasse

algumas operaes da superclasse podem


ser redefinidas na subclasse

Classe de Poupanas: Assinatura

Classe de Poupanas: Descrio

class Poupanca
extends Conta {

class Poupanca
extends Conta {

void rende_juros(double t) {}
Poupanca (String num) {}

void rende_juros(double t) {
this.credito(this.saldo() * t);
}
Poupanca (String num) { super (num);}

}
}

Extends
subclasse extends superclasse
Mecanismo para definio de herana e
subtipos
Herana simples: s pode-se herdar
uma classe por vez

Extends: Restries
Atributos e mtodos privados so
herdados, mas no podem ser
acessados diretamente
Qualificador protected: visibilidade
restrita a classe e subclasses
Construtores no so herdados
Construtor default s disponvel se
tambm for disponvel na superclasse

Usando Poupanas
...
Poupanca poup;
poup = new Poupanca(21.342-7);
poup.credito(500.87);
poup.debito(45.00);
System.out.println(poup.saldo());
...

Subtipos: Substituio
...
Conta conta;
conta = new Poupanca(21.342-7);
conta.credito(500.87);
conta.debito(45.00);
System.out.println(conta.saldo());
...

Subtipos: Verificao Dinmica


com Casts
...
Conta conta;
conta = new Poupanca(21.342-7);
...
((Poupanca) conta).rende_juros(0.01);
conta.imprime_saldo();
...

Substituio e Casts
Nos contextos onde contas so usadas
pode-se usar poupanas
Nos contextos onde poupanas so
usadas pode-se usar contas com o uso
explcito de casts
Casts correspondem a verificao
dinmica de tipos e podem gerar
excees (Cuidado!)
Casts no fazem converso de tipos

Classe de Bancos: Assinatura

Subtipos: Substituio

class Banco {
void cadastro(Conta c) {}
void credito(String num, double val) {}
void debito(String num, double val) {}
double saldo(String num) {}
void transfere(String d, String p, double
v) {}
Banco () {}
}

...
Banco
banco = new Banco();
banco.cadastro(new Conta(21.345-7));
banco.cadastro(new
Poupanca(1.21.345-9));
banco.credito(21.345-7,129.34);
banco.transfere(21.345-7,1.21.345-9,
9.34);
System.out.print(banco.saldo(1.21.345-9));
...

Exerccio em Sala

Subtipos: Verificao Dinmica


com instanceof

Modifique a classe Banco para que seja


possvel render juros de uma
poupana. Isto , adicione um novo
mtodo que rende os juros da
poupana cujo nmero parmetro
deste mtodo; a taxa de juros corrente
deve ser um atributo de Banco.

Verificao Dinmica de Tipos

...
Conta c = this.procura(123.45-8);
if (c instanceof Poupanca)
((Poupanca) c).rende_juros(0.01);
else System.out.print(Poupana
inexistente!)
...

Objeto Conta Especial

Casts e instanceof:
((Tipo) varivel)
varivel instanceof Tipo
O tipo de varivel deve ser supertipo de
Tipo
Casts geram excees, instanceof retorna
false
Casts so essenciais para verificao
esttica de tipos (compilao)

Crdito

Saldo
R. Bnus

Nmero

875,32

Bnus

21.342-7 11,80

Dbito

Estados de uma Conta Especial


Dbito

Crdito
Crdito

Saldo

Nmero

Bnus

875,32

21.342-7

11,80

Saldo

875,32

Estados de uma Conta Especial

Crdito(20)

Nmero

21.342-7

Dbito

Saldo

895,32

R. Bnus

Dbito

Crdito
Crdito

Nmero

Saldo

21.342-7

875,32

Bnus

Nmero

12,00

21.342-7

Contas Especiais: Assinatura

Nmero

Bnus

21.342-7

11,80

Saldo

875,32

Dbito

Nmero

21.342-7

Crdito
Crdito

Saldo

Nmero

Bnus

887,12

21.342-7

0,00

Saldo

875,32

Nmero

21.342-7

R. Bnus

Contas Especiais: Descrio


class ContaEspecial
extends Conta {
private double

void rende_bonus() {}
double bonus() {}
void credito(double valor) {}
ContaEspecial (String num) {}

bonus;

void credito(double valor) {


bonus = bonus + (valor * 0.01);
super.credito(valor);
}

Contas Especiais: Descrio


void rende_bonus() {
super.credito(bonus);
bonus = 0;
}
double bonus() {return bonus;}
ContaEspecial (String num) {
super (num);
bonus = 0;
}

Saldo

875,32

R.Bnus()

R. Bnus

R. Bnus

class ContaEspecial
extends Conta {

Crdito
Crdito

Redefinio de Mtodos
Invarincia: tipos dos argumentos e
resultados da redefinio tem que ser
iguais aos tipos da definio
Semntica e Visibilidade dos mtodos
redefinidos deve ser preservada
S possvel acessar a definio dos
mtodos da superclasse imediata (via
super)

Usando Contas Especiais


...
ContaEspecial contae;
contae = new ContaEspecial(21.342-7);
contae.credito(200.00);
contae.debito(100.00);
contae.rende_bonus();
System.out.print(contae.saldo());
...

Ligaes Dinmicas
...
Conta conta;
conta = new ContaEspecial(21.342-7);
conta.credito(200.00);
conta.debito(100.00);
((ContaEspecial) conta).rende_bonus();
System.out.print(conta.saldo());
...

Ligaes Dinmicas
Dois mtodos com o mesmo nome e tipo:
definio e redefinio, qual usar?
O cdigo escolhido dinamicamente (em
tempo de execuo), no estaticamente
(em tempo de compilao)
Escolha feita com base na classe do
objeto associado varivel destino do
mtodo

Exerccio em Sala
Modifique a classe Banco, para que
seja possvel computar o bnus de uma
conta especial. Foi necessrio redefinir
algum mtodo de Banco? Justifique a
sua resposta.
Altere a classe Conta para que seja
possvel a emisso de extrados.

Dever de Casa 4

Dever de Casa

Modifique o sistema de controle de


estoque requisitado como exerccio
para poder tambm armazenar
produtos perecveis; isto , produtos
que tm um prazo de validade.
Modifique o sistema de controle de
estoque para manter um histrico de
vendas de determinados produtos.

Estados do Objeto Conta


Imposto

Objeto Conta Imposto

Dbito(20)
Crdito
Crdito

Crdito

Saldo

Saldo

Nmero

875,32

Nmero

21.342-7

Crdito

Saldo

Saldo

Nmero

875,32

21.342-7

875,00

Crdito

21.342-7

Dbito

Nmero

Saldo

Nmero

875,32

21.342-7

854,98

21.342-7

Dbito

Dbito

Conta Imposto: Assinatura


class ContaImposto {
void credito (double valor) {}
void debito (double valor) {}
String numero() {}
double saldo() {}
ContaImposto (String n) {}
}

Conta Imposto: Descrio


class ContaImpostoM
extends Conta {
void debito(double val) {
super.debito(val + (val * 0.001));
}
ContaImpostoM (String num) {super
(num);}
}

Conta Imposto: Assinatura


class ContaImpostoM
extends Conta {
ContaImpostoM (String num) {}
}

Subtipos e Subclasses
Conta Imposto

Conta

Subclasses e Evoluo de
Software

Subclasses e Comportamento
Objetos da subclasse comportam-se
como os objetos da superclasse
Redefinies de mtodos devem
preservar o comportamento (semntica)
do mtodo original
Grande impacto sobre manuteno/
evoluo de software...

Deveria ser possvel raciocinar sobre o


cdigo usando-se apenas a definio
dos tipos das variveis envolvidas
(Conta)
O comportamento do cdigo deveria ser
independente do tipo do objeto (Conta,
ContaEspecial, Conta Imposto)
associado a uma dada varivel em
tempo de execuo

Reuso sem Subtipos

Reuso preservando Subtipos


ContaAbstrata

Conta

Poupana

Conta

ContaImpostoM

ContaImposto

ContaEspecial
Poupanca

Definindo Classes Abstratas


abstract class ContaAbstrata {
protected String numero;
protected double saldo;
void credito (double valor) {
saldo = saldo + valor;
}
abstract void debito (double valor);
String numero() {return numero;}
double saldo() {return saldo;}
}

ContaEspecial

Classes Abstratas
Possibilita herana de cdigo preservando
comportamento (semntica)
Mtodos abstratos:
Geralmente existe pelo menos um
So implementados nas subclasses
No cria-se objetos:
Mas podem ter construtores, para reuso
Atributos qualificados como protected
para serem acessados nas subclasses

Contas: Descrio Modificada


class Conta
extends ContaAbstrata {

Poupanas: Descrio Original


class Poupanca extends Conta {
void rende_juros(double t) {
this.credito(this.saldo() * t);
}
Poupanca (String num) {
super (num);
}

void debito (double valor) {


saldo = saldo - valor;
}
Conta (String n) {numero = n; saldo = 0;}
}

Conta Especial: Descrio


Original
class ContaEspecial extends Conta {
private double bonus;
void credito(double valor) {
bonus = bonus + (valor * 0.01);
super.credito(valor);
}
...

Conta Imposto: Descrio


class ContaImposto
extends ContaAbstrata {
void debito(double val) {
saldo = saldo - (val + (val * 0.001));
}
ContaImposto (String num) {
numero = num; saldo = 0;
}
}

Classes Abstratas: Utilizao

Substituio e Ligaes Dinmicas


...
ContaAbstrata ca, ca;
ca = new ContaEspecial(21.342-7);
ca = new ContaImposto(21.987-8);
ca.debito(500);
ca.debito(500);
System.out.println(ca.saldo());
System.out.println(ca.saldo());
...

Herdar cdigo sem quebrar noo de


subtipos, preservando o
comportamento do supertipo
Generalizar cdigo, atravs da
abstrao de detalhes no relevantes
Projetar sistemas, definindo as suas
arquiteturas e servindo de base para a
implementao progressiva dos
mesmos

Exerccio em Sala

Dever de Casa

Modifique a classe Banco para


funcionar de modo semelhante aos
bancos do mundo real

Dever de Casa 5

Modifique o sistema de controle de


estoque requisitado como exerccio
para que no seja possvel vender
produtos fora do prazo de validade.

Auditor de Banco
class AuditorB {
private String

nome;

void investiga_banco(Banco b) {
if ((b.saldo_total() / b.num_contas()) > 500)
System.out.print ("Aprovado!");
else System.out.print ("No aprovado!");
}
}

Auditor de Banco Modular


class AuditorB {
private String

nome;

void investiga_banco(BancoModular b) {
if ((b.saldo_total() / b.num_contas()) > 500)
System.out.print ("Aprovado!");
else System.out.print ("No aprovado!");
}
}

Problema

Duplicao desnecessria de cdigo


O mesmo auditor deveria ser capaz de
investigar qualquer tipo de banco que
possua operaes para calcular
o nmero de contas, e
o saldo total de todas as contas.

Auditor Genrico
class Auditor {
private String

nome;

void investiga_banco(QQBanco b) {
if ((b.saldo_total() / b.num_contas()) > 500)
System.out.print ("Aprovado!");
else System.out.print ("No aprovado!");
}

Definindo Interfaces
interface QQBanco {
double saldo_total();
int num_contas();
}

Interfaces
Caso especial de classes abstratas...
Definem tipo de forma abstrata, apenas
indicando o nome e o tipo dos mtodos
suportados pelos objetos do tipo
Os mtodos so implementados pelos
subtipos (subclasses)
No tm construtores: no pode-se
criar objetos j que mtodos no so
definidos

Implements

classe implements interface1, interface2, ...


subtipo implements supertipo1, supertipo2, ...

Mltiplos supertipos: uma classe pode


implementar mais de uma interface
(contraste com classes abstratas...)
Classe que implementa uma interface
deve definir (no necessariamente
implementar!) os mtodos da interface

Subtipos sem Herana


class Banco
implements QQBanco {
...
}
class BancoModular
implements QQBanco {
...
}

Usando Auditores
Banco b = new Banco();
BancoModular bm = new
BancoModular();
Auditor a = new Auditor();
...
a.investiga_banco(b);
a.investiga_banco(bm);
...

Interfaces e Reusabilidade
Evita duplicao de cdigo atravs da
definio de um tipo genrico, tendo como
subtipos vrias classes no relacionadas
Tipo genrico pode agrupar objetos de
vrias classes definidas
independentemente, sem compartilhar
cdigo via herana, tendo implementaes
totalmente diferentes
Classes podem at ter mesma
semntica...

Subtipos com Herana


Mltipla
interface I
extends I1, I2, ..., In
{
... assinaturas de novos mtodos ...
}

Bancos: Parametrizao
class BancoIndependente {
private RepositorioDeContas contas;
void cadastro(Conta c) {contas.inserir(c);}
void debito(String num, double val) {
Conta
c;
c = contas.procurar(num);
if (c != null) c.debito(val);
else System.out.println("Conta
inexistente!");
}...

Definio de Classes:
Forma Geral
class C
extends C
implements I1, I2, ..., In {...}
C
I1

I2

I3 ... In
C

O que usar? Quando?


Classes (abstratas)
Agrupa objetos com
implementaes
compartilhadas
Define novas
classes atravs de
herana (simples)
de cdigo
S uma pode ser
supertipo de outra
classe

Interfaces
Agrupa objetos com
implementaes
diferentes
Define novas
interfaces atravs
de herana
(mltipla) de
assinaturas
Vrias podem ser
supertipo do mesmo
tipo

Bancos:Construtor
BancoIndependente
(RepositorioDeContas rep) {
contas = rep;
}
A estrutura para armazenamento das contas
fornecida na inicializao do banco,
e pode depois ser trocada!

Repositrio: Definio

interface RepositorioDeContas {
void inserir(Conta c);
Conta procurar(String num);
}

Repositrio: Implementaes
class ConjuntoDeContas
implements RepositorioDeContas {...}
class ListaDeContas
implements RepositorioDeContas {...}
class ArrayDeContas
implements RepositorioDeContas {...}
class VectorDeContas
implements RepositorioDeContas {...}

Exerccio em Sala

Modifique a classe Banco para utilizar o


Repositrio de Contas, implementando
a classe Lista de Contas e Array de
Contas

Classe de Contas: Descrio


class Conta {
private String numero;
private double saldo;
void debito (double valor) {
saldo = saldo - valor;
}...
Como evitar dbitos acima do limite permitido?

Dever de casa

Modifique a classe Estoque para utilizar


o Repositrio de Produtos,
implementando a classe Lista de
Produtos, Array de Produtos, Vector de
Produtos e ArrayList de Produtos.

Desconsiderar Operao
class Conta {
private String numero;
private double saldo;
void debito (double valor) {
if (valor <= saldo) saldo = saldo valor;
}...
}

Mostrar Mensagem de Erro


class Conta {
private String numero;
private double saldo;
void debito (double valor) {
if (valor <= saldo)
saldo = saldo - valor;
else System.out.print(Saldo
Insuficiente!);
}...
}

Retornar Cdigo de Erro


class Conta {
private String numero;
private double saldo;
boolean debito (double valor) {
if (valor <= saldo) {
saldo = saldo - valor;
return true;
} else return false;
}...
}

Problemas

Cdigo de Erro: Problemas

Desconsiderar operao: no tem como


saber se a operao foi realizada;
nenhuma informao dada ao cliente.
Mensagem de erro: dependncia entre
a classe e sua interface com o usurio;
no sinaliza erro para outros mtodos.
Cdigo de erro: complica definio e
uso do mtodo (clientes tm que fazer
testes); pior para mtodos que j
retornam valores

class Conta { ...


boolean transfere(Conta conta, double v) {
boolean b = conta.debito(v);
if (b) {
this.credito(v);
return true;
}else return false;
}
}

Cdigo de Erro: Problemas

Excees

class Banco { ...


int debito(String num, double v) {
Conta c = this.procura(num);
if (c != null) {
boolean b = c.debito(v);
if (b) return 0;
else return 2;
} else return 1;
}
}

Ao invs de cdigos, teremos excees...


So objetos comuns, portanto tm que ter
uma classe associada
Classes representando excees herdam e
so subclasses de Exception (pr-definida)
Define-se subclasses de Exception para
oferecer informaes extras sobre a
falha, ou
distinguir os vrios tipos de falhas

Definindo Excees
class SIException extends Exception {
double
sc;
String
nc;
SIException (double s, String n) {
super (Saldo Insuficiente!);
sc = s;
nc = n;
}
}

Definindo e Levantando
Excees
Res metodo(Args) throws E1, ..., EN {...}
Todos os tipos de excees levantadas no
corpo de um mtodo devem ser
declaradas na sua assinatura
Levantando excees: throw obj-exceo
Fluxo de controle e exceo so passados
para a chamada do cdigo contendo o
comando throw, e assim por diante...

Usando e Definindo Mtodos


com Excees
class Banco { ...
void debito(String num, double v)
throws SIException, CNEException {
Conta c = this.procura(num);
if (c != null) c.debito(v);
else throw new CNEException();
}
}

Definindo Mtodos com


Excees
class Conta {
private String numero;
private double saldo;
void debito (double valor) throws SIException
{
if (valor <= saldo)
saldo = saldo - valor;
else throw new SIException(saldo,numero);
}...
}

Usando Mtodos com Excees


class Conta { ...
void transfere(Conta conta, double v)
throws SIException {
conta.debito(v);
this.credito(v);
}
}
Excees levantadas indiretamente tambm
devem ser declaradas!

Tratando Excees
try {
banco.debito(num,val); ...
}
catch (SIException sie) {
System.out.print(sie.getMessage());
System.out.print( Conta/saldo: );
System.out.print(sie.nc+/+sie.sc);
}
catch (CNEException cnee) {...}

Tratando Excees
A execuo do try termina assim que
uma exceo levantada
O primeiro catch de um (super) tipo da
exceo executado e o fluxo de
controle passa para o cdigo seguinte
ao ltimo catch
Se no houver nenhum catch
comptivel, a exceo e o fluxo de
controle so passados para a chamada
do cdigo com o try/catch

Excees em Banco
class Banco {
private Conta[]
private int

void cadastro(Conta c) {
contas[indice] = c;
indice = indice + 1;
}

Excees em Banco
private Conta procura(String n)
throws CNEException {
int
i = 0;
boolean achou = false;
while ((! achou) && (i < indice)) {
if ((contas[i].numero()).equals(n))
achou = true;
else i = i + 1;
}
if (achou == true) return contas[i];
else throw new CNEException();
}

Exerccio em Sala
Altere o mtodo saldo da classe Banco
para gerar uma exceo quando
algum quiser saber o saldo de uma
conta no cadastrada.
Altere a classe Banco para no permitir
que duas contas com o mesmo nmero
sejam cadastradas; use excees para
lidar com esta situao de erro.

contas;
indice = 0;

Excees em Banco
void debito(String num, double val)
throws SIException, CNEException {
Conta
c = this.procura(num);
c.debito(val);
}

Dever de Casa

Dever de Casa

Programando em Rede

Programando em Rede

Protocolo TCP/IP

Programas em Java :

Aplicao
(HTTP, FTP, Telnet)

TCP

Camada de aplicao

Transport
(TCP, UDP, ...)
Rede
(IP, ...)

Anlogo a uma chamada telefnica


Entrega garantida
Orientado a conexo
Aplicaes (HTTP, FTP, Telnet)

Fsica
(Controladores)

Programando em Rede

Altere o exemplo do Estoque para


conter excees.

UDP
Anlogo ao sistema de correio
A entrega no garantida
No orientado a conexo
Mais rpido que o TCP
Indicado para meios de comunicao
seguros

Programando em Rede

Portas
Comunicao com diversas aplicaes em
uma mesma mquina
FTP

HTTP

App1

0 ... 20 21 ... 80 ... 1024 ... 4000

TCP ou UDP

dados porta

App2
... 44444 ... 65535

Programando em Rede

Socket: Endereo IP+Porta


Comunicao Cliente-Servidor :
Servidor com um socket associado a uma
porta, esperando por uma requisio de
conexo
Cliente conhecendo o Host e a porta solicita
conexo
Servidor cria um novo socket, associado a
uma outra porta, para continuar a ouvir
conexes
Se a comunicao aceita, o cliente pode
iniciar a comunicao com o servidor

Programando em Rede

Cliente
Criao do Socket Cliente
echoSocket=new Socket("200.137.162.150",7777);

Criando o Stream de Envio de Dados


out = new
PrintWriter(echoSocket.getOutputStream(), true);

Criando o Stream de Recebimento de Dados


in = new
DataInputStream(echoSocket.getInputStream());

Programando em Rede:
EchoServer
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
DataInputStream in = new
DataInputStream(clientSocket.getInputStream());
String inputLine;
System.out.println("Esperando Respostas !");
inputLine=in.readLine();
while (inputLine != null) {
System.out.println("Recebeu "+inputLine);
out.println("Ok! Recebi "+inputLine);
inputLine=in.readLine();
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}

Programando em Rede

Servidor
Criao do Socket do Servidor
serverSocket = new ServerSocket(porta);

Criao do Socket Cliente


Socket clientSocket = null;

Esperando por conexes


clientSocket = serverSocket.accept();

Criando o Stream de Envio de Dados


out = new
PrintWriter(clientSocket.getOutputStream(), true);

Criando o Stream de Recebimento de Dados


in = new
DataInputStream(clientSocket.getInputStream());

Programando em Rede:
EchoServer
import java.net.*;
import java.io.*;
public class EchoServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(7777);
} catch (IOException e) {
System.err.println(No posso ouvir a porta: 7777.");
System.exit(1);
}
Socket clientSocket = null;
try {
System.out.println("Esperando Conexao Cliente!");
clientSocket = serverSocket.accept();
} catch (IOException e) {
System.err.println("Accept failed.");
System.exit(1);
}

Programando em Rede:
EchoClient
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String[] args) throws IOException {
Socket echoSocket = null;
PrintWriter out = null;
DataInputStream in = null;
try {
System.out.println("Conectando localhost 7777");
echoSocket = new Socket("200.137.162.150", 7777);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new DataInputStream(echoSocket.getInputStream());
} catch (UnknownHostException e) {
System.err.println("Nao Encontrou Host");
System.exit(1);
} catch (IOException e) {
System.err.println("Erro de I/O");
System.exit(1);
}

Programando em Rede:
EchoClient
DataInputStream stdIn = new DataInputStream(System.in);
String userInput="a";
System.out.println("Lendo Dados para Enviar !");
while (userInput != null) {
userInput=stdIn.readLine();
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
out.close();
in.close();
stdIn.close();
echoSocket.close();
}

WWW - World Wide Web


Internet ? WWW ? FTP ? E-MAIL?
Biblioteca eletrnica mundial
Documentos em HTML
Sistema de informao mundial
Usa funes bsicas da Internet
Clientes e servidores

Applets versus HTML+CGI


+Javascript

Por que Java?

WWW mais interativa

cliente fala direto com o servidor da


aplicao (usando objetos ao invs de
strings)
qualquer tipo de processamento pode ser
feito no cliente
carga do servidor pode ser distribuda

Documentos animados, dinmicos


Ensino a distncia, telemedicina
Comrcio eletrnico

Utilizao de software pela Internet


Independncia de plataforma
Atualizaes e instalaes transparentes
Aluguel de software

Applets Java
Mini aplicao, projetada para executar
em um Navegador (Browser), atravs
de uma pgina HTML
Possuem diversas restries de
segurana
No possuem um mtodo main()
Devem estender a classe Applet

Applets eliminam gargalos:

Java uma linguagem de programao


que d suporte a princpios de
engenharia e qualidade de software

Applets Java
O Funcionamento de um Applet Java
Solicitao de pgina Web
Pgina solicitada
Applet referenciado

Mtodos Presentes nas


Superclasses Applets

Mtodos Presentes em Applets Java

init() - Chamado quando o Applet carregado


pela 1 vez
destroy() - Chamada quando o Applet deve
ser descarregado da memria
start() - Chamado quando o Applet torna-se
visvel
stop() - Chamado quando o Applet torna-se
temporariamente invisvel
getAppletInfo() - Chamado para se obter
informaes sobre o Applet
getParameterInfo() - Chamado para obter
informaes sobre os parmetros

O Primeiro Applet
import java.applet.*;
import java.awt.*;
public class Primeiro extends Applet {
public void paint (Graphics g) {
g.drawString(Ola !,25,50);
}
}

Desenhando Grficos
import java.applet.*;
import java.awt.*;
public class Primeiro extends Applet {
private Font fonte;
public void init () {
fonte=new Font(Helvetica,Font.BOLD,48); }
public void paint (Graphics g) {
g.setColor(Color.blue);
g.fillOval(10,10,330,100);
g.setColor(Color.red);
g.drawOval(10,10,330,100); g.drawOval(9,9,332,102);
g.drawOval(8,8,334,104); g.drawOval(7,7,336,106);
g.setColor(Color.black); g.setFont(fonte);
g.drawString(Ola Turma !,25,50); }
}

paint() - Chamado para que o Applet se


desenhe na tela
getImage() - Carrega uma imagem de um
arquivo e retorna um objeto Image
getAudioClip() - Carrega um som da rede e
retorna um objeto AudioClip
getParameter() - Retorna um parmetro
passado ao Applet no arquivo HTML
getCodeBase() - Retorna o URL do qual o
Applet foi carregado
showStatus() - Mostra uma mensagem na
linha de status do Browser

Criando um Arquivo HTML


<html>
<head>
<title> Meu Primeiro Applet </title>
<applet code=Primeiro.class
width=200 height=200>
</applet>
</body>
</html>

Exibindo Sons e Imagens


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class SomImagem extends Applet implements
ActionListener{
Image imagem;
AudioClip som;
Button botao;
public void init() {
imagem=this.getImage(this.getDocumentBase(),
this.getParameter("imagem"));
som=this.getAudioClip(this.getDocumentBase(),
this.getParameter("som"));
botao=new Button("Outra Pagina");
add(botao, "South");
botao.addActionListener(this);
}

Exibindo Sons e Imagens


public void actionPerformed(ActionEvent e) {
if(e.getSource()==botao){
this.showStatus("Tocando Som");
som.play();
}
}
public void paint(Graphics g) {
g.drawImage(imagem, 0, 0, this);
}
public void update(Graphics g) {
paint(g);
}
}

Mecanismos de Segurana em Java

Arquivos JAR

Formato utilizado para melhorar a


transferncias de dados pela rede

Referncia no arquivo HTML

jar cf somimagem.jar *.class *.gif *.au


<APPLET archive=somimagem.jar
code=SomImagem.class whidth=288 height=288>
</APPLET>

Executando aplicaes no formato JAR


java -jar NomeApp.jar

Mecanismos de Segurana em Java


JDK 1.0

Confiabilidade
Sistema de Tipos
Ausncia de Ponteiros
Gerenciamento da Memria
Modificadores de Acesso

Mecanismos de Segurana em Java

Mecanismos de Segurana em Java

JDK 1.1

JDK 1.2

Mecanismos de Segurana em
Java (JDK 1.2)

Mecanismos de Segurana em Java


O Verificador de ByteCode

Formado por 4 componentes


VERIFICADOR

Bytecodes

Classes
Carregadas

Verificador de Bytecode
Carregador de Classes
Gerenciador de Segurana
Controlador de Acesso

Classes
Objetos
Mtodos

Mquina Virtual Java

Mecanismos de Segurana em Java


O Carregador de Classes Java

Reforar Segurana
Espao de Endereamento
Carregador de
Classes cl1

www.ufpi.br
Internet

Carregador de
Classes cl2

www.di.ufpe.br

Gerenciador de Segurana
Classes Confiveis e No Confiveis

Classes na Mquina Virtual


aluno (br.ufpi)
aluno (br.ufpe.di)
string (interno)
Ufpi
applet

Mecanismos de Segurana em Java

cl1 cl2

Java 1.0 - CLASSPATH


Java 1.1 - CLASSPATH e Cdigo Assinado
Java 1.2 - API Java e Poltica de Segurana

Proteo
Ufpe
applet

Acesso a Arquivos, Acesso a Rede, Acesso a


JVM, Proteo aos Threads, Proteo aos
Recursos do Sistema

Mecanismos de Segurana em Java

Mecanismos de Segurana em Java

Controlador de Acesso

Controlador de Acesso

Construdo em Cima de 4 Conceitos:


Local de Origem
Permisses

Poltica do Sistema
grant codeBase http://www.xyz.com/ {
permission java.io.FilePermission /pasn/docs
read, write, delete.}

Domnios de Proteo

Restries de Segurana para


Applets

No podem acessar o Sistema de


Arquivo local

Restries de Segurana para


Applets

Ler, escrever, apagar, listar, renomear,


obter informaes de arquivos e diretrios

No podem executar operaes em


Rede

No podem usar certas facilidades


AWT
Imprimir, acessar rea de transferncia,
acessar a fila de eventos

No podem acessar o pacote de


segurana de Java

Criar, escutar, aceitar conexes para


computadores, exceto para o computador
de origem

Eventos em Java

Eventos: Corao de uma interface


grfica.
Clicar do Mouse, Pressionar uma tecla

Java 1.0: Perda de ciclos da CPU com


eventos sem interesse
Java 1.1: Modelo de delegao de
eventos

Cada programa diz quais eventos lhe


interessam

Hierarquia de Eventos em Java

ActionEvent: Ativao de Componentes


AdjustmentEvent: Ajuste de componentes
ajustveis (ScrollBar)
ContainerEvent: Adio ou remoo de
componentes a um Container
FocusEvent: Componente perde ou recebe o
focus
ItemEvent: Item selecionado em um list, choice
ou check box
KeyEvent: Atividade no teclado
MouseEvent: Atividade no mouse
PaintEvent: Componente pintado
TextEvent: Componente texto modificado
WindowEvent: Atividade em janelas

Hierarquia de Eventos em Java


java.util.EventObject
java.awt.AWTEvent
ActionEvent ItemEvent ComponentEvent AdjustmentEvent TextEvent

ContainerEvent FocusEvent

InputEvent

KeyEvent

PaintEvent

WindowEvent

MouseEvent

Desenhando em Java 1.1


import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble extends Applet implements MouseListener,
MouseMotionListener {
private int last_x, last_y;
public void init() {
addMouseListener(this);
addMouseMotionListener(this);
}
public void mousePressed(MouseEvent e) {
last_x=e.getX();
last_y=e.getY();
}

Desenhando em Java 1.1


public void mouseDragged(MouseEvent e) {
Graphics g=this.getGraphics();
int x=e.getX(), y=e.getY();
g.drawLine(last_x,last_y,x,y);
last_x=x; last_y=y;
}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
}

Event Listener

Objeto que escuta por algum evento em um


componente
Quando um evento ocorre o evento gerado
e passado como parmetro para um mtodo
no listener
Criao de um Listener
Classe deve implementar a interface
Construir o componente
Chamar o mtodo addXXX() do
componente a ser escutado

Exemplo: Eventos com Botes


import java.applet.*;
import java.awt.*;
public class Botao extends Applet implements
ActionListener{
Button b;
public void init() {
b=new Button("Teste");
add(b);
b.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==b)
this.showStatus("Botao Presionado");
}
}

Listener Interface
Interface

Componentes AWT: TextField

Construtores
Mtodos

Exemplo: Lendo dados numricos

Construtores

Mtodos

Exemplo:

Button(), Button(String)

setText(String), getText()
TextField t; int a ; double b;
a = Integer.ParseInt(t.getText( ));
b = Float.ParseFloat(t.getText( ));

Colocando valores numricos


t.setText(String.Valueof(a))

Mtodo ADD
addActioListener( )
addItemListener( )
addKeyListener( )

addMouseListener( )

addMouseMotionListener( )
addTextListener( )

Componentes AWT: Botes

TextField(String), TextField(int)

Mtodos da Interface

actionPerformed(ActionEvent)
itemStateChanged(ItemEvent)
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotion- mouseDragged(MouseEvent)
Listener
mouseMoved(MouseEvent)
textValueChanged(TextEvent)
TextListener
ActionListener
ItemListener
KeyListener

getLabel(), setLabel(String)
Button b=new Button();
b.setLabel(OK);

Componentes AWT: TextArea

Construtores
TextArea(), TextArea(int,int),
TextArea(String),TextArea(String,int,int)

Construtores
Label(), Label(String), Label(String,int)

Mtodos
append(), insert(), setRows(int),
setColumns(int), getRows(), getColumns()

Componentes AWT: Label

Mtodos
setText(), setAlignment(), getText()

Exemplo:
Label l = new Label(Teste:, Label.CENTER);

Exemplo:
TextArea txt = new TextArea(,5,20);

Componentes AWT:
RadioButton

Componentes AWT: CheckBox

Construtores
Checkbox(String), Checkbox(String,Location),
Checkbox(String,boolean,Checkboxgroup)

Mtodos
addItemListener(ItemListener), getState(),
setState(boolean), setLabel(String)

Exemplo:
Checkbox chk=new Chebox(Opcao1);

Componentes AWT: Exemplo


import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class sanduiche extends Applet implements ItemListener,
ActionListener{
Menu1 Panel1;
Ingredientes Panel2;
public void init() {
Panel1=new Menu1();
Panel2=new Ingredientes();
add(Panel1);
Panel1.Sanduiche1.addItemListener(this);
Panel1.Sanduiche2.addItemListener(this);
Panel1.Sanduiche3.addItemListener(this);
Panel2.ok.addActionListener(this);
add(Panel2);
}

Implementado como um conjunto de


Checkbox associado a um CheckboxGroup
Construtores

Mtodos

CheckboxGroup()
getSelectCheckbox(),
setSelectCheckbox(Checkbox)

Exemplo:
CheckboxGroup cg=new CheboxGroup();
Checkbox c1=new Checkbox(1,false,cg);
Checkbox c2=new Checkbox(2,true,cg);

Componentes AWT: Exemplo


public void actionPerformed(ActionEvent e) {
if(e.getSource()==Panel2.ok)
Panel1.Preco.setText("Debitando no Cartao
"+Panel2.cartao.getText());
}
public void itemStateChanged(ItemEvent e) {
if(e.getItemSelectable()==Panel1.Sanduiche1) {
Panel2.Ingrediente1.setState(true);
Panel2.Ingrediente2.setState(false);
Panel2.Ingrediente3.setState(true);
Panel2.Ingrediente4.setState(false);
Panel1.Preco.setText("Preo = R$ 2,95");
}

Componentes AWT: Exemplo


if(e.getItemSelectable()==Panel1.Sanduiche2) {
Panel2.Ingrediente1.setState(false);
Panel2.Ingrediente2.setState(true);
Panel2.Ingrediente3.setState(true);
Panel2.Ingrediente4.setState(true);
Panel1.Preco.setText("Preo = R$ 3,15");
}
if(e.getItemSelectable()==Panel1.Sanduiche3) {
Panel2.Ingrediente1.setState(true);
Panel2.Ingrediente2.setState(true);
Panel2.Ingrediente3.setState(true);
Panel2.Ingrediente4.setState(true);
Panel1.Preco.setText("Preo = R$ 4,00");
}
}

Componentes AWT: Exemplo


class Menu1 extends Panel {
CheckboxGroup Sand;
Checkbox Sanduiche1, Sanduiche2, Sanduiche3;
Label Preco;
Menu1() {
Sand=new CheckboxGroup();
add(Sanduiche1=new Checkbox("Cheessr ", Sand, false));
add(Sanduiche2=new Checkbox("Bauru ", Sand, false));
add(Sanduiche3=new Checkbox("X-Tudo ", Sand, false));
Preco=new Label ("
");
add(Preco);
}
}

Componentes AWT: Exemplo

Dever de Casa

class Ingredientes extends Panel {


Checkbox Ingrediente1, Ingrediente2, Ingrediente3, Ingrediente4;
Button ok;
TextField cartao;
Ingredientes(){
add(Ingrediente1=new Checkbox("Queijo"));
add(Ingrediente2=new Checkbox("Presunto"));
add(Ingrediente3=new Checkbox("Carne"));
add(Ingrediente4=new Checkbox("Ovo"));
cartao=new TextField(15);
ok=new Button("Envia Cartao Credito");
add(cartao);
add(ok);
}
}

Dever de Casa 6
Crie um applet para o exemplo de
Banco visto anteriormente.
Crie um applet para o Sistema de
Controle de Estoque requisitado nas
aulas anteriores

Layout Managers

Utilizado por 2 razes:


Responsvel pela determinao da
localizao de componentes, evitando
assim, trabalhos repetitivos
Componentes podem aparecer com
diferentes tamanhos e posies em virtude
da independncia de plataforma

Trabalham em parceria com os


Containers

Containers

Ex: Hierarquia de Componentes


Frame

So componentes que podem conter


outros componentes
GUIs Java residem em Applets ou
Frames
Subregies so implementadas
utilizando Panels
Panels podem conter Panels ou outros
componentes

Panel
Panel

Ex: Hierarquia de Componentes

Panel

Label

Label

Scrollbar

Scrollbar

Scrollbar

TextField

TextField

TextField

Boto

Boto

Panel
Boto

Ex: Hierarquia de Componentes


import java.awt.*;
public class Hierarquia extends Frame {
Hierarquia() {
super("Teste de Hierarquia de Componentes");
setBounds(20,20,300,180);
setLayout(new BorderLayout());
String strings[]={"Vermelhor:","Verde:","Azul:"};
Panel grande = new Panel();
grande.setLayout(new GridLayout(1,3,20,0));
for(int i=0; i<3; i++) {
Panel interno = new Panel();
interno.setLayout(new GridLayout(3,1,0,10));
interno.add(new Label(strings[i]));
interno.add(new
Scrollbar(Scrollbar.HORIZONTAL,i,10,0,255));
interno.add(new TextField("0"));
grande.add(interno);
}

Panel

Label

Ex: Hierarquia de Componentes


// Continuao ...
add(grande, BorderLayout.CENTER);
Panel embaixo = new Panel();
embaixo.add(new Button("Aplicar"));
embaixo.add(new Button("Limpar"));
embaixo.add(new Button("Cancelar"));
add(embaixo, BorderLayout.SOUTH);
this.show();
}
public static void main(String args[]) throws Exception {
Hierarquia h=new Hierarquia();
System.in.read();
}
}

Polticas de Layout: FlowLayout


Default para Panels e Applets
Dispe os componentes em colunas
horizontais
Mantm os componentes do Preferred
Size

Polticas de Layout: FlowLayout

Polticas de Layout: FlowLayout

import java.awt.*;
import java.applet.*;
public class TesteFlow extends Applet {
public void init() {
Label label=new Label("Nome:");
add(label);
TextField textfield=new
TextField("Teste FlowLayout");
add(textfield);
Button button=new Button("OK");
add(button);
}
}

Polticas de Layout: GridLayout

Ignora o Preferred Size


Divide uma rea em uma matriz de
linhas e colunas

Polticas de Layout: GridLayout

GridLayout(int linhas, int colunas)

setLayout(new GridLayout(5,3));
5 linhas
3 colunas

Polticas de Layout: GridLayout


import java.awt.*;
import java.applet.*;

Polticas de Layout: BorderLayout

public class TesteGrid extends Applet {


public void init() {
setLayout(new GridLayout(5,3));
for(int linha=0; linha<5; linha++){
add(new Label("Label"+linha));
add(new Button("Botao"+linha));
add(new TextField("TextField"+linha));
}
}
}

Layout default em Frames


Divide a rea em 5 regies: North,
South, East, West, Center

Threads em Java

Polticas de Layout: BorderLayout


import java.awt.*;
import java.applet.*;
public class TesteBorder extends Applet {
public void init() {
setLayout(new BorderLayout());
add(new Button("North"),BorderLayout.NORTH);
add(new Button("South"),BorderLayout.SOUTH);
add(new Button("East"),BorderLayout.EAST);
add(new Button("West"),BorderLayout.WEST);
Panel p = new Panel();
p.setBackground(Color.blue);
add(p,BorderLayout.CENTER);
}
}

Threads em Java: Exemplo


import java.io.*;
public class SemThread {
static long tempobase=System.currentTimeMillis();
public static void main(String args[]) throws Exception {
PseudoIOSemThread pseudo=new PseudoIOSemThread();
pseudo.run();
mostraTempo("Outra Tarefa Inicia");
System.in.read();
}
static void mostraTempo(String mens){
long tempogasto=System.currentTimeMillis()-tempobase;
System.out.println(mens+" em "+(tempogasto/1000.0)+"
segundos");
}
}

Threads em Java: Exemplo


import java.io.*;
public class ComThread {
static long tempobase=System.currentTimeMillis();
public static void main(String args[]) throws Exception {
PseudoIOComThread pseudo=new PseudoIOComThread();
pseudo.start();
mostraTempo("Outra Tarefa Inicia");
System.in.read();
}
static void mostraTempo(String mens){
long tempogasto=System.currentTimeMillis()-tempobase;
System.out.println(mens+" em "+(tempogasto/1000.0)+"
segundos");
}
}

Multithreads. Por que Usar?


Melhor aproveitamento dos recursos
Vrios threads resolvem problemas de
forma melhor

Como utilizar
Dividindo-se as tarefas potencialmente
longas em tarefas separadas

Threads em Java: Exemplo


class PseudoIOSemThread {
PseudoIOSemThread() {
SemThread.mostraTempo("PseudoIO Criada");
}
public void run(){
SemThread.mostraTempo("PseudoIO Iniciado");
try {
Thread.sleep(10000);
SemThread.mostraTempo("PseudoIO Termina");
} catch (InterruptedException e) {}
}
}

Threads em Java: Exemplo


class PseudoIOComThread extends Thread {
PseudoIOComThread() {
ComThread.mostraTempo("PseudoIO Criada");
}
public void run(){
ComThread.mostraTempo("PseudoIO Iniciado");
try {
Thread.sleep(10000);
ComThread.mostraTempo("PseudoIO Termina");
} catch (InterruptedException e) {}
}
}

Threads em Java: Exemplo

Sada para o programa SemThreads


PseudoIO Criada em 0.11 segundos
PseudoIO Iniciado em 0.22 segundos
PseudoIO Termina em 10.27 segundos
Outra Tarefa Inicia em 10.27 segundos

Threads em Java: Exemplo

Durante o bloqueio, nada executado


Ineficincia na utilizao do processador

Mtodos para controle de


Threads

Criao de Threads
Feito basicamente de 2 maneiras

Deve-se criar um objeto dessa classe com


new() e chamar o start() para iniciar execuo

Implementando a Interface Runnable


Deve-se criar um objeto da classe Thread
passando o objeto que implementa Runnable
como parmetro e depois executar start()
PseudoIOComThread p= new PseudoIOComThread();

Thread t=new Thread(p);


t.start();

Mtodos para controle de


Threads

Static void sleep(long sleepTimeInMillis)


throws InterruptedException
Coloca o Thread para dormir por um tempo
especificado como parmetro

void join() throws InterruptedException


O Thread chamador bloqueia esperando este
Thread morrer

static void yield()


Bloqueia o chamador e o coloca no fim da fila de
escalonamento

void start() throw IllegalThreadStateException


Inicia a execuo do corpo do Thread definido no
mtodo run(). O controle do programa retorna ao
chamador e o novo Thread ser escalonado para
executar concorrentemente.

Estendendo a classe Thread


PseudoIOComThread t= new PseudoIOComThread();
t.start();

Programa ComThread
Outras atividades executam durante o
bloqueio de um Thread
Utilizao mais eficiente do processador

Sada para o programa ComThreads


PseudoIO Criada em 0.11 segundos
Outra Tarefa Inicia em 0.22 segundos
PseudoIO Iniciado em 0.22 segundos
PseudoIO Termina em 10.21 segundos

Programa SemThread

void stop()

void suspend()

Usado para encerrar a execuo do Thread.


Usado para suspender temporariamente a
execuo do Thread.

void resume()
Usado para continuar a execuo de um Thread
suspenso

Mtodos para controle de


Threads: Exemplo
import java.io.*;
public class TesteThreads {
public static void main (String args[]) throws Exception {
FirstThread first=new FirstThread();
SecondThread second=new SecondThread();
first.start();
second.start();
try {
System.out.println("Esperando pelo primeiro Thread Terminar...");
first.join();
System.out.println("Foi uma longa espera !");
System.out.println("Acordando o segundo Thread...");
synchronized(second){
second.notify();
}
System.out.println("Esperando pelo termino do segundo Thread...");
second.join();
} catch (InterruptedException e){ }
System.out.println("Estou terminando tambem ...");
System.in.read();
}
}

Mtodos para controle de


Threads: Exemplo
class FirstThread extends Thread {
public void run() {
try {
System.out.println("\t Inicio do Primeiro Thread");
sleep(5000);
System.out.println("\t Fim do Primeiro Thread");
} catch(InterruptedException e) {}
}
}

Mtodos para controle de


Threads: Exemplo

public class SecondThread extends Thread {


public void run() {
try {
System.out.println("\t Inicio do Segundo Thread");
System.out.println("\t Segundo Thread chama
wait()");
wait();
System.out.println("\t Segundo Thread volta a
executar e termina");
} catch(InterruptedException e) {}
}
}

Ciclo de Vida de um Thread

Sada do programa TesteThreads


Inicio do Primeiro Thread
Inicio do Segundo Thread
Segundo Thread chama wait()
Fim do Primeiro Thread

Foi uma longa espera !


Acordando o segundo Thread...
Esperando pelo termino do segundo Thread...

Runnable

new()

t()

ar

Esperando pelo primeiro Thread Terminar.

st

Mtodos para controle de


Threads: Exemplo

Recentemente
Criada

stop(), ou
fim do run()

stop(), ou
fim do run()

Morta

suspend(), sleep(),
wait() ou I/O
resume(),
notify(),
timeout, IO

Bloqueada

stop(), ou
fim do run()

Segundo Thread volta a executar e termina

Estou terminando tambem ...

Multithread Avanado

Sincronizao
Mtodo utilizado para evitar a corrupo de
dados

Quando isso necessrio?


Programa para realizar depsitos em contas
Obteno do saldo em um servidor remoto
Soma do valor depositado ao saldo
Envio do novo saldo ao servidor remoto

2 Threads tentando depositar R$1.000,00


em uma conta com R$1.000,00

O Programa Exemplo: Depsito


import java.io.*;
public class Deposito {
static int balanco=1000;
public static void main(String args[]) throws Exception {
Conta conta=new Conta();
ThreadDeposito first=new ThreadDeposito(conta, 1000, "#1");
ThreadDeposito second=
new ThreadDeposito(conta, 1000, "\t\t\t\t#2");
first.start(); second.start();
try {
first.join(); second.join();
} catch(InterruptedException e) {}
System.out.println("O balanco final e "+balanco);
System.in.read();
}
}

O Programa Exemplo: Conta


class Conta {
void deposito(int v, String nome){
int saldo;
System.out.println(nome+" tentando depositar "+v);
System.out.println(nome+" obtendo saldo...");
saldo=getSaldo();
System.out.println(nome+" saldo obtido "+saldo);
saldo+=v;
System.out.println(nome+" ajustando saldo para "+saldo);
setSaldo(saldo);
System.out.println(nome+" saldo ajustado para "+
Deposito.balanco);
}

O Programa Exemplo:
ThreadDeposito
class ThreadDeposito extends Thread {
Conta conta;
int valor;
String mens;
ThreadDeposito(Conta conta, int valor, String mens) {
this.mens=mens;
this.conta=conta;
this.valor=valor;
}
public void run(){
conta.deposito(valor, mens);
}
}

O Programa Exemplo: Conta


int getSaldo(){
try {
Thread.sleep(5000);
} catch(InterruptedException e) {}
return Deposito.balanco;
}
void setSaldo(int saldo){
try {
Thread.sleep(5000);
} catch(InterruptedException e) {}
Deposito.balanco=saldo;
}
}

O Programa Exemplo: Resultado

Atribuio de um valor incorreto ao


saldo

Como resolver este problema?

Saldo = 2000
Utilizando Monitores
Semelhante a um local fechado aonde existe
apenas uma chave para se entrar

Monitores

Monitores

Monitor

chave

Mtodo 1
Mtodo 2

Threads

Mtodo 3
Mtodo 4

Como sincronizar o programa anterior?


Basta incluir a palavra reservada
synchronized na definio do mtodo
depsito
criado um monitor no mtodo depsito
Apenas 1 programa pode acessar a
execuo de depsito

Applets com Threads


import java.awt.*;
import java.applet.*;
public class Pedros extends Applet implements Runnable {
Image pedros[]=new Image[6];
int currentimg=0;
boolean sair;
Thread pedro;
public void init() {
pedros[0]=getImage(getCodeBase(), "pedro1.JPG");
pedros[1]=getImage(getCodeBase(), "pedro2.JPG");
pedros[2]=getImage(getCodeBase(), "pedro3.JPG");
pedros[3]=getImage(getCodeBase(), "pedro4.JPG");
pedros[4]=getImage(getCodeBase(), "pedro5.JPG");
pedros[5]=getImage(getCodeBase(), "pedro6.JPG");
}

Applets com Threads


public void start() {
if (pedro==null) {
pedro = new Thread(this);
pedro.start(); }
}
public void stop(){
if (pedro != null)
sair=true;
}
public void run () {
while(!sair) {
setBackground(Color.yellow);
repaint(); pause(500);
currentimg++;
if(currentimg>5)
currentimg=0;
}
}

Applets com Threads


void pause(int time) {
try {Thread.sleep(time); }
catch(InterruptedException e) {}
}
public void paint(Graphics g) {
g.drawImage(pedros[currentimg],0,0,this);
}
}

O Caminho para JDBC


Grande desenvolvimento da linguagem
Java
Necessidade de uma API puramente
JAVA para acesso a bancos de dados
Sucesso do modelo de API ODBC da
Microsoft
Em 1996 lanado o kit JDBC

Caractersticas do JDBC
Portabilidade
API nica, independente do Banco de
Dados subjacente
Estrutura em Camadas

Caractersticas do JDBC
Interfaces em
camadas
Programador se
preocupa apenas
com API do
gerenciador de
drivers
Drivers se ocupam
da interface com o
banco

Aplicativo Java
Gerenc. de Driver JDBC
Ponte ODBC Driver JDBC

Driver ODBC

Banco

Banco

Instalando o JDBC
O pacote JDBC vm incluso com as
distribuies Java
Deve-se obter um driver com o
fabricante do Banco de Dados
Pode-se usar a Ponte ODBC para
acessar bancos que no possuam
drivers JDBC

A linguagem SQL
Linguagem de manipulao de dados
Comandos Simples
Mnemnica
Pequenas diferenas (extenses) de
um banco de dados para outro
Comandos bsicos padronizados

A linguagem SQL

Comandos Importantes
Insert
Insere registros em uma tabela
Forma: Insert into <tabela>
(<campo1>,<campo2>,...) values
(<valor1>,<valor2>,...);
Exemplo: Insert into cliente
(cd_cliente,nm_clente,cpf_cliente) values
(1,Carlos Futino,9998998-09);

A linguagem SQL
Delete
Exclui Registros de uma tabela
Forma: Delete from <tabela> [ where
<condio>]
Exemplo: Delete from cliente
Exemplo: Delete from cliente where
cd_cliente <=20;

A linguagem SQL
Update
Altera registros em uma tabela
Forma: update <tabela> set
<campo1>=<valor1>, <campo2>= valor2>
[where <condio>]
Exemplo: Update cliente set
cd_cliente=cd_cliente+1;
Exemplo: Update cliente set cd_cliente=1,
nm_cliente=Carlos where cd_cliente=0;

A linguagem SQL
Select
Recupera registros de uma ou mais tabelas
Forma: select <campo1>,<campo 2> ,...from
<tabela 1>,<tabela 2>,... [where <condio>]
Exemplo: select * from cliente,pedido where
pedido.cd_cliente=cliente.cd_cliente
Exemplo: select cd_cliente,nm_cliente from
cliente

Conectando a uma base de dados

Carregando o driver

Conectando a uma base de dados

Usar mtodo esttico forName da classe


Class
Class.forName(<nome do driver>);
O nome do driver constar da
documentao do mesmo
Ex:
Class.forName("sun.jdbc.odbc.JdbcOdbcD
river");

Classe Connection
Usar mtodo getConnection da classe
DriverManager
DriverManager.getConnection(url,usuariom
senha);
Ex:Connetcion con =
DriverManager.getConnection(jdbc:odbc:
myjavadb,,);

Conectando a uma base de dados

Ateno: A conexo pode gerar uma


exceo, que deve ser tratada
Cdigo melhorado
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver
");
DriverManager.getConnection(jdbc:odbc:myja
vadb,,);
}catch (Exception e) {e.printStackTrace();
return;}

Statements
Um Objeto da classe Statement uma
espcie de canal que envia comandos
SQL atravs de uma conexo
O mesmo Statement pode enviar vrios
comandos
Para se criar um Statement, preciso
ter criado anteriormente uma conexo
Uma conexo suporta diversos
Statements

Criando Statements
Mtodo createStatement da classe
Connection
Statement stmt=cone.createStatemen();

Onde cone um objeto da lcasse


Connection

Nesse ponto o Statement existe mas


ainda no executa cdigo SQL nenhum

Estabelecendo a conexo

Executando Statements

Dois mtodos possveis


executeUpdate
Para comandos insert, update, delete,
ou outros que alterem a base e no
retornem dados
Forma: executeUpdate(<comando>)
Ex: stmt.executeUpdate(delete from
cliente);
No retorna valores

Executando Statements

executeQuery
Para comandos select ou outros que
retornem dados
Forma: stmt.executeQuery(<comando>);
Ex: ResultSet rs =
stmt.executeQuery(Select * from cliente);
Retorna um objeto da classe ResultSet

Recuperando dados de ResultSets

Mtodo Next
Forma: rs.next()
Avana para o prximo registro retornado
Retorna verdadeiro se existe um prximo
registro, falso caso contrrio
Exemplo:
while (rs.next())
{
System.out.println(rs.getString(2));
}

Exemplos: Consulta
while (rs.next()) {
System.out.println("Nome: "+rs.getString(1)+" Fone:
"+rs.getString(2));
}
st.close();
con.close();
}
catch(Exception e){
e.printStackTrace();
return;
}
System.in.read();
}
}

Recuperando dados de ResultSets

Mtodos getXXX
getInt, getFloat, getString, getBoolean
getDate
Recuperam um dado de acordo com o tipo
Formas: rs.getXXX(<nome do campo>) ou
rs.getXXX(<posio do campo >)
Exemplo:rs. getString(nm_cliente) ou
rs.getString(2)

Exemplos: Consulta
import java.net.URL;
import java.sql.*;
import java.io.*;
public class Consulta{
public static void main(String args[]) throws IOException{
String comando="SELECT * FROM FONES" ;
try{
Connection con;
Class.forName("com.mysql.jdbc.Driver");
con=DriverManager.getConnection("jdbc:mysql://localhost/banco",
usuario",senha");
System.out.println("Conectado OK");
Statement st = con.createStatement();
ResultSet rs = st.executeQuery(comando);

Exemplos: Insero
import java.net.URL;
import java.sql.*; import java.io.*;
public class Insere{
public static void main(String args[]) throws IOException{
String fonte="jdbc:odbc:javadb";
String comando="INSERT INTO FONES
VALUES('"+args[0]+"','"+args[1]+"')" ;
System.out.println(comando+"\n");
try{
Connection con;
Class.forName("com.ashna.jturbo.driver.Driver");
con=DriverManager.getConnection("jdbc:JTurbo://rubi/javadb",
"sa","");

Exemplos: Insero
System.out.println("Concetado OK");
Statement st = con.createStatement();
st.executeUpdate(comando);
System.out.println("INSERCAO OK");
st.close();
con.close();
}
catch(Exception e){
e.printStackTrace();
return;
}
}
}

Statements Especiais

Um Statement com um nico comando


SQL interno
PreparedStatement pst=
con.prepareStatement(<comando>);

Os mtodos executeQuery e
executeUpdate no recebem parmetros

Statements Especiais

preparedStatements (Cont)

Statements Especiais

O comando SQL

preparedStatement pst=
con.prepareStatement(insert into clientes
(cd_cliente,nm_cliente) values (?,?));
pst.setInt(1,10);
ps.setString(2,Futino);

Statements Especiais
callableStatement
Usados para chamar Stored Procedures
Sintaxe abstrata
callableStatement cst=con.prepareCall({call
<nome_da_SP>});

Mtodos setXXX, como nos


preparedStatements

preparedStatement (cont)
Exemplo:

Qualquer comando, na forma de uma string


Suporta parmetros, que so simbolizados
por pontos de interrogao.
Configura o valor dso parametros por
mtodos setXXX

preparedStatements

Transaes
Modo padro: Compromissamento
automtico (auto_commit)
Pode ser mudado para
compromissamento manual
mtodo setAutoCommit(<true|false>),
da classe Connection
Mtodos commit e rollback na conexo
para compromissamento manual

Transaes (Exemplo)

Transaes (Exemplo) (Cont)


try {
pst.setString(1,Carlos);
pst.setString(2,222-2222);
cst.setString(1,Futino);
cst.setString(2,Rua das Casas, 222);
con.commit();
} catch (SQLException e) {
con.roolback();
System.out.println(Erro: transao
abortada);
}

preparedStatement pst
pst=con.prepareStatement(insert into fones
(nome,fone) values (?,?));
callableStatement cst
cst=con.prepareCall({call insert_endereco});
con.setAutoCommit(false);

Colees

Estruturas de dados empacotadas, com


interfaces e algoritmos

Colees

Mtodo esttico para manipular arrays


Arrays.fill ( matriz, valor) preenche a matriz com o valor
indicado
Arrays.sort ( matriz ) ordena matriz ascendente
Arrays.binarySearch ( matriz, elemento)

Transparncia para programadores

Tipos em Java
Collection
Set
List
Map
Queue

Colees

Collection
Interface raiz de SET, Queue e LIST
Implementa polimorfismo
Mtodos da Interface

Add
Size
Get
Contains

Arrays

Colees

Criar uma classe que contm um


mtodo para receber uma lista de
disciplinas de um curso, uma lista de
disciplinas j cursadas e mostrar o que
um aluno falta cursar ainda!
Deve ser usadas colees para se implementar a resposta
desse problema!

Colees

Criar uma classe que contm um


mtodo para receber um array de
Contas existentes em uma regio, um
array com as contas de um banco e
com isso calcular as contas que no
fazem parte do banco!

Colees

Conjuntos: colees com elementos


nicos!
HashSet e TreeSet

Possuem os mesmos mtodos de Collection

Deve ser usadas colees para se implementar a resposta


desse problema!
Verifique se a comparao de contas funciona
corretamente! Usar Vector na implamentao!

Colees

Faa a implementao do problema


anterior (descobrir contas que no
pertencem a um banco) utilizando uma
implementao de SET.

Exerccio

Criar uma classe que contm um


mtodo para receber uma lista de
disciplinas de um curso, uma lista de
disciplinas j cursadas e mostrar o que
um aluno falta cursar ainda!
Deve ser usadas colees para se implementar a resposta
desse problema!

Colees

Mapas: colees que associam chaves


a valores (mapeamento um para um).
HashTable, HashMap, TreeMap