Escolar Documentos
Profissional Documentos
Cultura Documentos
Programao
com
orientada a
objetos
TM
SE
Helder da Rocha (helder@acm.org) argonavis.com.br1
Objetivos
2
Pr-requisito fundamental
Saber programar em C
ou
Saber programar em uma
linguagem orientada a objetos
3
Assuntos abordados
5
Assuntos no abordados
A distribuio de tempo em cada mdulo iregular. Alguns so bem mais longos que outros 7
Roteiro (II)
* mdulo opcional
8
Roteiro (III)
* mdulo opcional
9
Caractersticas importantes sobre este curso
Faa perguntas
Faa os exerccios
Explore os exemplos
V alm dos exemplos e exerccios: invente
exemplos similares, teste trechos de cdigo
Explore e se familiarize com a documentao
Procure desenvolver um projeto que utilize Java, seja
no trabalho, seja no seu tempo livre
No fique sem programar nos prximos meses ou todo o
esforo ter sido em vo!
Leia revistas, artigos e livros sobre Java e mantenha-
se atualizado.
12
O todo e as partes
Este curso introduz uma nova linguagem e muitos novos
conceitos
Como qualquer novo conhecimento, vrios de seus conceitos
mais complexos dependem de outros mais simples
Nem sempre possvel compreender um conceito mais
abrangente na primeira vez
Ele as vezes depende do conhecimento de partes que s podero
ser abordadas mais adiante
Mas as partes, s vezes dependem dele!
Soluo: repetio. Assuntos complexos sero abordados
superficialmente e depois revisitados mais de uma vez
Se tiver dvidas, pergunte na hora
Cada dia haver mais dvidas novas e menos dvidas antigas
13
Exerccios, testes e projetos
16
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
Investindo em Java desde 1995
17
Java 2 Standard Edition
Introduo
tecnologia Java
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
Conceitos
Tecnologia Java
Linguagem e API Java
Mquina virtual Java
Ambiente de execuo (JRE) e desenvolvimento (SDK)
Carregador de classes (ClassLoader) e CLASSPATH
Verificador de bytecodes
Coletor de lixo (garbage collector)
Introduo prtica
Como escrever uma aplicao Java
Como compilar uma aplicao Java
Como executar uma aplicao Java
Como depurar erros de compilao e execuo
2
Parte 1: Tecnologia Java
4
Produtos e APIs
Java possui uma coleo de APIs (bibliotecas) padro
que podem ser usadas para construir aplicaes
Organizadas em pacotes (java.*, javax.* e extenses)
Usadas pelos ambientes de execuo (JRE) e de
desenvolvimento (SDK)
As principais APIs so distribudas juntamente com os
produtos para desenvolvimento de aplicaes
Java 2 Standard Edition (J2SE): ferramentas e APIs
essenciais para qualquer aplicao Java (inclusive GUI)
Java 2 Enterprise Edition (J2EE): ferramentas e APIs
para o desenvolvimento de aplicaes distribudas
Java 2 Micro Edition (J2ME): ferramentas e APIs para o
desenvolvimento de aplicaes para aparelhos portteis
5
Ambiente de execuo e desenvolvimento
Java 2 System Development Kit (J2SDK)
Coleo de ferramentas de linha de comando para, entre outras
tarefas, compilar, executar e depurar aplicaes Java
Para habilitar o ambiente via linha de comando preciso colocar o
caminho $JAVA_HOME/bin no PATH do sistema
Java Runtime Environment (JRE)
Tudo o que necessrio para executar aplicaes Java
Parte do J2SDK e das principais distribuies Linux, MacOS X, AIX,
Solaris, Windows 98/ME/2000 (exceto XP)
Varivel JAVA_HOME (opcional: usada por vrios frameworks)
Defina com o local de instalao do Java no seu sistema.
Exemplos:
Windows: set JAVA_HOME=c:\j2sdk1.4.0
Linux: JAVA_HOME=/usr/java/j2sdk1.4.0
export JAVA_HOME
6
Compilao para bytecode
Bytecode o cdigo de mquina que roda em qualquer
mquina atravs da Mquina Virtual Java (JVM)
Texto contendo cdigo escrito em linguagem Java traduzido
em bytecode atravs do processo de compilao e
armazenado em um arquivo *.class chamado de Classe Java
Cdigo public class HelloWorld {
Java public static void main(String[] args) {
System.out.println("Hello, world!");
(texto) }
}
HelloWorld.java
compilao (javac)
HelloWorld.class
F4 D9 00 03 0A B2 FE FF FF 09 02 01 01 2E 2F 30 62 84 3D 29 3A C1
10
Coleta de lixo
Memria alocada em Java no liberada pelo programador
Ou seja, objetos criados no so destrudos pelo programador
A criao de objetos em Java consiste de
1. Alocar memria no heap para armazenar os dados do objeto
2. Inicializar o objeto (via construtor)
3. Atribuir endereo de memria a uma varivel (referncia)
Mais de uma referncia pode apontar para o mesmo objeto
pilha heap
Mensagem m, n, p; objetos
m
m = new Mensagem("A"); "A"
n = m; n
GC
p = new Mensagem("B");
p
"B"
18
Parte 2: Introduo prtica
Nesta seo sero apresentados alguns exemplos de
aplicaes simples em Java
1. Aplicao HelloWorld
2. Aplicao HelloWorld modificada para promover reuso e design
orientado a objetos (duas classes)
3. Aplicao Grfica Swing (trs classes)
4. Aplicao para cliente Web (applet)
Compile cdigo-fonte no CD
cap01/src/
Todos os assuntos apresentados nesta seo sero
explorados em detalhes em aulas posteriores
Conceitos como classe, objeto, pacote
Representao UML
Sintaxe, classes da API, etc.
19
1. Aplicao HelloWorld
Atribuio de argumento
Definio de mtodo main()
para o mtodo println()
Definio de classe Chamada de mtodo println()
HelloWorld via objeto out accessvel
atravs da classe System
21
2. Uma classe define um tipo de dados
Esta classe representa objetos que guardam um texto (tipo
String) em um atributo (msg) publicamente acessvel.
Alm de guardar um String, retorna o texto em caixa-alta
atravs do mtodo lerNome(). Membros da classe. Outras
Definio da classe (tipo) Mensagem em Java classes podem acess-los, se
atributo declarados como "public",
public class Mensagem {
usando o operador ponto "."
mtodo
public String msg = "";
Representao
public String lerNome() { em UML
String nomeEmMaiusculas = Mensagem
msg.toUpperCase();
return nomeEmMaiusculas; +msg: String
}
} +lerNome(): String
Relacionamentos
Reuso de componentes das entre as trs Mensagem
APIs Java permite a criao classes do +msg: String
de aplicaes GUI com programa
+lerNome(): String
poucas linhas de cdigo!
Execuo da apliao
passando parmetro
via linha de comando
26
Entrada de dados via GUI
javax.swing.JOptionPane oferece uma interface grfica para
entrada de dados e exibio de informaes
Exemplo de exibio de caixa de dilogo
JOptionPane.showMessageDialog(null, "Hello, World!");
preciso importar
javax.swing.* ou
javax.swing.JOptionPane
27
4. Primeiro applet
Componentes grficos que podem ser executados no browser
Para criar e usar um applet preciso
criar uma classe que herde da classe Applet ou JApplet (API Java)
criar uma pgina HTML que carregue o applet
A classe abaixo implementa um JApplet
import javax.swing.*; // importa JFrame e JLabel
import java.awt.Container; Herana!
Mensagem
+msg: String
31
Java 2 Standard Edition
32
Erros (1)
Durante o desenvolvimento, erros podem ocorrer em dois
domnios: tempo de compilao e tempo de execuo
Erros ocorridos durante a fase de compilao ocorrem quando se
executa o javac, e so fceis de corrigir. H dois tipos:
Erros de processamento do arquivo (parsing): ponto-e-vrgula faltando,
parnteses, aspas, chaves ou colchetes descasados. Identifica apenas o
arquivo e a linha onde o erro pode ter iniciado. Um erro causa vrios
outros e nem sempre a mensagem precisa.
Erros de compilao do cdigo, realizada depois do parsing: alm da
linha e do arquivo, identificam a classe e mtodo. Geralmente as
mensagens so bastante elucidativas.
essencial aprender a identificar a causa da mensagem de erro
LEIA a mensagem e localize a linha onde o erro foi detectado
Corrija os erros na ordem em que eles aparecerem
Sempre recompile depois de corrigir cada erro de parsing (ponto-e
vrgula, etc.) j que eles causam mensagens de erro falsas.
33
Alguns erros de compilao comuns
Trecho do cdigo e
indicao da
provvel
localizao da Nmero da linha onde
causa do erro o erro foi achado
35
Exemplos de erros de compilao (2)
Nome do arquivo
MensagemErro.java mas
classe foi criada com nome
mensagemerro.java
Compilador no sabe
quem string: O tipo
String sempre tem um
S maisculo (como
todas as classes da API)
Erro na linha 11
do arquivo
HelloJava.java
Erro na linha 12
do arquivo
Mensagem.java
localizado no
mesmo diretrio
que HelloJava.java
37
Erros (II)
Depois que o cdigo compila com sucesso, os bytecodes
(arquivos .class) so gerados e podem ser usados em um
processo de execuo
Erros ocorridos durante a fase de execuo (runtime) ocorrem
quando se executa o interpretador java, e so muito mais
difceis de localizar e consertar.
A mensagem impressa geralmente um "stack trace" e
mostra todo o "caminho" percorrido pelo erro
Relaciona mtodos e classes da sua aplicao e classes da API Java
que sua aplicao usa (direta ou indiretamente)
Nem sempre mostra a linha de cdigo onde o erro comeou
O incio do trace geralmente contm informaes mais teis
Erros de runtime nem sempre indicam falhas no software
Freqntemente se devem a causas externas: no existncia de
arquivos externos, falta de memria, falha em comunicao de rede
38
Erros de execuo comuns e possveis causas
Exception in thread "main": NoClassDefFoundError: Classe: a
classe "Classe" no foi encontrada no CLASSPATH.
O CLASSPATH no inclui todos os diretrios requeridos
O nome da classe foi digitado incorretamente ou requer pacote
Exception in thread "main": NoSuchMethodError: main: o
sistema tentou chamar main() mas no o encontrou.
A classe no tem mtodo main() (talvez no seja executvel)
Confira assinatura do main: public static void main(String[])
ArrayIndexOutOfBoundsException: programa tentou acessar
vetor alm dos limites definidos.
Erro de lgica com vetores
Aplicao pode requerer argumentos de linha de comando
NullPointerException: referncia para objeto nula
Varivel de tipo objeto foi declarada mas no inicializada
Vetor foi declarado mas no inicializado
39
Exemplos de erros de tempo de execuo
1. Na linha 13, est havendo uma referncia a um ndice de um vetor. Esse ndice tenta
acessar uma posio inexistente no vetor. Neste caso especfico, o erro pode ser evitado
passando-se um parmetro aps o nome da classe na linha de comando, porm a
aplicao pouco robusta pois no prev que o erro possa acontecer.
2. A classe no foi encontrada. Pode ser que ela no esteja no CLASSPATH. Neste caso
especfico o interpretador nos sugere que o nome pode est errado. Para consertar, basta
chamar a classe pelo nome correto: Hello. O Stack Trace mostra que esse erro teve origem
em outras classes, mas foi nossa classe que, na verdade, o provocou. 40
Exemplos de erros de tempo de execuo (2)
43
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
44
Java 2 Standard Edition
Programao
orientada a objetos
em Java
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
Conceitos de programao orientada a objetos existentes na
sintaxe da linguagem Java
Artefatos: pacote, classe, objeto, membro, atributo, mtodo,
construtor e interface
Caractersticas OO em Java: abstrao, encapsulamento, herana e
polimorfismo
Sintaxe Java para construo de estruturas de dados
Tipos de dados primitivos
Componentes de uma classe
Construo de aplicaes simples em Java
Como construir uma classe Java (um tipo de dados) contendo
mtodos, atributos e construtores
Como construir e usar objetos
Este mdulo longo e aborda muitos assuntos que sero
tratados novamente em mdulos posteriores
2
Por que OO importante?
12
Exemplos de tipos primitivos e literais
Literais de caracter:
char c = 'a';
char z = '\u0041'; // em Unicode
Literais inteiros
int i = 10; short s = 15; byte b = 1;
long hexa = 0x9af0L; int octal = 0633;
Literais de ponto-flutuante
float f = 123.0f;
double d = 12.3;
double g = .1e-23;
Literais booleanos
boolean v = true;
boolean f = false;
Literais de string (no tipo primitivo - s uma referncia)
String s = "abcde";
Literais de vetor (no tipo primitivo - v uma referncia)
int[] v = {5, 6};
13
O que uma classe?
Classes so uma especificao para objetos
Uma classe representa um tipo de dados complexo
Classes descrevem
Tipos dos dados que compem o objeto (o que podem armazenar)
Procedimentos que o objeto pode executar (o que podem fazer)
Instncias da classe Casa (objetos)
Classe Casa c1 = new Casa();
c1.numero = 12;
Casa 12
c1.cor = Color.yellow;
CDPlayer
Em Java
Tipo
(...) Classe Java (tipo)
liga()
desliga() CDPlayer cd1; Referncia
Interface
selecionaFaixa(int) cd1 = new CDPlayer();
Formato das avana()
mensagens retorna() cd1.liga(); Criao de objeto
que se pode executa() cd1.selecionaFaixa(3);
enviar para pausa() cd1.executa();
um objeto para() (...) Envio de mensagem
* Notao UML 24
Agregao, composio e associao
Composio: um trem formado por locomotiva e vages
1
Locomotiva
Trem
1..* Vago
25
Herana (reuso de interface)
Um carro um veculo
Veculo representao
UML
Carro
representao UML
Fusca Porsche
detalhada de Veculo
26
Extenso e sobreposio
Extenso
Acrescenta novos Veculo
mtodos aos j herdados Veculo getVelocidade():float
(Um objeto do tipo getPassageiros():int
Carro tem mais mtodos acelera()
Carro
que um objeto do tipo freia()
abastece()
Veiculo) fechaPorta()
abrePorta()
Sobreposio
Carro
Redefine os mtodos
implementados
Fusca Porsche previamente (Um objeto do
abrePorta() freia() tipo Fusca tem o mesmo
getVelocidade() nmero de mtodos de um
objeto do tipo Carro
27
Polimorfismo
31
Menor classe utilizvel em Java
32
Smbolos essenciais
Separadores
{ ... } chaves: contm as partes de uma classe e delimitam blocos de
instrues (em mtodos, inicializadores, estruturas de controle, etc.)
; ponto-e-vrgula: obrigatria no final de toda instruo simples ou
declarao
Identificadores
Nomes usados para representar classes, mtodos, variveis (por
exemplo: desenha, Casa, abrePorta, Circulo, raio)
Podem conter letras (Unicode) e nmeros, mas no podem comear
com nmero
Palavras reservadas
So 52 (assert foi includa na verso 1.4.0) e consistem de 49
palavras-chave e literais true, false e null.
Exemplos de palavras-chave so public, int, class, for e void
A maior parte dos editores de cdigo Java destaca as palavras
reservadas
33
Para que serve uma classe
34
Uma unidade de compilao
Casa.java
class Garagem {
... Por causa da declarao package
} o nome completo destas classes
cidade.Garagem
interface Fachada { cidade.Fachada e
... cidade.Casa
}
35
O que pode conter uma classe
Sintaxe bsica
[mod]* tipo identificador ( [tipo arg]* ) [throws exceo*] { ... }
Chave
[mod]* zero ou mais modificadores separados por espaos
tipo tipo de dados retornado pelo mtodo
identificador nome do mtodo
[arg]* zero ou mais argumentos, com tipo declarado,
separados por vrgula
[throws exceo*] declarao de excees
Exemplos
public static void main ( String[] args ) { ... }
private final synchronized
native int metodo (int i, int j, int k) ;
String abreArquivo ()
throws IOException, Excecao2 { ... }
38
Atributos de dados
Contm dados
Devem ser declaradas com tipo
Podem ser pr-inicializadas (ou no)
Podem conter modificadores
public class Livro {
private String titulo;
public class Produto { private int codigo = 815;
public static int total = 0; ...
public int serie = 0; public int mostraCodigo() {
public Produto() { return codigo;
serie = serie + 1; }
total = serie; }
} class Casa {
} class Data { static Humano arquiteto;
int dia; int numero;
int mes; Humano proprietario;
int ano; Doberman[] guardas;
} }
39
Sintaxe de declarao de atributos
Sintaxe bsica
[modificador]* tipo identificador [= valor] ;
Chave
[modificador]* zero ou mais modificadores (de acesso, de
qualidade), separados por espaos: public, private, static, transient,
final, etc.
tipo tipo de dados que a varivel (ou constante) pode conter
identificador nome da varivel ou constante
[= valor] valor inicial da varivel ou constante
Exemplo
protected static final double PI = 3.14159 ;
int numero;
40
Construtores
Tm sempre o mesmo nome que a classe
Contm procedimentos entre chaves, como os mtodos
So chamados apenas uma vez: na criao do objeto
Pode haver vrios em uma mesma classe
So identificados pelo nmero e tipo de argumentos
Nunca declaram tipo de retorno
public class Produto {
public static int total = 0;
public int serie = 0;
public Produto() { public class Livro {
serie = total + 1; private String titulo;
total = serie; public Livro() {
} titulo = "Sem ttulo";
} }
public Livro(String umTitulo) {
titulo = umTitulo;
}
}
41
Sintaxe de construtores
42
Exemplo
43
Exemplo: um crculo
44
Usando crculos
45
Herana
Circulo
+x: int
+y: int
+raio: int
+PI: 3.14159
47
Vetores
Vetores so colees de objetos ou tipos primitivos
Os tipos devem ser conversveis ao tipo em que foi declarado o vetor
int[] vetor = new int[10];
Cada elemento do vetor inicializado a um valor default,
dependendo do tipo de dados:
null, para objetos
0, para int, long, short, byte, float, double
Unicode 0, para char
false, para boolean
Elementos podem ser recuperados a partir da posio 0:
int elemento_1 = vetor[0];
int elemento_2 = vetor[1];
48
Vetores
De tipos primitivos
pilha heap pilha heap class Point {
public int x;
# 0 # 23 public int y;
}
0 0
v[0] = 23;
0 v[2] = 52; 52 Point
+x: int
int[] v = new int[3]; +y: int
inicializao dos
v objeto do tipo (int[]) cria um vetor
elementos
De objetos (Point uma classe, com membros x e y, inteiros)
pilha heap pilha heap heap
# null # # 0 p[0].x
0 p[0].y
null null
Point[] p = new Point[2]; p[0] = new Point();
cria um vetor cria um objeto Point
p objeto do tipo (Point[]) 49
Inicializao de vetores
50
A propriedade length
51
Vetores multidimensionais
52
Exerccios
53
Escopo de variveis
54
Exemplo
public class Circulo {
55
Membros de instncia vs.
componentes estticos (de classe)
Componentes estticos
Os componentes de uma classe, quando declarados
'static', existem independente da criao de objetos
S existe uma cpia de cada varivel ou mtodo
Membros de instncia
mtodos e variveis que no tenham modificador 'static'
so membros do objeto
Para cada objeto, h uma cpia dos mtodos e variveis
Escopo
Membros de instncia no podem ser usados dentro de
blocos estticos: preciso obter antes, uma referncia para
o objeto
56
Exemplos
:Circulo
main() no
Membros de instncia s existem faz parte do
+x: 0
+y: 0
se houver um objeto objeto! +raio: 0
area():double
Errado! Certo!
public class Circulo { membros de public class Circulo {
instncia tem que
public int raio; public int raio; criar pelo
public int x, y; Pode. Porque area() public int x, y; menos um
faz parte do objeto! objeto!
public double area() { public double area() {
return Math.PI * raio * raio; return Math.PI * raio * raio;
} }
public static void main(String[] a){ public static void main(String[] a){
raio = 3; qual raio? Circulo c = new Circulo();
double z = area(); existe? c.raio = 3;
raio de c
} double z = c.area();
} qual area? } area() de c
No pode. No existe existe? }
objeto em main()!
57
Variveis locais vs.
variveis de instncia
Variveis de instncia ...
sempre so automaticamente inicializadas
so sempre disponveis no interior dos mtodos de instncia e
construtores
Variveis locais ...
sempre tm que ser inicializadas antes do uso
podem ter o mesmo identificador que variveis de instncia
neste caso, preciso usar a palavra reservada this para fazer
a distino
class Circulo { varivel de instncia
private int raio;
public void mudaRaio(int raio) {
this.raio = raio; varivel local
}
}
58
Comentrios
60
Convenes de cdigo
Toda a documentao Java usa uma conveno para nomes
de classes, mtodos e variveis
Utiliz-la facilitar a manuteno do seu cdigo!
Classes, construtores e interfaces
use caixa-mista com primeira letra maiscula, iniciando novas
palavras com caixa-alta. No use sublinhado.
ex: UmaClasse, Livro
Mtodos e variveis
use caixa mista, com primeira letra minscula
ex: umaVariavel, umMetodo()
Constantes
use todas as letras maisculas. Use sublinhado para separar as
palavras
ex: UMA_CONSTANTE
61
Exerccios
62
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
63
Java 2 Standard Edition
Configurao do ambiente
JEdit + Ant
SDK e JRE
Digite java -version
O resultado deve ser o nmero da verso instalada
Digite javac
O resultado deve ser uma mensagem de erro com a lista de
opes vlidas para o javac.
Ant
Digite ant
O resultado deve ser a mensagem de erro Buildfile: build.xml
does no exist
JEdit
Windows: clique duas vezes no cone criado
Unix: rode o executvel no diretrio onde foi instalado
4
JEdit: plug-ins
O JEdit, sem plug-ins, um simples editor de textos
Com plug-ins pode ter mais recursos e melhor integrao que
muitos IDEs comerciais
Para instalar plug-ins (precisa estar conectado Internet)
a) Inicie o JEdit
b) Selecione o menu "Plugins" / "Plugin Manager" (ou cone )
c) Aperte o boto "Install Plugins". Aps a conexo ser mostrada
uma lista dos plug-ins disponveis. Clique em cada um para ver sua
descrio.
d) Selecione o radio-button "Install in system plug-in directory"
e) Marque os plug-ins desejados e aperte "Install"
Instale pelo menos...
AntFarm, Buffer Tabs, Console, Drag & Drop, Error List, Java Style,
JBrowse, Project Viewer, Templates, XML
5
Personalizao do JEdit (1)
Reinicie o JEdit aps a instalao dos plug-ins
Se algum plug-in instalado apresentar erro, uma mensagem
ir ser exibida na abertura do JEdit. Voc pode
corrigir o erro (a mensagem explica como ou a causa)
desinstalar o plug-in (no menu Plugins)
Docking
Coloca plug-ins frequentemente usados nas laterais da rea
de trabalho para fcil utilizao
Selecione o menu "Utilities" / "Global Options"
Na opo jEdit Options / Docking, selecione a segunda
configurao de tela:
Mude a posio default dos seguintes plug-ins:
AntFarm: left JBrowse: left
Console: bottom Project: left
ErrorList: bottom XMLTree: left
6
Personalizao do JEdit (2)
ErrorList
Menu Global Options / Plugin Options / ErrorList
Marque "automatically display on error"
JBrowse
Menu Global Options / Plugin Options / JBrowse
Marque "Display Status Bar", "Automatic parse" e "Sort"
Numerao de linhas
Menu Global Options / jEdit Options / Gutter
Marque "Line Numbering"
Tabulao
Menu Global Options / jEdit Options / Editing
Em "Tab Width" e "Indent Width" coloque "4"
8
Resultado da personalizao
9
Como usar o Console / ErrorList
11
Como criar um template
13
Problemas
Os plug-ins do JEdit so desenvolvidos por programadores
independentes e podem no ter a mesma qualidade ou
utilidade dos recursos nativos do JEdit
Alguns contm bugs (falham ocasionalmente)
Alguns poderiam ser melhores
A integrao entre os plug-ins inferior desejvel
Ainda no h plugins para desenho de GUI, construo de EJBs, etc.
Solues
1) Esperar verses mais novas dos plug-ins (a atualizao requer
apenas apertar um boto (Update Plugins) no Plugin Manager
2) Enviar sugestes aos autores dos plug-ins
3) Escrever macros, scripts do Ant (EJB, arquivos WAR, etc.)
4) Participar do projeto open-source: baixar o cdigo-fonte Java, fazer
as alteraes desejadas e enviar patches aos autores
5) Escrever novos plug-ins (integrando ou no com os existentes)
6) Usar outro IDE
14
Alguns IDEs alternativos
Open source
Projeto Eclipse
NetBeans
Jext (Java Text Editor - similar ao JEdit) - no edita GUI
Free
Borland JBuilder Personal Edition
Sun Fort for Java Community Edition (baseado no NetBeans)
Leves
JCreator Servem para aumentar a
produtividade: evite us-los para
Kawa
aprender Java (prefira um editor
IDEA de textos como oJEdit ou Jext)
Comerciais Teste cada um com as
IBM Visual Age / WebSphere Studio ferramentas e recursos que voc
Borland JBuilder costuma usar e veja o que melhor
Sun Fort for Java se adapta s suas necessidades.
15
Exerccios
argonavis.com.br
17
Java 2 Standard Edition
Como usar a
documentao
da API Java 2
Helder da Rocha
www.argonavis.com.br
1
Documentao
Aprender a usar a documentao essencial para
quem deseja desenvolver aplicaes em Java
A documentao da linguagem, ferramentas e API um
download separado do SDK
Para instalar a documentao Java, abra o arquivo ZIP
na raiz da sua instalao Java
A documentao ser instalada abaixo do subdiretrio docs/
da instalao Java ($JAVA_HOME)
%JAVA_HOME%\docs\ (ex: c:\jdk1.4.0\docs/)
$JAVA_HOME/docs/ (ex: /usr/java/j2sdk1.4.0/docs/)
A documentao da API Java est em
$JAVA_HOME/docs/api/index.html
Manuais, tutoriais sobre recursos da linguagem em
$JAVA_HOME/docs/index.html
2
Documentao Descrio da classe
(escolhida na janela B)
- hierarquia
Se um mtodo no for encontrado na - documentao detalhada,
classe mostrada, procure nas superclasses mtodos, variveis, etc.
(use as referncias cruzadas)
Lista de pacotes A
B C
Lista de classes e
interfaces do
pacote escolhido
na janela (A)
3
Como usar a documentao (2)
Como usar
a documentao
Links para esta pgina Links para esta pgina
- lista de classes internas - documentao de campos de dados
- lista de campos de dados - documentao de construtores
- lista de construtores - documentao de mtodos
- lista de mtodos
4
Como usar a documentao (3)
Interfaces que so
implementadas
nesta classe
5
Como usar a documentao (4)
Tipos de retorno
Parmetros
6
Documentao de um construtor
Assinatura do construtor
(mostra tipos dos parmetros)
Descrio de cada
parmetro
Mtodos relacionados
parmetros do mtodo
tipo de
retorno descrio do
mtodo
detalhes sobre os
parmetros
10
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
11
Java 2 Standard Edition
Tipos, literais,
operadores e
controle de fluxo
Helder da Rocha
www.argonavis.com.br
1
Operadores e controle de fluxo da execuo
4
Precedncia
DaE separadores [] . ; , ()
EaD operadores unrios new (cast) +expr -expr ~ !
EaD incr/decr pr-fixado ++expr -expr
EaD multiplicativo * / %
EaD aditivo + -
EaD deslocamento << >> >>>
EaD relacional < > >= <= instanceof
EaD igualdade == !=
EaD AND &
EaD XOR ^
EaD OR |
EaD E lgico &&
EaD OU lgico ||
DaE condicional ?:
DaE atribuio = += -= *= /= %= >>= <<= >>>= &= ^= !=
EaD incr/decr ps fixado expr++ expr--
6
Literais de caracteres em Java
\b Retrocesso (backspace)
\t Tabulao
\n Nova Linha (new line)
\f Alimentao de Formulrio (form feed)
\r Retorno de Carro (carriage return)
\" Aspas
\' Aspa
\\ Contra Barra
\nnn O caractere correspondente ao valor octal nnn, onde nnn um
valor entre 000 e 0377.
\unnnn O caractere Unicode nnnn, onde nnnn de um a quatro dgitos
hexadecimais. Seqncias Unicode so processadas antes das
demais seqncias.
7
Atribuio
A atribuio realizada com o operador =
= serve apenas para atribuio no pode ser usado em
comparaes (que usa ==)!
Copia o valor da varivel ou constante do lado direito para a varivel
do lado esquerdo.
x = 13; // copia a constante inteira 13 para x
y = x; // copia o valor contido em x para y
A atribuio copia valores
O valor armazenado em uma varivel de tipo primitivo o valor do
nmero, caractere ou literal booleana (true ou false)
O valor armazenado em uma varivel de tipo de classe (referncia
para objeto) o ponteiro para o objeto ou null.
Conseqentemente, copiar referncias por atribuio no copia
objetos mas apenas cria novas referncias para o mesmo objeto!
8
Passagem de valores via atribuio
9
Operadores matemticos
+ adio
- subtrao
* multiplicao
/ diviso
% mdulo (resto)
Operadores unrios
-n e +n (ex: -23) (em uma expresso: 13 + -12)
Melhor usar parnteses: 13 + (-12)
Atribuio com operao
+=, -=, *=, /=, %=
x = x + 1 equivale a x += 1
10
Incremento e decremento
Exemplo
int a = 10;
int b = 5;
Incrementa ou decrementa antes de usar a varivel
int x = ++a; // a contm 11, x contm 11
int y = --b; // b contm 4, y contm 4
A atribuio foi feita DEPOIS!
Incrementa ou decrementa depois de usar a varivel
int x = a++; // a contm 11, x contm 10
int y = b--; // b contm 4, y contm 5
A atribuio foi feita ANTES!
11
Operadores relacionais
== igual
!= diferente
< menor
<= menor ou igual
> maior
>= maior ou igual
&& E (and)
|| Ou (or)
! Negao (not)
& and
| or
^ xor (ou exclusivo)
~ not
14
Operadores de deslocamento
16
Operador de concatenao
17
instanceof
boolean (8 bits)
byte (8 bits)
19
Converso de tipos primitivos
Java converter um tipo de dados em outro sempre que isto
for apropriado
As converses ocorrero automaticamente quando houver
garantia de no haver perda de informao
Tipos menores em tipos maiores
Tipos de menor preciso em tipos de maior preciso
Tnteiros em ponto-flutuante
Converses automticas double d = 12.3;
byte byte b = 10; double
char c = 'A';
char short s2 = b;
short
converses legais
float f = 12.3f; int i2 = c;
short s = 20; int i3 = s;
float
long m2 = i;
int float f2 = m;
Algumas
int i = 100;
long m = 200L; double d2 = f;
long
20
Converso de referncias
23
Controle de execuo
24
true e false
25
if-else
Sintaxe
if (expresso booleana) if (expresso booleana) {
instruo_simples; instrues
} else if (expresso booleana) {
if (expresso booleana) { instrues
instrues } else {
} instrues
}
Exemplo
if ( ano < 0) {
System.out.println("No um ano!");
} else if ( (ano%4==0 && ano%100!=0) || (ano%400==0) ) {
System.out.println(" bissexto!");
} else {
System.out.println("No bissexto!");
}
26
return
27
while e do-while
Sintaxe
while (expreso booleana ) do
{ {
instrues; instrues;
} } while (expreso booleana );
Exemplos
int x = 0;
while (x < 10) {
System.out.println ("item " + x); while ( true ) {
x++; if (obj.z == 0) {
} break;
}
int x = 0; }
do {
System.out.println ("item " + x);
x++; loop
} while (x < 10); infinito!
28
for
Sintaxe
for ( inicializao; for ( inicializao;
expresses booleanas; expresses booleanas;
passo da repetio ) passo da repetio )
{
instrues; instruo_simples;
}
Exemplos
for ( int x = 0; x < 10; x++ ) { for ( ; ; ) {
System.out.println ("item " + x); if (obj.z == 0) {
} break;
}
for ( int x = 0, int y = 25; }
x < 10 && (y % 2 == 0);
x++, y = y - 1 ) {
System.out.println (x + y); loop
} infinito!
29
break e continue
break: interrompe a execuo do bloco de repetio.
Continua com a prxima instruo, logo aps o bloco.
continue: interrompe a execuo da iterao
Testa a condio e reinicia o bloco com a prxima iterao.
while (!terminado) {
passePagina();
if (alguemChamou == true) {
break; // caia fora deste loop
}
if (paginaDePropaganda == true) {
continue; // pule esta iterao
}
leia();
}
restoDoPrograma();
30
break e continue com rtulos
break e continue sempre atuam sobre o bloco de repetio onde
so chamados
Em blocos de repetio contidos em outros blocos, pode-se usar
rtulos para fazer break e continue atuarem em blocos externos
Os rtulos s podem ser usados antes de do, while e for
As chamadas s podem ocorrer dentro de blocos de repetio.
Exemplo:
switch(seletor_inteiro) { switch(letra) {
case valor_inteiro_1 : case 'A' :
instrues; System.out.println("A");
break; break;
case valor_inteiro_2 : case 'B' :
instrues; System.out.println("B");
break; break;
... uma constante ...
default: inteira (inclui default:
instrues; char) System.out.println("?");
} }
32
Exerccios
1. Escreva um programa Quadrados que leia um nmero da
linha de comando e imprima o quadrado de todos os
nmeros entre 1 e o nmero passado.
Para converter de String para int, use:
int numero = Integer.parseInt("10");
2. Use o JOptionPane (veja documentao) e repita o
exerccio anterior recebendo os dados atravs da janela de
entrada de dados (programa WinQuadrados)
Use JOptionPane.showInputDialog(string) de
javax.swing para ler entrada de dados
Use JOptionPane.showMessageDialog(null, msg) para
exibir a sada de dados
3. Se desejar, use o build.xml do Ant disponvel que executa
Quadrados e WinQuadrados
33
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
34
Java 2 Standard Edition
Como criar
classes e objetos
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados
2
Criao e destruio de objetos
Para a criao de novos objetos, Java garante que cada classe
tenha um construtor
O construtor default recebe zero argumentos
Faz apenas inicializao da superclasse
Programador pode criar um construtor explicitamente e
determinar suas operaes de inicializao
Inicializao pela superclasse continua garantida
Construtor default deixa de existir
Objetos so destrudos automaticamente pelo sistema,
porm, sistema no faz finalizao
Mtodo finalize(), herdado de Object, teoricamente permite ao
programador controlar a finalizao de qualquer objeto
finalize() no funciona 95% das vezes - no use! Se precisar de
finalizao, coloque seu cdigo em um bloco try {...} finally {...}
3
Construtores e sobrecarga
Construtores default (sem argumentos) s existem quando
no h construtores definidos explicitamente no cdigo
A criao de um construtor explcito substitui o construtor
fornecido implicitamente
Uma classe pode ter vrios construtores (isto se chama
sobrecarga de nomes)
Distino feita pelo nmero e tipo de argumentos (ou seja,
pela assinatura do construtor)
A assinatura a identidade do mtodo. pela assinatura que
ele se distingue dos outros mtodos. Consiste de
Tipo de retorno
Nome
Tipo de argumentos
Quantidade de argumentos
4
Sobrecarga de mtodos
Uma classe tambm pode ter vrios mtodos com o
mesmo nome (sobrecarga de nomes de mtodos)
Distino feita pela assinatura: tipo e nmero de
argumentos, assim como construtores
Apesar de fazer parte da assinatura, o tipo de retorno no
pode ser usado para distinguir mtodos sobrecarregados
Na chamada de um mtodo, seus parmetros so
passados da mesma forma que em uma atribuio
Valores so passados em tipos primitivos
Referncias so passadas em objetos
H promoo de tipos de acordo com as regras de
converso de primitivos e objetos
Em casos onde a converso direta no permitida,
preciso usar operadores de coero (cast)
5
Distino de mtodos na sobrecarga
6
this()
7
super()
10
Exemplo (1)
class Bateria {
Mquina
public Bateria() {
System.out.println("Bateria()"); ligar()
}
}
class Teclado {
public Teclado() {
Notebook
System.out.println("Teclado()");
} Bateria
} codigo: 12345
ligar()
11
Exemplo (2)
Detalhes
N2.
N2. varivel
varivel cdigo
cdigo iniciaizada:
iniciaizada: 00
N3.
N3. varivel
varivel bateria
bateria iniciaizada:
iniciaizada: null
null
N4. super() chamado (Computador)
N4. super() chamado (Computador)
C1.
C1. varivel
varivel teclado
teclado iniciaizada:
iniciaizada: null
null O1.
O1. Campos
Campos inicializados
inicializados
C2. varivel tela iniclaizada: null
C2. varivel tela iniclaizada: null O2.
O2. Corpo
Corpo de
de Object()
Object() executado
executado
C3.
C3. super()
super() chamado
chamado (Maquina)
(Maquina)
M2.
M2. super()
super() chamado
chamado (Object)
(Object) Efeito de Object
new Notebook()
M2.
M2. Corpo
Corpo de de Maquina()
Maquina() executado:
executado:
println()
println() ee this.ligar()
this.ligar()
C4:
C4: Construtor
Construtor de
de Teclado
Teclado chamado
chamado Mquina
ligar()
Tk1:
Tk1: super()
super() chamado
chamado (Object)
(Object)
C5.
C5. referncia
referncia teclado
teclado inicializada
inicializada
C6: Computador Teclado
C6: Construtor
Construtor dede Tela
Tela chamado
chamado
teclado
Te1:
Te1: super()
super() chamado
chamado (Object)
(Object) tela
C7: Tela
C7: referncia
referncia tela
tela inicializada
inicializada
C8: Corpo de Computador()
C8: Corpo de Computador()
executado:
executado: println()
println()
Notebook
N5.
N5. Construtor
Construtor de
de Bateria
Bateria chamado
chamado
bateria Bateria
B1:
B1: super()
super() chamado
chamado (Object)
(Object) codigo: int
N6: ligar()
N6: varivel
varivel cdigo
cdigo inicializada:
inicializada: 12345
12345
N7:
N7: referncia
referncia bateria
bateria inicializada
inicializada
N8.
N8. Corpo
Corpo dede Notebook()
Notebook() executado:
executado: println()
println() 15
N1. new Notebook() chamado
N2. varivel cdigo iniciaizada: 0
N3. varivel bateria iniciaizada: null
Problemas com
N4. super() chamado (Computador)
C1. varivel teclado iniciaizada: null
inicializao
C2. varivel tela iniclaizada: null
C3. super() chamado (Maquina)
M2. super() chamado (Object) mtodo ligar() chamado no
M2. Corpo de Maquina() executado: construtor de Maquina, mas ...
println() e this.ligar()
... a verso usada a
C4: Construtor de Teclado chamado
implementao em Notebook,
Tk1: super() chamado (Object)
que imprime o valor de cdigo
C5. referncia teclado inicializada
C6: Construtor de Tela chamado (e no a verso de Maquina
Te1: super() chamado (Object) como aparenta)
C7: referncia tela inicializada Como cdigo ainda no foi
C8: Corpo de Computador()
executado: println()
inicializado, valor impresso 0!
N5. Construtor de Bateria chamado
1. Preparao
a) Crie um novo projeto para este mdulo
b) Copie os arquivos Ponto e Circulo dos exerccios feitos
no Captulo 2 (se voc no os fez, use os da soluo)
2. Crie mais um construtor em Crculo
a) Crie um construtor default, que represente um crculo
na origem (0,0) com raio unitrio
b) Use this() em dois dos trs construtores de Circulo
3. Crie uma classe Ponto3D que estenda Ponto.
Use, se necessrio, a chamada correta de super() para
permitir que a classe seja compilada
4. Altere TestaCirculo para testar as novas classes
19
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
20
Java 2 Standard Edition
Pacotes e
Encapsulamento
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
2
API Java 2
4
java.lang.Object
throws CloneNotSupportedException
public void wait() throws InterruptedException
public void notify()
Cloneable
Usada para permitir que um objeto seja clonado. No
possui declarao de mtodos
Como fazer:
class SuaClasse implements Cloneable
class SuaClasse extends SupClasse implements Cloneable
7
Como estender Object
H vrios mtodos em Object que devem ser
sobrepostos pelas subclasses
A subclasse que voc est estendendo talvez j tenha
sobreposto esses mtodos mas, alguns deles, talvez
precisem ser redefinidos para que sua classe possa ser
usada de forma correta
Mtodos que devem ser sobrepostos
boolean equals(Object o): Defina o critrio de
igualdade para seu objeto
int hashCode(): Para que seu objeto possa ser
localizado em Hashtables
String toString(): Sobreponha com informaes
especficas do seu objeto
Object clone(): se voc desejar permitir cpias do seu
objeto
8
Como sobrepor equals()
9
instanceof e exemplo com equals()
11
Exerccio
13
Como sobrepor clone()
Criao e converso
Integer n = new Integer(15); Mais
Integer m = Integer.valueOf(15); eficiente
int q = n.intValue();
Para converso de String em tipos primitivos
int i = Integer.parseInt("15");
double i = Double.parseDouble("15.9");
boolean b =
(new Boolean("true")).booleanValue();
19
Controle e acesso ao sistema
20
Excees
21
Identificao em tempo de execuo
A classe Class contm mtodos que permitem enxergar a
interface pblica de uma classe
Saber quais mtodos existem para serem chamados
Saber quais os parmetros e tipos dos parmetros dos mtodos
Saber quais os construtores e campos pblicos
Como obter um objeto class (ex: classe MinhaClasse):
Class cobj = instancia.getClass();// Quando no se sabe a classe
Class cobj = MinhaClasse.class; // Quando no se tem instncia
Com essas informaes, possvel carregar uma classe
compilada, em tempo de execuo, e us-la
H mtodos para carregar uma classe pelo nome, passado como String
( Class cobj = Class.forName(); )
H mtodos ( cobj.newInstance(); ) para criar objetos a partir
de objeto Class obtido a partir do nome da classe
Reflection API!
22
Outros pacotes
27
Varivel CLASSPATH e -cp
Em uma instalao tpica, CLASSPATH contm apenas "."
Pacotes iniciados no diretrio atual (onde o interpretador java
executado) so encontrados (podem ter suas classes importadas)
Classes localizadas no diretrio atual so encontradas.
Geralmente usada para definir caminhos para uma aplicao
Os caminhos podem ser diretrios, arquivos ZIP ou JARs
Pode acrescentar novos caminhos mas no pode remover caminhos do
Classpath do JRE (bsico e extenses)
A opo -cp (-classpath) substitui as definies em CLASSPATH
Exemplo de definio de CLASSPATH
no DOS/Windows
set CLASSPATH=extras.jar;.;c:\progs\java
java -cp %CLASSPATH%;c:\util\lib\jsw.zip gui.Programa
no Unix (sh, bash)
CLASSPATH=extras.jar:.:/home/mydir/java
export CLASSPATH
java -classpath importante.jar:$CLASSPATH Programa
28
Classpath do JRE
Colocar JARs no subdiretrio ext ou classes e pacotes no
diretrio classes automaticamente os inclui no Classpath para
todas as aplicaes da JVM
Carregados antes das variveis CLASSPATH e -cp
Evite usar: pode provocar conflitos. Coloque nesses diretrios apenas os
JARs e classes usados em todas suas aplicaes
Exemplo: suponha que o Classpath seja
Classpath JRE: %JAVA_HOME%\jre\lib\rt.jar;
Classpath Extenso JRE: %JAVA_HOME%\jre\lib\ext\z.jar
Varivel de ambiente CLASSPATH: .;c:\programas;
e que uma classe, localizada em c:\exercicio seja executada. Se
esta classe usar a classe arte.fr.Monet o sistema ir procur-la
em
1. %JAVA_HOME%\jre\lib\rt.jar\arte\fr\Monet.class
2. %JAVA_HOME%\jre\lib\ext\z.jar\arte\fr\Monet.class
3. c:\exerccio\arte\fr\Monet.class
4. c:\programas\arte\fr\Monet.class
29
Como criar e usar um pacote
Para criar um pacote preciso
1. Declarar o nome do pacote em cada unidade de
compilao
2. Guardar a classe compilada em uma localidade (caminho)
compatvel com o pacote declarado
O "caminho de pontos" de um pacote, por exemplo,
simulador.cidade.aeroporto corresponde a um caminho de
diretrios simulador/cidade/aeroporto
Para usar um pacote (usar suas classes) preciso
1. Colocar a raiz do pacote (pasta "simulador", por exemplo)
no Classpath
2. Importar as classes do pacote (ou usar suas classes pelo
nome completo): A instruo import opcional
30
Arquivos JAR
Geralmente, aplicaes Java so distribudas em
arquivos JAR
So extenses do formato ZIP
armazenam pacotes e preservam a hierarquia de diretrios
Para usar um JAR, preciso inclu-lo no Classpath
via CLASSPATH no contexto de execuo da aplicao, ou
via parmetro -classpath (-cp) do interpretador Java, ou
copiando-o para $JAVA_HOME/jre/lib/ext
Para criar um JAR
jar cvf classes.jar C1.class C2.class xyz.gif abc.html
jar cf mais.jar -C raiz_onde_estao_pacotes/ .
Para abrir um JAR
jar xvf classes.jar
Para listar o contedo de um JAR
jar tvf classes.jar
31
Criao de bibliotecas
32
Uma biblioteca (simples)
List.java
package com.acme.util;
public class List {
public List() {
System.out.println("com.acme.util.List");
}
}
Vector.java
package com.acme.util;
public class Vector {
public Vector() {
System.out.println("com.acme.util.Vector");
}
}
33
Onde armazenar
c:\programas\java\classes\
com
acme
Esta pasta deve estar no
CLASSPATH util
Vector.class List.class
pacote
com.acme.util
34
Ou em um JAR
utils.jar
com
O caminho at a localizao
do JAR deve estar no acme
CLASSPATH (pode ser
especificado no momento util
da execuo:
java -classpath
%CLASSPATH%;utils.jar
NomeProgExecutavel Vector.class List.class
35
Como usar a biblioteca
Programa que usa biblioteca pode estar em qualquer lugar
preciso que caminho at a biblioteca (pasta onde comea pacote ou
caminho at JAR) esteja definido no Classpath
CLASSPATH=%CLASSPATH%;c:\programas\java\classes
CLASSPATH=%CLASSPATH%;c:\jars\utils.jar
38
Exerccio
1. Copie a aplicao contendo os Pontos e Circulos
para um novo projeto
a) Declare o Ponto e o Circulo como pertencentes a um
pacote chamado graficos
b) Importe esses pacotes de TestaCirculos
c) Execute a aplicao
d) Empacote tudo em um JAR
e) Torne o JAR executvel (para usar java -jar arquivo.jar)
2. Acrescente o alvo jar no seu build.xml para que
seja possvel gerar o JAR e Manifest
automaticamente:
Veja exemplo no captulo 8!
39
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
40
Java 2 Standard Edition
Gerenciamento de
projetos com o
Apache Ant
Helder da Rocha (helder@acm.org) argonavis.com.br1
Sobre este mdulo
3
Para que serve?
Ant
<xml>
<xml>
<xml> <cvs> CVS
<xml> *.java
build.xml
<javac> <javadoc>
subproj <ant>
<xml>
<xml>
*.class *.html
build.xml
*.java
<jar> <junit>
<javac>
<jar> Testes
*.class
docs.zip
app.jar
<ftp>
<copy> <mimemail>
6
Buildfile
O buildfile um arquivo XML: build.xml (default)
Principais elementos
<project default="alvo_default">
Elemento raiz (obrigatrio): define o projeto.
<target name="nome_do_alvo">
Coleo de tarefas a serem executadas em seqncia
Deve haver pelo menos um <target>
<property name="nome" value="valor">
pares nome/valor usados em atributos dos elementos do
build.xml da forma ${nome}
propriedades tambm podem ser definidas em linha de
comando (-Dnome=valor) ou lidas de arquivos externos
(atributo file)
tarefas (mais de 130) - dentro dos alvos.
<javac>, <jar>, <java>, <copy>, <mkdir>, ...
7
Buildfile (2)
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- Compila diversos arquivos .java --> Propriedades
<project default="compile" basedir=".">
<property name="src.dir" value="${basedir}/src" />
<property name="build.dir" value="build" />
<target name="init">
<echo> Criando diretrio </echo>
<mkdir dir="${build.dir}" />
</target>
Alvos
<target name="compile" depends="init"
description="Compila os arquivos-fonte">
<javac srcdir="${src.dir}" destdir="${build.dir}">
<classpath>
<pathelement location="${build.dir}" />
Tarefas </classpath>
</javac>
</target>
</project>
8
Exemplo
ANTES
init: util
[echo] Criando diretrio Tiracentos.java
[mkdir] Created dir: TiracentosTest.java
C:\usr\palestra\antdemo\build
build.xml
compile: src
[javac] Compiling 2 source files to argonavis
C:\usr\palestra\antdemo\build util
Tiracentos.java
BUILD SUCCESSFUL TiracentosTest.java
Total time: 4 seconds
build
C:\usr\palestra\antdemo>
argonavis
DEPOIS
util
Tiracentos.class
TiracentosTest.class
9
Propriedades
Podem ser definidas com <property>
<property name="app.nome" value="jmovie" />
Podem ser carregadas de um arquivo
<property file="c:/conf/arquivo.conf" />
app.ver=1.0
docs.dir=c:\docs\
codigo=15323 arquivo.conf
12
Compilao e JAR
<javac>: Chama o compilador Java
<javac srcdir="dirfontes" destdir="dirbuild" >
<classpath>
<pathelement path="arquivo.jar" />
<pathelement path="/arquivos" />
</classpath>
<classpath idref="extra" />
</javac>
26
Como gerenciar projetos com o Ant
# Nome da aplicao
app.name=minied
# Nomes dos diretrios
src.dir=src
docs.dir=docs
build.dir=classes
dist.dir=jars
# Nome da classe executvel
app.main.class=com.javamagazine.minied.MiniEditor
root.package=com build.properties 29
Concluses
30
Exerccios
argonavis.com.br
32
Java 2 Standard Edition
Reuso com
Herana e
Composio
Helder da Rocha
www.argonavis.com.br
1
Como aumentar as chances de reuso
2
Reuso
3
Composio vs. Herana
Util
Ao reutilizar
um()
uma classe dois()
a composio Extenso
deve ser sua MaisUtil
escolha preferencial tres()
quatro()
4
Composio em Java
class NovaClasse {
NovaClasse Um um = new Um();
Dois dois = new Dois();
Instncia Tres tres = new Tres();
de Objeto 1 }
Instncia
de Objeto 2 Objetos podem ser
inicializados no construtor
Instncia
de Objeto 3 Flexibilidade
Pode trocar objetos durante a
execuo!
Relacionamento
"TEM UM"
5
Herana em Java
interface original
Herana pura Forma
automaticamente duplicada
(sem extenso) desenha() nas classes derivadas
apaga()
Campos de dados
Circulo Quadrado Triangulo
da classe base tambm
desenha() desenha() desenha() so duplicados
apaga() apaga()
7
Quando usar?
Composio ou herana?
1. Identifique os componentes do objeto, suas partes
Essas partes devem ser agregadas ao objeto via
composio ( parte de)
2. Classifique seu objeto e tente encontrar uma
semelhana de identidade com classes existentes
Herana s deve ser usada se voc puder comparar seu
objeto A com outro B dizendo, que A " UM tipo de..." B.
Tipicamente, herana s deve ser usada quando voc
estiver construindo uma famlia de tipos (relacionados
entre si)
8
Modificadores relacionados
9
Constantes
Para declarar uma constante, defina-a com um modificador
final
final XIS = 0;
public static final IPSILON = 12;
Qualquer varivel declarada como final tem que ser
inicializada no momento da declarao
Exceo: argumentos constantes em mtodos - valores no mudam
dentro do mtodo (uso em classes internas)
Uma constante de tipo primitivo no pode receber outro valor
Uma constante de referncia no pode ser atribuda a um
novo objeto
O objeto, porm, no constante (apenas a referncia o ). Os
atributos do objeto podem ser alterados
10
Mtodos finais
13
public
Acessvel
na prpria classe
nas subclasses
Classe
nas classes do mesmo pacote +campoPublico: tipo
em todas as outras classes +metodoPublico: tipo
Use para
construtores e mtodos que fazem parte da interface do
objeto
mtodos estticos utilitrios
constantes (estticas) utilitrias
Evite usar em
construtores e mtodos de uso restrito
campos de dados de objetos
14
protected
Acessvel
na prpria classe
nas subclasses
Classe
nas classes do mesmo pacote #campoProt: tipo
Use para #metodoProt: tipo
15
package-private
Modificador ausente
se no houver outro modificador de acesso, o acesso
"package-private". Classe
Acessvel ~campoAmigo: tipo
~metodoAmigo: tipo
na prpria classe
nas classes e subclasses do mesmo pacote
Use para
construtores e mtodos que s devem ser chamados pelas
classes e subclasses do pacote
constantes estticas teis apenas dentro do pacote
Evite usar em
construtores em classes que no criam objetos
mtodos cujo uso externo seja limitado ou indesejvel
campos de dados de objetos
16
private
Acessvel
na prpria classe (nos mtodos, funes estticas, blocos
estticos e construtores)
Use para
construtores de classes que s devem criar um nmero
limitado de objetos
mtodos que no fazem parte da interface do objeto
funes estticas que s tm utilidade dentro da classe
variveis e constantes estticas que no tm utilidade ou
no podem ser modificadas fora da classe
campos de dados de objetos
Classe
-campoPrivate: tipo
-metodoPrivate: tipo
17
Observaes sobre acesso
19
Exemplo
20
Mais sobre 'static' d1 #
x 05
d2 #
y 45
Variveis declaradas como 'static' x 10
class Alfa {
ir imprimir:
static void metodo() { Alfa! Alfa!
}
System.out.println("Alfa!");
Beta! e no... Beta!
} Alfa! Beta!
-initAssuntos()
argonavis.com.br
27
Java 2 Standard Edition
Interfaces e
polimorfismo
Helder da Rocha (helder@acm.org) argonavis.com.br1
O que polimorfismo
2
Objetos substituveis
freia() Onibus
acelera() Veiculo
vira(1) freia() Jipe Subclasses
acelera() de Veiculo!
vira(direcao) Jegue (herdam
todos os
Aviao mtodos)
Por exemplo: objeto do tipo Manobrista
sabe usar comandos bsicos para controlar Usurio de Veiculo
Veiculo (no interessa a ele saber como ignora existncia desses
cada Veiculo diferente vai acelerar, frear objetos substituveis
ou mudar de direo). Se outro objeto tiver
a mesma interface, Manobrista saber us-lo
3
Programas extensveis
Novos objetos podem ser usados em programas que no
previam a sua existncia
Garantia que mtodos da interface existem nas classes novas
Objetos de novas classes podem ser criados e usados (programa pode
ser estendido durante a execuo)
...
Veiculo Jipe
freia() freia() LandRover
acelera() acelera()
vira(0) vira(direcao) AirBus LandRover
Concorde
Mesmo nome. Aviao
Implementaes Veiculo v1 = new Veiculo();
diferentes. Veiculo v2 = new Aviao();
Veiculo v3 = new Airbus();
v1.acelera(); // acelera Veiculo Concorde AirBus
v2.acelera(); // acelera Aviao
v3.acelera(); // acelera AirBus
4
Interface vs. implementao
Estabelece uma
Polimorfismo permite separar a interface comum
interface da implementao
A classe base define a interface Veiculo
freia() {}
comum acelera() {}
No precisa dizer como isto vai ser feito vira(dir) {}
No diz: eu sei como frear um Carro ou
um nibus
Diz apenas que os mtodos existem, que
eles retornam determinados tipos de
dados e que requerem certos parmetros Onibus Carro
Diz: Veiculo pode acelerar, frear e virar freia() {} freia() {}
para uma direo, mas a direo deve ser acelera() {} acelera() {}
vira(dir) {} vira(dir) {}
fornecida
Implementaes
da interface
(dizem como fazer)
5
Como funciona
6
Ligao de chamadas de funo
herdam interface
Herdam interface
mas sobrepem
Jegue implementao
LandRover
(cada objeto
executa o mtodo
freia() {...} freia() {...}
de forma particular)
acelera() {...} acelera() {...}
vira(direcao) {...} vira(direcao) {...}
8
Exemplo (2)
Trecho de programa que usa Manobrista: Manobrista usa a classe
Em tempo de execuo passa implementao de Veiculo (e ignora a existncia
Jegue e LandRover no lugar da implementao de tipos especficos de Veiculo
original de Veiculo como Jegue e LandRover
(aproveita apenas a interface de Veiculo)
Veiculo Manobrista
(...)
(...)
Manobrista
Manobrista mano
mano freia() {...}
== new
new Manobrista (); acelera() {...}
Manobrista ();
vira(direcao) {...}
Veiculo
Veiculo v1
v1 == new
new Jegue();
Jegue();
Veiculo
Veiculo v2
v2 == new
new LandRover();
LandRover(); herdam interface
mano.estaciona(v1);
mano.estaciona(v1); public void
estaciona (Veiculo v) {
mano.estaciona(v2);
mano.estaciona(v2); Jegue freia() {...}
LandRover ...
acelera() {...} v.freia();
(...)
(...) ...
vira(direcao) {...}
freia() {...} freia() {...} }
acelera() {...} acelera() {...}
vira(direcao) {...} vira(direcao) {...}
9
Detalhes (1) Manobrista
public void
estaciona (Veiculo v) {
...
Pilha (referncias) Heap (objetos) v.freia();
...
03b7 }
Veiculo v1 0xffa903b7 Jegue
10
Como funciona (3) Manobrista
public void
estaciona (Veiculo v) {
...
v.freia();
...
03b7 }
Veiculo v1 0xffa903b7 Jegue
12
Mtodos e classes abstratos
13
Classes abstratas
14
Classes abstratas (2)
dois()
}
ClasseConcretaUm ClasseConcretaDois
16
Template method: implementao
public abstract class Template {
public abstract String link(String texto, String url);
public String transform(String texto) { return texto; }
18
Upcasting
19
Downcasting
20
Upcasting e downcasting
Upcasting Downcasting
sobe a hierarquia mtodos visveis desce a hierarquia
no requer cast na referncia v requer operador de cast
Veiculo v = new Jegue(); Jegue j = (Jegue) v;
Veiculo
freia()
j freia()
acelera()
Veiculo
freia()
acelera() vira() acelera()
vira(direcao) corre() vira(direcao)
v morde()
21
ClassCastException
O downcasting explcito sempre aceito pelo compilador se
o tipo da direita for superclasse do tipo da esquerda
Veiculo v = new Onibus();
Carro c = (Carro) v; // passa na compilao
Object, portanto, pode ser atribuda a qualquer tipo de referncia
Em tempo de execuo, a referncia ter que ser ligada ao
objeto
Incompatibilidade provocar ClassCastException
Para evitar a exceo, use instanceof
if (v instanceof Carro)
c = (Carro) v;
22
Herana Pura vs. Extenso
Herana pura: referncia tm Extenso: referncia apenas tem
acesso a todo o objeto acesso parte definida na
interface da classe base
Veiculo
freia() Veiculo
acelera()
Referncia Veiculo freia()
vira(direcao)
acelera()
no enxerga estes vira(direcao)
mtodos
Jegue LandRover
freia() freia() Jegue LandRover
acelera() acelera()
freia() freia()
vira(direcao) vira(direcao)
acelera() acelera()
vira(direcao) vira(direcao)
Veiculo v = new Jegue(); corre() diesel()
v.freia() // freia o Jegue morde() tracao(tipo)
v.acelera(); // acelera o Jegue
Veiculo v = new Jegue();
v.corre() // ERRADO!
v.acelera(); //OK
23
Ampliao da referncia
Uma referncia pode apontar para uma classe estendida, mas
s pode usar mtodos e campos de sua interface Object
Para ter acesso total ao objeto que estende a interface equals()
original, preciso usar referncia que conhea toda sua
interface pblica ERRADO: raio no faz parte da
Circulo
Exemplo interface de Object
raio
equals()
class
class Circulo
Circulo extends
extends Object
Object {{
public
public int int raio;
raio; class
class Circulo
Circulo extends
extends Object
Object {{
public
public boolean
boolean equals(Object
equals(Object obj)
obj) {{ public
public int int raio;
raio;
ifif (this.raio
(this.raio ==
== obj.raio)
obj.raio) public
public booleanboolean equals(Object
equals(Object obj)obj) {{
return
return true;
true; ifif (obj
(obj instanceof
instanceof Circulo)
Circulo) {{
verifica se obj Circulo
return
return false;
false; Circulo kk = = (Circulo)
(Circulo) obj;
obj;
}} realmente ifif (this.raio
(this.raio ==
== k.raio)
k.raio)
}} //// CDIGO
CDIGO ERRADO! ERRADO! um Circulo return
return true;
true;
}}
cria nova referncia return
return false; false;
que tem acesso a toda Como k Circulo
}}
a interface de Circulo possui raio
}}
24
Interfaces Java
26
Herana mltipla em Java
Classe resultante combina todas as interfaces, mas s possui
uma implementao: a da classe base <<interface>>
Empregado
<<interface>> <<interface>>
Animal Cidadao Contribuinte trabalha()
come() vota() pagaIR()
respira() getRG() getCPF() <<interface>>
Professor
ensina()
come()
respira() Este objeto pode ser usado
Pessoa ensina() em qualquer lugar onde
vota() for aceito um Animal, um
ensina() getRG()
vota() Professor, um Cidadao, um
trabalha()
getRG() pagaIR() Empregado, um Contribuinte,
trabalha() getCPF() um java.lang.Object
pagaIR() equals()
getCPF() toString()
... 27
Exemplo
32
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
33
Java 2 Standard Edition
Erros, excees
e asseres
Helder da Rocha
www.argonavis.com.br
1
Controle de erros com Excees
Excees so
Erros de tempo de execuo
Objetos criados a partir de classes especiais que so
"lanados" quando ocorrem condies excepcionais
Mtodos podem capturar ou deixar passar excees
que ocorrerem em seu corpo
obrigatrio, para a maior parte das excees, que o
mtodo declare quaisquer excees que ele no capturar
Mecanismo try-catch usado para tentar capturar
excees enquanto elas passam por mtodos
2
Trs tipos de erros de tempo de execuo
3
Como causar uma exceo?
4
Excees e mtodos
6
Captura e declarao de excees
7
try e catch
Exception
O bloco try "tenta" executar um bloco de
cdigo que pode causar exceo
Deve ser seguido por TipoExcecao1
9
Como criar uma exceo
10
Como criar uma exceo (2)
11
Principais mtodos
Construtores de Exception
Exception ()
Exception (String message)
Exception (String message, Throwable cause) [Java 1.4]
Mtodos de Exception
String getMessage()
Retorna mensagem passada pelo construtor
Throwable getCause()
Retorna exceo que causou esta exceo [Java 1.4]
String toString()
Retorna nome da exceo e mensagem
void printStackTrace()
Imprime detalhes (stack trace) sobre exceo
12
Como pegar qualquer exceo
13
Relanar uma exceo
14
Classes base da API
RuntimeException e Error
Excees no verificadas em tempo de compilao
Subclasses de Error no devem ser capturadas (so
situaes graves em que a recuperao impossvel ou
indesejvel)
Subclasses de RuntimeException representam erros de
lgica de programao que devem ser corrigidos (podem,
mas no devem ser capturadas: erros devem ser corrigidos)
Exception
Excees verificadas em tempo de compilao (exceo
regra so as subclasses de RuntimeException)
Compilador exige que sejam ou capturadas ou declaradas
pelo mtodo que potencialmente as provoca
15
Hierarquia
Condies excepcionais Object
checadas pelo compilador Erros no checados
(eventos recuperveis) pelo compilador
Throwable (eventos irrecuperveis)
Excees no
checadas pelo
compilador
(erros de lgica) Exception Error
IOException
RuntimeException FileNotFoundException
OutOfMemoryError
MinhaExcecao
InternalError
ClassCastException SuaExcecao
VirtualMachineError
NullPointerException ...
UnknownError
NumberFormatException
...
ArrayIndexOutOfBoundsException
...
java.lang.Error java.lang.Exception
java.lang.OutOfMemoryError java.io.IOException
java.io.StreamCorruptedException java.net.MalformedURLException
19
Teste 1
20
Teste 2
21
Teste 3
22
Teste 4
23
Asseres
So expresses booleanas que o programador define para
afirmar uma condio que ele acredita ser verdade
Asseres so usadas para validar cdigo (ter a certeza que um vetor
tem determinado tamanho, ter a certeza que o programa no passou
por determinado lugar)
Melhoram a qualidade do cdigo: tipo de teste caixa-branca
Devem ser usadas durante o desenvolvimento e desligadas na
produo (afeta a performance)
No devem ser usadas como parte da lgica do cdigo
Asseres so um recurso novo do JSDK1.4.0
Nova palavra-chave: assert
preciso compilar usando a opo -source 1.4:
> javac -source 1.4 Classe.java
Para executar, preciso habilitar afirmaes (enable assertions):
> java -ea Classe
24
Asseres: sintaxe
Asseres testam uma condio. Se a condio for falsa, um
AssertionError lanado
Sintaxe:
assert expresso;
assert expressoUm : expressoDois;
Se primeira expresso for true, a segunda no avaliada
Sendo falsa, um AssertionError lanado e o valor da segunda
expresso passado no seu construtor.
Exemplo
Em vez de usar ... use uma assero!.
comentrio... if (i%3 == 0) {
if (i%3 == 0) { ...
... } else if (i%3 == 1) {
} else if (i%3 == 1) { ...
... } else {
} else { // (i%3 == 2) assert i%3 == 2;
... ...
} }
25
Asseres: exemplo
27
Exerccios
argonavis.com.br
29
Java 2 Standard Edition
Testes de Unidade
com JUnit
Diagrama de classes
package junitdemo;
import java.io.*;
16
TestSuite
Permite executar uma coleo de testes
Mtodo addTest(TestSuite) adiciona um teste na lista
Padro de codificao (usando reflection):
retornar um TestSuite em cada test-case:
public static TestSuite suite() {
return new TestSuite(SuaClasseTest.class);
}
criar uma classe AllTests que combina as suites:
public class AllTests {
public static Test suite() {
Pode incluir TestSuite testSuite =
outras suites new TestSuite("Roda tudo");
testSuite.addTest(pacote.AllTests.suite());
testSuite.addTest(MinhaClasseTest.suite());
testSuite.addTest(SuaClasseTest.suite());
return testSuite;
}
} 17
Fixtures
So os dados reutilizados por vrios testes
public class AttributeEnumerationTest extends TestCase {
String testString;
String[] testArray;
AttributeEnumeration testEnum; Fixture
public void setUp() {
testString = "(alpha|beta|gamma)";
testArray = new String[]{"alpha", "beta", "gamma"};
testEnum = new AttributeEnumeration(testArray);
}
public void testGetNames() {
assertEquals(testEnum.getNames(), testArray);
}
public void testToString() {
assertEquals(testEnum.toString(), testString);
}
(...)
23
Como escrever bons testes
24
Como descobrir testes?
26
Como lidar com testes difceis
Testes devem ser simples e suficientes
XP: design mais simples que resolva o problema;
sempre pode-se escrever novos testes, quando necessrio
No complique
No teste o que responsabilidade de outra classe/mtodo
Assuma que outras classes e mtodos funcionam
Testes difceis (ou que parecem difceis)
Aplicaes grficas: eventos, layouts, threads
Objetos inaccessveis, mtodos privativos, Singletons
Objetos que dependem de outros objetos
Objetos cujo estado varia devido a fatores imprevisveis
Solues
Alterar o design da aplicao para facilitar os testes
Simular dependncias usando proxies e stubs
27
Dependncia de cdigo-fonte
Problema
Como testar componente que depende do cdigo de
outros componentes?
Classe-alvo no oferece o que testar: Tanque
+nivel()
CarroTest Carro
+testAcelera() +acelera()
Ignio
+ligada()
Mtodo acelera() s vai funcionar
se nvel() do tanque for > 0 public void testAcelera() {
e ignio estiver ligada() Carro carro =
Como saber se condies so new Carro();
carro.acelera();
verdadeiras se no temos assert???(???);
acesso s dependncias? }
33
Exemplo: <junit>
<target name="test" depends="build">
<junit printsummary="true" dir="${build.dir}"
fork="true">
<formatter type="plain" usefile="false" />
<classpath path="${build.dir}" /
<test name="argonavis.dtd.AllTests" />
</junit>
Formata os dados na tela (plain)
</target>
Roda apenas arquivo AllTests
<target name="batchtest" depends="build" >
<junit dir="${build.dir}" fork="true">
<formatter type="xml" usefile="true" />
<classpath path="${build.dir}" />
<batchtest todir="${test.report.dir}">
<fileset dir="${src.dir}">
<include name="**/*Test.java" />
<exclude name="**/AllTests.java" />
</fileset>
</batchtest> Gera arquivo XML
</junit> Inclui todos os arquivos que
</target> terminam em TEST.java
34
<junitreport>
35
Resumo
Testar tarefa essencial do desenvolvimento de software.
Testar unidades de cdigo durante o desenvolvimento uma
prtica que traz inmeros benefcios
Menos tempo de depurao (muito, muito menos!)
Melhor qualidade do software
Segurana para alterar o cdigo
Usando TDD, melhores estimativas de prazo
JUnit uma ferramenta open-source que ajuda a
implementar testes em projetos Java
TDD ou Test-Driven Development uma tcnica onde os
testes so usados para guiar o desenvolvimento
Ajuda a focar o desenvolvimento em seus objetivos
Mock objects ou stubs podem ser usados para representar
dependncia e diminuir as responsabilidades de testes
36
Exerccio
1. A classe Exercicio.java possui quatro mtodos vazios:
int soma(int a, int b)
long fatorial(long n);
double fahrToCelsius(double fahrenheit);
String inverte(String texto);
Escreva, na classe ExercicioTest.java, test-cases para cada
mtodo, que preencham os requisitos:
Soma: 1+1 = 2, 2+4 = 4
Fatorial: 0! = 1, 1! = 1, 2! = 2, 3! = 6, 4! = 24, 5! = 120
A frmula n! = n(n-1)(n-2)(n-3)...3*2*1
Celsius: -40C = -40F, 0C=32F, 100C=212F
A frmula F = 9/5 * C + 32
Inverte recebe "Uma frase" e retorna "esarf amU"
Implemente um teste e execute-o (o esqueleto de um deles
j est pronto). Ele deve falhar.
Implemente os mtodos, um de cada vez, e rode os testes
at que no falhem mais (tarja verde), antes de prosseguir.
37
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
38
Java 2 Standard Edition
Fundamentos de
Programao
Concorrente
Helder da Rocha
www.argonavis.com.br 1
Programao concorrente
2
Mltiplas linhas de execuo
4
Por que usar mltiplos threads?
H duas estratgias
Herdar da classe java.lang.Thread
Implementar a interface java.lang.Runnable
Herdar da classe Thread
O objeto um Thread, e sobrepe o comportamento
padro associado classe Thread
Implementar a interface Runnable
O objeto, que define o comportamento da execuo,
passado para um Thread que o executa
Nos dois casos
Sobreponha o mtodo run() que o "main()" do Thread
O run() deve conter um loop que ir rodar pelo tempo de
vida do thread. Quando o run(), terminar, o thread morre.
6
Exemplo: herdar da classe Thread
7
Exemplo: implementar Runnable
public class Operario implements Runnable {
String produto; int tempo;
public Operario (String produto,
int tempo) {
this.produto = produto;
this.tempo = tempo;
}
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println(i + " " + produto);
try {
Thread.sleep((long)
(Math.random() * tempo));
} catch (InterruptedException e) {}
}
System.out.println("Terminei " + produto);
}
}
8
Como usar o Thread
9
Ciclo de vida
Um thread est geralmente em um dentre trs estados:
executvel (e possvelmente executando) e no-executvel
(esperando, bloqueado, etc.)
O thread entre no estado executvel com t.start(), que causa
o incio de run(), e passa para o estado morto quando run()
chega ao fim.
Executando (running) Thread.sleep(1000)
blocked (socket, file, ...)
t.yield() object.wait() esperando acesso
t.setPriority() ...
Thread t = t.start()
Executvel (ready) No executvel
new Thread()
run() terminou
Morto
10
Filas de prioridades
O estado ready no garantia de execuo. Threads so regidos
por prioridades. Threads de baixa prioridade tm menos chances
A Ready (filas) Running B Um thread terminou
(CPU)
9
5 5 5 9 5 5 5 9
3 3 3 3 3 3 3 3
1 1 9
9 Dead
C Outro dorme
D Dando a preferncia
Sleeping yield()
5 5 5 5 5 5
3 3 3 3 3 3 3 3
1 1 11
Principais mtodos da classe Thread
Estticos
Thread currentThread(): retorna referncia para o thread
que est executando no momento
void sleep(long tempo): faz com que o thread que est
executando no momento pare por tempo milissegundos
no mnimo
void yield(): faz com que o thread atual pare e permita
que outros que esto na sua fila de prioridades executem
De instncia
void run(): o "main" do Thread. Deve ser implementado
no Thread ou no objeto Runnable passado ao thread
void start(): um bootstrap. Faz o JVM chamar o run()
boolean isAlive(): verifica se thread est vivo
12
Compartilhamento de recursos limitados
Recursos limitados podem ser compartilhados por vrios
threads simultaneamente
Cada objeto tm um bloqueio que pode ser acionado pelo
mtodo que o modifica para evitar corrupo de dados
Dados podem ser corrompidos se
Thread 1 Thread 2
um thread deixar um objeto em
um estado incompleto e outro saldo(): 1200
13
Corrupo
Recursos compartilhados devem ser protegidos
A palavra-reservada synchronized permite que blocos sensveis
ao acesso simultneo sejam protegidos de corrupo
impedindo que objetos os utilizem ao mesmo tempo.
Thread 1 Thread 2
Synchronized deve limitar-se aos
saldo(): 1200
trechos crticos (performance!)
void operacaoCritica() { espera()
// ... trechos thread-safe sacar(1000)
synchronized (this) {
if (saldo() > 1000) saldo(): 200
depositar(500)
sacar(1000);
else depositar(500);
Thread 1 tem monoplio
} // (... trechos seguros ...)
do objeto enquanto estiver
} no bloco synchronized
Mtodos inteiros podem ser synchronized
synchronized void operacaoCritica() {}
14
Comunicao entre threads
PilhaSincronizada pilha;
Cenrio 1:
Saldo do caixa: R$0.00
Cliente 1 (thread) atendido (recebe acesso do caixa),
deposita R$100.00 e libera o caixa
Cliente 2 (thread) atendido (recebe o acesso do caixa),
saca R$50.00 e libera o caixa
Cenrio 2: cliente 2 chega antes de cliente 1
Saldo do caixa: R$0.00
Cliente 2 atendido (recebe acesso do caixa), tenta sacar
R$50.00 mas no h saldo. Cliente 2 espera haver saldo.
Cliente 1 tenta ser atendido (quer depositar R$100.00)
mas no sua vez na fila. Cliente 1 espera sua vez.
DEADLOCK!
22
Exerccios
23
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
24
Java 2 Standard Edition
Colees,
Propriedades,
Resources e Strings
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
Colees
Vetores, comparao e ordenao
Listas e Conjuntos
Iteradores
Mapas
Propriedades
Manipulao de strings
Classes String, StringBuffer e StringTokenizer
Classes para expresses regulares em Java
Recursos avanados
ClassLoader: resources e reflection (fundamentos)
JavaBeans
2
O que so colees?
3
Java Collections API
4
Tipos de colees em Java
Vetores
Mecanismo nativo para colecionar valores primitivos e
referncias para objetos
Podem conter objetos (referncias) tipos primitivos
Forma mais eficiente de manipular colees
Colees
No suporta primitivos (somente se forem empacotados
dentro de objetos)
Classes e interfaces do pacote java.util
Interfaces Collection, List, Set e Map e implementaes
Iterator, classes utilitrias e colees legadas
5
Vetores de objetos
6
Vetores so objetos
Quando um vetor criado no heap, ele possui "mtodos" e
campos de dados como qualquer outro objeto
Diferentes formas de inicializar um vetor
class
class Coisa
Coisa {}
{} //
// uma
uma classe
classe
(...)
(...)
Coisa[]
Coisa[] a;
a; //
// referncia
referncia do
do vetor
vetor (Coisa[])
(Coisa[]) null
null
Coisa[]
Coisa[] bb == new
new Coisa[5];
Coisa[5]; //
// referncias
referncias Coisa
Coisa null
null
Coisa[]
Coisa[] cc == new
new Coisa[4];
Coisa[4];
for
for (int
(int ii == 0;
0; ii << c.length;
c.length; i++)
i++) {{
c[i]
c[i] == new
new Coisa();
Coisa(); //// refs.
refs. Coisa
Coisa inicializadas
inicializadas
}}
Coisa[]
Coisa[] dd == {new
{new Coisa(),
Coisa(), new
new Coisa(),
Coisa(), new
new Coisa()};
Coisa()};
aa == new
new Coisa[]
Coisa[] {new
{new Coisa(),
Coisa(), new
new Coisa()};
Coisa()};
7
Como retornar vetores
Vetores de objetos
Apenas as referncias so copiadas (shallow copy)
9
Exerccios
1. Vetores e System.arraycopy()
(a) Crie dois vetores de inteiros. Um com 10 elementos e
outro com 20.
(b) Preencha o primeiro com uma seqncia e o segundo
com uma srie exponencial.
(c) Crie uma funo esttica que receba um vetor e
retorne uma String da forma "[a1, a2, a3]" onde a* so
elementos do vetor.
(d) Imprima os dois vetores.
(e) Copie um vetor para o outro e imprima novamente.
(f) experimente mudar os offsets e veja as mensagens
obtidas.
10
java.util.Arrays
11
Ordenao
14
Exemplo: java.util.Comparator
public class MedeCoisas implements Comparator {
public int compare(Object o1, Object o2) {
Coisa c1 = (Coisa) o1;
Coisa c2 = (Coisa) o2;
if (c1.id < c2.id) return 1;
if (c1.id > c2.id) return -1;
if (c1.id == c2.id) return 0;
}
}
Ordenando ao contrrio
Como usar
Coisa c1 = new Coisa(123);
Coisa c2 = new Coisa(456);
Comparator comp = new MedeCoisas();
if(comp.compare(c1, c2)==0) System.out.println("igual");
Coisa coisas[] = {c2, c1, new Coisa(3)};
Arrays.sort(coisas, new MedeCoisas());
16
Outras funes teis de Arrays
boolean equals(vetor1, vetor2)
Retorna true apenas se vetores tiverem o mesmo contedo
(mesmas referncias) na mesma ordem
S vale para comparar vetores do mesmo tipo primitivo ou
vetores de objetos
No serve para referncias!
void fill(vetor, valor)
Preenche o vetor (ou parte do vetor) com o valor passado
como argumento (tipo deve ser compatvel)
int binarySearch(vetor, valor)
Retorna inteiro com posio do valor no vetor ou valor
negativo com a posio onde deveria estar
No funciona se o vetor no estiver ordenado
Se houver valores duplicados no garante qual ir ser
localizado 17
Exerccios (2)
2. interface java.lang.Comparable
a) Use ou crie uma classe Circulo que tenha x, y e raio
inteiros e um construtor que receba os trs parmetros
para inicializar um novo Circulo. A classe deve ter
mtodos equals() e toString().
b) Faa o Circulo implementar Comparable. Use o raio
como critrio de ordenao
c) Em um main(), crie um vetor de 10 Crculos de
tamanho diferente. Coloque-os em ordem e imprima o
resultado
18
Exerccios (3)
19
Colees
Classes e interfaces do pacote java.util que representam
listas, conjuntos e mapas
Soluo flexvel para armazenar objetos
Quantidade armazenada de objetos no fixa, como ocorre
com vetores
Poucas interfaces (duas servem de base) permitem maior
reuso e um vocabulrio menor de mtodos
add(), remove() - principais mtodos de interface Collection
put(), get() - principais mtodos de interface Map
Implementaes parciais (abstratas) disponveis para cada
interface
H duas ou trs implementaes de cada interface
20
As interfaces
Colees de Colees de
elementos individuais pares de elementos
java.util.Collection java.util.Map
Pares chave/valor
(vetor associativo)
Collection de valores
(podem repetir)
Set de chaves
java.util.List java.util.Set (unvocas)
21
Principais implementaes concretas
ArrayList HashSet
HashMap
23
Typesafe Collection
Pode-se criar uma implementao de coleo que restringe o
tipo de objetos que aceita usando delegao
A classe abaixo uma coleo type-safe, que no permite a
entrada de objetos que no sejam do tipo Galinha ou
descendentes
Para recuperar objetos, no necessrio usar cast!
import java.util.*;
public class Galinheiro {
private List galinhas;
public Galinheiro(List list) { No compila!
galinhas = list;
}
No requer cast!
public get(int idx) {
return (Galinha) galinhas.get(idx);
}
public add(Galinha g) { Galinheiro g =
galinhas.add(g); new Galinheiro(new ArrayList());
} g.add(new Galinha("Frida"));
} // g.add(new Raposa("Max"));
Galinha frida = g.get(0);
24
Interface Iterator
Para navegar dentro de uma Collection e selecionar cada
objeto em determinada seqncia
Uma coleo pode ter vrios Iterators
Isola o tipo da Coleo do resto da aplicao
Mtodo iterator() (de Collection) retorna Iterator
package java.util;
java.util.Iterator
public interface Iterator {
boolean hasNext();
Object next();
void remove(); java.util.ListIterator
} hasPrevious()
previous()
ListIterator possui mais mtodos
add(Object)
Mtodo listIterator() de List retorna set(Object)
ListIterator
25
Iterator (exemplo tpico)
(...)
Iterator it = map.values().iterator();
while(it.hasNext()) {
Coisa c = (Coisa)it.next();
System.out.println(c);
}
26
Interface Collection
Principais subinterfaces
List
Set
Principais mtodos (herdados por todas as
subclasses)
boolean add(Object o): adiciona objeto na coleo
boolean contains(Object o)
boolean isEmpty()
Iterator iterator(): retorna iterator
boolean remove(Object o)
int size(): retorna o nmero de elementos
Object[] toArray(Object[]): converte coleo em Array
27
Interface List
Principais subclasses
ArrayList
LinkedList
Principais mtodos adicionais
void add(int index, Object o): adiciona objeto na posio
indicada (empurra elementos existentes para a frente)
Object get(int index): recupera objeto pelo ndice
int indexOf(Object o): procura objeto e retorna ndice da
primeira ocorrncia
Object set(int index, Object o): grava objeto na posio
indicada (apaga qualquer outro que ocupava a posio).
Object remove(int index)
ListIterator listIterator(): retorna um iterator
28
Implementaes: ArrayList e LinkedList
ArrayList
Escolha natural quando for necessrio usar um vetor
redimensionvel: mais eficiente para leitura
Implementado internamente com vetores
Ideal para acesso aleatrio
LinkedList
Muito mais eficiente que ArrayList para remoo e
insero no meio da lista
Ideal para implementar pilhas, filas unidirecionais e
bidirecionais. Possui mtodos para manipular essas
estruturas
Ideal para acesso seqencial
29
List: exemplo
(...)
30
Interface Set
31
Exemplo
Set conjunto = new HashSet();
conjunto.add("Um");
conjunto.add("Dois");
conjunto.add("Tres");
conjunto.add("Um");
conjunto.add("Um");
Iterator it = conjunto.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
Imprime
Um
Dois
Tres
32
Interface Map
HashMap
Escolha natural quando for necessrio um vetor associativo
Acesso rpido: usa Object.hashCode() para organizar e
localizar objetos
TreeMap
Mapa ordenado
Contm mtodos para manipular elementos ordenados
Map.Entry
Classe interna usada para manter pares chave-valor em
qualquer implementao de Map
Principais mtodos: Object getKey(), retorna a chave do
par; Object getValue(), retorna o valor.
34
Exemplo
35
HashMap: como funciona
1 1 1 1 1
put()
5
5 5 5
12
get() Objetos sero
56
12
diferenciados pelo
equals()
56 56
36
Colees legadas de Java 1.0/1.1
So thread-safe e, portanto, menos eficientes
Vector, implementa List
Use ArrayList, e no Vector, em novos programas
Stack, subclasse de Vector
Implementa mtodos de pilha: void push(Object), Object
pop() e Object peek().
Hashtable, implementa Map
Use HashMap, e no Hashtable, em novos programas
Enumeration: tipo de Iterator
Retornada pelo mtodo elements() em Vector, Stack,
Hashtable e por vrios outros mtodos de classes mais
antigas da API Java
boolean hasMoreElements(): equivalente a
Iterator.hasNext()
Object nextElement(): equivalente a Iterator.next()
Use Iterator, e no Enumeration, em novos programas 37
Propriedades do sistema e Properties
java.util.Properties: Tipo de Hashtable usada para
manipular com propriedades do sistema
Propriedades podem ser
1. Definidas pelo sistema* (user.dir, java.home, file.separator)
2. Passadas na linha de comando java (-Dprop=valor)
3. Carregadas de arquivo de propriedades contendo pares nome=valor
4. Definidas internamente atravs da classe Properties
Para ler propriedades passadas em linha de comando (2) ou
definidas pelo sistema (1) use System.getProperty():
String javaHome = System.getProperty("java.home");
Para ler todas as propriedades (sistema e linha de comado)
Properties props = System.getProperties();
Para adicionar uma nova propriedade lista
props.setProperty("dir.arquivos", "/imagens");
Mtodos de Properties
load(InputStream in): carrega um arquivo de Properties
para o objeto Properties criado (acrescenta propriedades
novas e sobrepe existentes do mesmo nome)
store(OutputStream out, String comentario): grava no
OutputStream as propriedades atualmente armazenadas
no objeto Properties. O comentrio pode ser null.
String getProperty(String nome): retorna o valor da
propriedade ou null se ela no faz parte do objeto
String setProperty(String nome, String valor): grava uma
nova propriedade
Enumeration propertyNames(): retorna uma lista com os
nomes de propriedades armazenados no objeto
40
A classe java.lang.String
uma seqncia de caracteres imutvel
Representa uma cadeia de caracteres Unicode
Otimizada para ser lida, mas no alterada
Nenhum mtodo de String modifica o objeto armazenado
H duas formas de criar Strings
Atravs de construtores, metodos, fontes externas, etc:
String s1 = new String("Texto");
String s2 = objeto.getText(); // mtodo de API
String s3 = coisa.toString();
Atravs de atribuio de um literal
String s3 = "Texto";
Strings criados atravs de literais so automaticamente
armazenadas em um pool para possvel reuso
Mesmo objeto reutilizado: comparao de Strings iguais criados
atravs de literais revelam que se tratam do mesmo objeto
41
Pool de strings
Como Strings so objetos imutveis, podem ser reusados
Strings iguais criados atravs de literais so o mesmo objeto
String um = "Um";
Todos os blocos de texto
String dois = "Um";
abaixo so impressos
if (um == dois)
System.out.println("um e dois so um!");
Mas Strings criados de outras formas no so
String tres = new String("Um");
if (um != tres)
System.out.println("um nao trs!");
Literais so automaticamente guardados no pool. Outros
Strings podem ser acrescentados no pool usando intern():
quatro = tres.intern();
if (um == quatro)
System.out.println("quatro um!");
42
Principais Mtodos de String
Mtodos que criam novos Strings
String concat(String s): retorna a concatenao do String atual com
outro passado como parmetro
String replace(char old, char new): troca todas as ocorrncias de um
caractere por outro
String substring(int start, int end): retorna parte do String incluindo a
posio inicial e exclundo a final
String toUpperCase() e String toLowerCase(): retorna o String em caixa
alta e caixa baixa respectivamente
Mtodos para pesquisa
boolean endsWith(String) e startsWith(String)
int indexOf(String), int indexOf(String, int offset): retorna posio
char charAt(int posio): retorna caractere em posio
Outros mtodos
char[] toCharArray(): retorna o vetor de char correspondente ao String
int length(): retorna o comprimento do String
43
A classe StringBuffer
uma seqncia de caracteres mutvel
Representa uma cadeia de caracteres Unicode
Otimizada para ser alterada, mas no lida
StringBuffers podem ser criados atravs de seus construtores
StringBuffer buffer1 = new StringBuffer();
StringBuffer buffer2 = new StringBuffer("Texto inicial");
StringBuffer buffer3 = new StringBuffer(40);
Mtodos de StringBuffer operam sobre o prprio objeto
StringBuffer append(String s): adiciona texto no final
StringBuffer insert(int posio, String s): insere na posio
void setCharAt(int posio, char c): substitui na posio
String toString(): transforma o buffer em String para que possa ser lido
Exemplo
StringBuffer buffer = new StringBuffer("H");
buffer.append("e").append("l").append("l").append(o");
System.out.println(buffer.toString());
44
Quando usar String e StringBuffer
45
java.util.StringTokenizer
46
Expresses regulares (1.4)
49
JavaBeans
Um JavaBean um componente reutilizvel que tem como
finalidade representar um modelo de dados
Define convenes para que atributos de dados sejam
tratados como "propriedades"
Permite manipulao de suas propriedades, ativao de
eventos, etc. atravs de um framework que reconhea as
convenes utilizadas
Basicamente, um JavaBean uma classe Java qualquer, que
tem as seguintes caractersticas
Construtor pblico default (sem argumentos)
Atributos de dados private
Mtodos de acesso (acessors) e/ou de alterao (mutators)
para cada atributo usando a conveno getPropriedade() (ou
opcionalmente isPropriedade() se boolean) e setPropriedade()
50
Exemplo de um JavaBean
public class UmJavaBean {
private String msg;
private int id;
public JavaBean () {}
argonavis.com.br
53
Java 2 Standard Edition
Entrada
e Sada
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados
Este mdulo explora os componentes mais
importantes do pacote java.io e outros recursos da
linguagem relacionados E/S e arquivos
A classe File, que representa arquivos e diretrios
Objetos que implementam entrada e sada
InputStream e OutputStream, Readers e Writers
Compresso com GZIP streams
FileChannels
Objeto que implementa arquivo de acesso aleatrio
RandomAccessFile
Recursos de serializao bsica
Serializable, ObjectOutputStream e ObjectInputStream
Logging: fundamentos 2
O pacote java.io
Oferece abstraes que permitem ao programador
lidar com arquivos, diretrios e seus dados de uma
maneira independente de plataforma
File, RandomAccessFile
Oferecem recursos para facilitar a manipulao de
dados durante o processo de leitura ou gravao
bytes sem tratamento
caracteres Unicode
dados filtrados de acordo com certo critrio
dados otimizados em buffers
leitura/gravao automtica de objetos
Pacote java.nio (New I/O): a partir do J2SDK 1.4.0
Suporta mapeamento de memria e bloqueio de acesso
3
A classe File
Usada para representar o sistema de arquivos
apenas uma abstrao: a existncia de um objeto File no
significa a existncia de um arquivo ou diretrio
Contm mtodos para testar a existncia de arquivos, para definir
permisses (nos S.O.s onde for aplicvel), para apagar arquivos,
criar diretrios, listar o contedo de diretrios, etc.
Alguns mtodos
String getAbsolutePath()
String getParent(): retorna o diretrio (objeto File) pai
boolean exists()
boolean isFile()
boolean isDirectory()
boolean delete(): tenta apagar o diretrio ou arquivo
long length(): retorna o tamanho do arquivo em bytes
boolean mkdir(): cria um diretrio com o nome do arquivo
String[] list(): retorna lista de arquivos contido no diretrio
4
File: exemplo de uso
File diretorio = new File("c:\tmp\cesto");
diretorio.mkdir(); // cria, se possvel
File arquivo = new File(diretorio, "lixo.txt");
FileOutputStream out =
new FileOutputStream(arquivo);
// se arquivo no existe, tenta criar
out.write( new byte[]{'l','i','x','o'} );
Dois grupos:
e/s de bytes: InputStream e OutputStream
e/s de chars: Reader e Writer
InputStream OutputStream Reader Writer
ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
FileInputStream FileOutputStream PipedReader BufferedWriter
ObjectInputStream StringReader
ObjectOutputStream FilterWriter
PipedInputStream FilterReader
PipedOutputStream PipedWriter
SequenceInputStream PushbackReader
FilterOutputStream PrintWriter
FilterInputStream InputStreamReader
BufferedInputStream BufferedOutputStream StringWriter
FileReader
DataInputStream DataOutputStream OuputStreamWriter
Buffered Reader
PushbackInputStream PrintStream
LineNumberReader FileWriter
7
E/S de bytes
InputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de entrada e
ns de fonte (dados para leitura).
Mtodo principal: read()
OutputStream
Classe genrica (abstrata) para lidar com fluxos de bytes de sada e
ns de destino (dados para gravao).
Mtodo principal: write()
Principais implementaes
Ns (fontes): FileInputStream (arquivo), ByteArrayInputStream
(memria) e PipedInputStream (pipe).
Processamento de entrada: FilterInputStream (abstract) e subclasses
Ns (destinos): FileOutputStream (arquivo), ByteArrayOutputStream
(memria) e PipedOutputStream (pipe).
Processamento de sada: FilterOutputStream (abstract) e subclasses.
8
Mtodos de InputStream e OutputStream
RandomAccessFile raf =
new RandomAccessFile ("arquivo.dat", "rw");
raf.seek(0) 0 0 0 11
raf.readLong()
raf.seek(11)
0 d 0 c (4 bytes)
0 0 j
raf.readChar()
(2 bytes) 0 a 0 v
0 a raf.seek(raf.length())
20
Exceptions
A maior parte das operaes de E/S provoca excees que
correspondem ou so subclasses de IOException
EOFException
FileNotFoundException
StreamCorruptedException
Para executar operaes de E/S preciso, portanto, ou
capturar IOException ou repassar a exceo atravs de
declaraes throws nos mtodos causadores
Nos exemplos mostrados o tratamento de excees foi
omitido. Tipicamente, as instrues close() ocorrem em um
bloco try-catch dentro de um bloco finally
try { ... } finally {
try { stream.close(); } catch (IOException e) {}
}
No adianta saber se o fechamendo to stream falhou
21
Serializao
Java permite a gravao direta de objetos em disco ou seu
envio atravs da rede
Para isto, o objeto deve declarar implementar java.io Serializable
Um objeto Serializable poder, ento
Ser gravado em qualquer stream usando o mtodo
writeObject() de ObjectOutputStream
Ser recuperado de qualquer stream usando o mtodo
readObject() de ObjectInputStream
Um objeto serializado um grafo que inclui dados da classe e
todas as suas dependncias
Se a classe ou suas dependncias mudar, o formato usado na
serializao mudar e os novos objetos sero incompatveis
com os antigos (no ser mais possvel recuperar arquivos
gravados com a verso antiga)
22
Exemplo: gravao e leitura de objetos
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(armario)
);
Arco a = new Arco(); Gravao
Flecha f = new Flecha();
de
// grava objeto Arco em armario
out.writeObject(a);
objetos
// grava objeto flecha em armario
out.writeObject(f);
27
Logger
Para criar um Logger, preciso usar seu construtor esttico:
Logger logger = Logger.getLogger("com.meupacote");
Os principais mtodos de Logger encapsulam os diferentes
nveis de detalhamento (severidade) ou tipos de informao.
Mtodos log() so genricos e aceitam qualquer nvel
config(String msg)
entering(String class, String method)
exiting(String class, String method)
fine(String msg)
finer(String msg)
finest(String msg)
info(String msg)
log(Level level, String msg)
severe(String msg)
throwing(String class, String method, Throwable e)
warning(String msg)
28
Exemplo de Logging
31
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
32
Java 2 Standard Edition
Classes internas
Helder da Rocha
www.argonavis.com.br 1
Classes internas
Classes podem ser membros de classes, de objetos ou locais
a mtodos. Podem at serem criadas sem nome, apenas com
corpo no momento em que instanciam um objeto
H poucas situaes onde classes internas podem ou devem
ser usadas. Devido complexidade do cdigo que as utiliza,
deve-se evitar usos no convencionais
Usos tpicos incluem tratamento de eventos em GUIs,
criao de threads, manipulao de colees e soquetes
Classes internas podem ser classificadas em quatro tipos
Classes dentro de instrues (classes annimas)
Classes dentro de mtodos (classes locais)
Classes dentro de objetos (membros de instncia)
Classes internas estticas (membros de classe)
2
Tipos de classes internas
So sempre classes dentro de classes. Exemplo:
class Externa {
private class Interna {
public int campo;
public void metodoInterno() {...}
}
public void metodoExterno() {...}
}
Podem ser private, protected, public ou package-private
Exceto as que aparecem dentro de mtodos, que so locais
Podem ser estticas:
E chamadas usando a notao Externa.Interna
Podem ser de instncia, e depender da existncia de objetos:
Externa e = new Externa();
Externa.Interna ei = e.new Externa.Interna();
Podem ser locais (dentro de mtodos)
E nas suas instrues podem no ter nome (annimas)
3
Classes estticas (internal classes)
Declaradas como static
Idnticas s classes externas, mas no tm campos static
Classe externa age como um pacote para vrias classes internas
estticas: Externa.Coisa, Externa.InternaUm
Compilador gera arquivo Externa$InternaUm.class
class Externa {
private static class InternaUm {
public int campo;
public void metodoInterno() {...}
}
public static class InternaDois
extends InternaUm {
public int campo2;
public void metodoInterno() {...}
}
public static interface Coisa {
void existe();
}
public void metodoExterno() {...}
}
4
Classes de instncia (embedded classes)
So membros do objeto, como mtodos e campos de dados
Requerem que objeto exista antes que possam ser usadas.
Externamente use referencia.new para criar objetos
Variveis de mesmo nome sempre se referem classe externa
Use NomeDaClasse.this para acessar campos internos
class Externa {
public int campoUm;
private class Interna {
public int campoUm;
public int campoDois;
public void metodoInterno() {
this.campoUm = 10; // Externa.campoUm
Interna.this.campoUm = 15;
}
}
public static void main(String[] args){
Interna e = (new Externa()).new Interna();
}
}
5
Classes dentro de mtodos (embedded)
Servem para tarefas "descartveis" j que deixam de existir
quando o mtodo acaba
Tm o escopo de variveis locais. Objetos criados, porm, podem
persistir alm do escopo do mtodo, se retornados
Se usa variveis locais do mtodo essas variveis devem ser
constantes (declaradas final), pois assim podem persistir aps a
concluso do mtodo.
public Multiplicavel calcular(final int a, final int b) {
class Interna implements Multiplicavel {
public int produto() {
return a * b; // usa a e b, que so constantes
}
}
return new Interna();
}
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}
6
Classes annimas (dentro de instrues)
Classes usadas dentro de mtodos freqentemente servem
apenas para criar um objeto uma nica vez
A classe abaixo estende ou implementa SuperClasse, que pode ser
uma interface ou classe abstrata (o new, neste caso, indica a
criao da classe entre chaves, no da SuperClasse)
Object i = new SuperClasse() { implementao };
Compilador gera arquivo Externa$1.class, Externa$2.class,
public... Multiplicavel calcular(final int a, final int b) {
return new Multiplicavel() {
public int produto() { Compare com parte em
return a * b; preto e vermelho do
} A classe est dentro da instruo: slide anterior!
};
} preste ateno no ponto-e-vrgula!
public static void main(String[] args){
Multiplicavel mul = (new Externa()).calcular(3,4);
int prod = mul.produto();
}
7
Para que servem classes internas?
Mais reutilizao
Recurso poderoso quando combinado com interfaces e
herana - facilita implementao de delegao: tipo de
herana de implementao que combinando composio
com herana de interfaces (simula herana mltipla)
"Ponteiros seguros" apontando para mtodos localizados
em classes internas
Flexibilidade para desenvolver objetos descartveis
Riscos
Aumenta significativamente a complexidade do cdigo
Dificulta o trabalho de depurao (erros de compilador
so mais confusos em classes internas)
Evite fugir do convencional ao usar classes internas
8
Como delegao simula herana mltipla
ClasseConcretaUm
ClasseConcretaDois
Efeito metodoUm()
metodoDois() metodoCinco()
Desejado metodoTres() metodoQuatro()
(no permitido em Java)
ClasseDerivada
ClasseConcretaUm interface
metodoUm() InterfaceUm
metodoDois() metodoCinco()
metodoTres() metodoQuatro()
Efeito Possvel
em Java
ClasseDerivada
ClasseConcretaDois
deleg:ClasseConcretaUm
deleg metodoCinco()
metodoQuatro() metodoQuatro() Classes existentes
metodoCinco()
Classes novas
deleg.metodoQuatro()
9
Exerccios
10
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
11
Java 2 Standard Edition
Como construir
aplicaes grficas
e applets
Helder da Rocha
www.argonavis.com.br 1
AWT e Swing
2
Histria do AWT
3
Java Foundation Classes
8
Containers essenciais
9
Exemplo de JFrame
import java.awt.*;
import javax.swing.*;
this.setSize(400,350);
this.setVisible(true);
}
}
10
AWT thread
13
Ciclo de vida
applet start
carregada descartando
visitando uma pgina
uma pgina
saindo ou
init descarregando destroy
uma pgina
stop
Applet mnimo
import javax.swing.*; Comentrio usado pelo
import java.awt.*; appletviewer para exibir
Applet:
> appletviewer HelloApplet.java
/*
* <applet code="HelloApplet" height="50"
* width="200"></applet>
*/
public class HelloApplet extends JApplet {
public void init() {
Container pane = this.getContentPane();
JLabel msg = new JLabel("Hello Web");
pane.add(msg);
}
}
15
Como usar applets
16
Applet/Aplicao
Desvantagens
Restries
Dependncia de plug-in e incompatibilidade em browsers
Tempo de download
Vantagens
Facilidade para realizar comunicao em rede
Possibilidade de abrir janelas externas
Capacidade de estender o browser em recursos de
segurana, protocolos de rede, capacidade grfica
Aplicao sempre atualizada
Capacidade de interagir com a pgina via JavaScript
Alternativa (1.4)
Java Web Start: aplicaes "normais" instaladas via rede
20
Java Web Start
Aplicao distribuda (cliente e servidor) que viabiliza a
distribuio e instalao de aplicaes via rede
Aplicao instalada via Web Start uma aplicao Java "normal" com
possibilidade de ter acesso irrestrito ao sistema (usurio deve
autorizar esse acesso na instalao)
Checa, sempre que inicializada, se houve atualizao caso a rede
esteja disponvel
Use o cliente Java Web Start para localizar aplicaes
remotas e instal-las na sua mquina
Em mquinas Windows, cliente instalado junto com J2SDK
Configure seu servidor Web para suportar JNLP (Java Network
Launch Protocol) e distribuir aplicaes via Java Web Start
Configurao bsica consiste da criao de alguns arquivos XML e
definio de novo MIME type no servidor
Veja links para info sobre Java Web Start na documentao do J2SDK
21
Recursos grficos bsicos: Fontes e Cores
23
JFrame
26
Exemplo
public class Swinggy2 extends JFrame {
Container ct = this.getContentPane();
ct.setLayout(new FlowLayout());
ct.add(b1);
ct.add(b2);
this.setSize(400,350);
this.setVisible(true);
}
} 27
Layout null
28
Exemplo
private JButton b1, b2, b3;
public Swinggy3(String nome) {
Container ct = this.getContentPane();
ct.setLayout(null);
31
Exemplo com BorderLayout
(...)
ct.setLayout(new BorderLayout());
b = new JButton[txt.length];
String[] pos = {BorderLayout.NORTH,
BorderLayout.SOUTH,
BorderLayout.WEST,
BorderLayout.EAST,
BorderLayout.CENTER};
for (int i=0; i < Math.min(b.length, pos.length); i++) {
b[i] = new JButton(txt[i], new ImageIcon(img[i]));
ct.add(pos[i], b[i]);
}
(...)
Veja restante do cdigo
(vetores b, txt e img)
em slides anteriores
32
Preferred Size dos componentes
Layout Managers so "tiranos"
impossvel controlar tamanho e posio de componentes se
um LayoutManager estiver sob controle
Para flexibilizar regras de posicionamento, configure o Layout
Manager usado atravs de seus construtores e mtodos
Para flexibilizar regras de dimensionamento, altere o
preferred size dos seus componentes
Tamanhos preferidos dos componentes
setPreferredSize(), disponvel em alguns componentes,
permite definir o seu tamanho ideal
getPreferredSize(), disponvel em todos os componentes pode
ser sobreposto em subclasses e ser chamado pelos Layout
Managers que o respeitam (Flow, Border)
33
Regras de BorderLayout
As reas de Border Layout s aceitam um componente
Se for necessrio ter mais de um componente no NORTH, por
exemplo, preciso primeiro adicion-los dentro de um nico
componente que ser adicionado (um Panel, por exemplo)
Regras de ocupao de espao
NORTH E SOUTH tm prioridade sobre a ocupao da largura (usam
todo o espao disponvel) mas tm altura limitada pelo preferred size
do componente
EAST e WEST tem altura limitada apenas pela existncia ou no de
componentes no NORTH e/ou SOUTH e tem largura limitada pelo
preferred size do componente
CENTER ignora preferred size e ocupa todo o espao que puder, mas
limitado pela existncia de NORTH, SOUTH, EAST ou WEST
Construtores de BorderLayout permitem controle detalhado
de espaamento e outros detalhes
34
Exemplo com GridLayout
(...)
ct.setLayout(new GridLayout(3, 2));
b = new JButton[txt.length];
for (int i = 0; i < b.length; i++) {
b[i] = new JButton(txt[i],
new ImageIcon(img[i]));
ct.add(b[i]);
}
(...) Redimensione a janela
e veja o resultado
35
Regras de GridLayout
37
Regras de FlowLayout
pane
EAST
39
Exemplo (1/2)
import javax.swing.*;
import java.awt.*;
public class Swinggy8 extends JFrame {
public Swinggy8(String nome) {
super(nome);
Container framePane = this.getContentPane();
framePane.setLayout(new BorderLayout());
JPanel botoes = new JPanel();
botoes.setBackground(Color.yellow);
botoes.setLayout(new GridLayout(3,1));
botoes.add(new JButton("Um"));
botoes.add(new JButton("Dois"));
botoes.add(new JButton("Trs"));
JPanel lateral = new JPanel();
lateral.add(botoes);
40
Exemplo (2/2)
JInternalFrame if1 =
new JInternalFrame("Um", true, true, true);
JInternalFrame if2 =
new JInternalFrame("Dois", true, true, true);
if1.getContentPane().add(new JEditorPane());
if2.getContentPane().add(new JEditorPane());
if1.setBounds(20,20, 250,200);
if2.setBounds(70,70, 250,200);
if1.setVisible(true);
if2.setVisible(true);
42
Exerccio
45
Eventos da Interface Grfica
Descendentes de java.awt.event.AWTEvent
Divididos em categorias (java.awt.event)
ActionEvent (fonte: componentes de ao)
MouseEvent (fonte: componentes afetados pelo mouse)
ItemEvent (fonte: checkboxes e similares)
AdjustmentEvent (fonte: scrollbars)
TextEvent (fonte: componentes de texto)
WindowEvent (fonte: janelas)
FocusEvent (fonte: componentes em geral)
KeyEvent (fonte: componentes afetados pelo teclado)
...
46
Listeners
56
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
57
Java 2 Standard Edition
Fundamentos de
Helder da Rocha
www.argonavis.com.br
1
JDBC
2
JDBC
3
Pacote java.sql
5
Arquitetura JDBC
Aplicao JDBC
API JDBC (pacote java.sql)
JDBC Driver Manager
Protocolo JDBC
Driver tipo 1 Driver tipo 2 Driver tipo 3 Driver tipo 4
Ponte JDBC-ODBC API nativa JDBC-Rede Pure Java
BD BD BD BD
6
URL JDBC
7
DriverManager e Driver
A interface Driver utilizada apenas pelas implementaes
de drivers JDBC
preciso carregar a classe do driver na aplicao que ir utiliz-
lo. Isto pode ser feito com Class.forName():
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
9
Statement
10
Enviando instrues
int linhasModificadas =
stmt.executeUpdate("INSERT INTO dinossauros "
+ "(codigo, genero, especie) VALUES "
+ "(499,'Fernandosaurus','brasiliensis')");
ResultSet cursor =
stmt.executeQuery("SELECT genero, especie " +
" FROM dinossauros " +
" WHERE codigo = 355");
11
ResultSet
12
Tipos JDBC e mtodos getXXX()
while (rs.next()) {
int x = rs.getInt("Numero");
String s = rs.getString("Texto");
java.sql.Date d = rs.getDate("Data");
// faa algo com os valores obtidos...
}
14
Transaes
Permite a execuo atmica de comandos enviados ao banco.
Implementada atravs dos mtodos de Connection
commit()
rollback()
setAutoCommit(boolean autoCommit): default true.
Por default, as informaes so processadas a medida em que
so recebidas. Para mudar:
con.setAutoCommit(false);
Agora vrias instrues podem ser acumuladas.
Para processar:
con.commit();
Se houver algum erro e todo o processo necessitar ser desfeito,
pode-se emitir um ROLLBACK usando:
con.rollback();
15
PreparedStatement
Statement pr-compilado que mais eficiente quando vrias
queries similares so enviadas com parmetros diferentes
String com instruo SQL preparado previamente, deixando-
se "?" no lugar dos parmetros
Parmetros so inseridos em ordem, com setXXX() onde XXX
um tipo igual aos retornados pelos mtodos de ResultSet
String sql = "INSERT INTO Livros VALUES(?, ?, ?)";
PreparedStatement cstmt = con.prepareStatement(sql);
cstmt.setInt(1, 18943);
cstmt.setString(2, "Lima Barreto");
cstmt.setString(3, "O Homem que Sabia Javans");
cstmt.executeUpdate();
...
16
Stored Procedures
Procedimentos desenvolvidos em linguagem proprietria do
SGBD (stored procedures) podem ser chamados atravs de
objetos CallableStatement
Parmetros so passados da mesma forma que em instrues
PreparedStatement
Sintaxe
con.prepareCall("{ call proc_update(?, ?, ...) }");
con.prepareCall("{ ? = call proc_select(?, ?, ...) }");
CallableStatement cstmt =
con.prepareCall("{? = call sp_porAssunto(?)}";
cstmt.setString(2, "520.92");
ResultSet rs = cstmt.executeQuery();
...
17
Fechar conexo e Excees
18
Metadados
23
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
24
Java 2 Standard Edition
Fundamentos de
Helder da Rocha
www.argonavis.com.br
1
Sobre este mdulo
6
Socket
Um dos lados de uma conexo bidirecional TCP
Principais mtodos servem para obter fluxos de
entrada e sada
getInputStream()
getOutputStream()
close()
Exemplo
InetAddress end =
InetAddress.getByName("info.acme.com");
Socket con = new Socket(end, 80);
InputStream dados = con.getInputStream();
OutputStream comandos =
con.getOutputStream();
8
ServerSocket
10
Exerccios
argonavis.com.br
13
Java 2 Standard Edition
Fundamentos de
Objetos
Remotos
Helder da Rocha
www.argonavis.com.br
1
Sobre este mdulo
2
O que so objetos remotos
6
Arquitetura RMI
Uma aplicao distribuda com RMI tem acesso transparente
ao objeto remoto atravs de sua Interface Remota
A "Interface Remota" uma interface que estende java.rmi.Remote
A partir da Interface Remota e implementao do objeto remoto o
sistema gera objetos (proxies) que realizam todas as tarefas
necessrias para viabilizar a comunicao em rede
Objeto remoto
Comunicao
RMIClient aparente HelloImpl
java.rmi.Remote
Stub Skeleton
HelloImpl_Stub RemoteHello HelloImpl_Skel
Comunicao
real
7
Padres de Projeto: Proxy
13
5. Gerar stubs e skeletons
14
6. Compilar e instalar o(s) cliente(s)
Escreva uma classe cliente que localize o(s) objeto(s) no
servio de nomes (java.rmi.Naming)
a) Obtenha uma instncia remota de cada objeto
b) Use o objeto, chamando seus mtodos
import java.rmi.*;
public class MensagemClient {
public static void main(String[] args)
throws Exception {
String hostname = args[0];
String objeto = args[1];
Object obj =
Naming.lookup("rmi://" + hostname + "/"
+ objeto);
Mensagem mens = (Mensagem) obj;
System.out.println("Mensagem recebida: "
+ mens.getMensagem());
mens.setMensagem("Fulano esteve aqui!");
}
}
15
7. Instalar o stub no(s) cliente(s)
16
8. Iniciar o RMI Registry no servidor
No Windows
> start rmiregistry
No Unix
> rmiregistry &
(O RMI Registry fica "calado" quando est rodando)
Neste exemplo ser preciso iniciar o RMIRegistry no
diretrio onde esto os stubs e interface Remote
Isto para que o RMIRegistry veja o mesmo CLASSPATH
que o resto da aplicao
Em aplicaes RMI reais isto no necessrio, mas
preciso definir a propriedade java.rmi.server.codebase
contendo os caminhos onde se pode localizar o cdigo
17
9. Iniciar o servidor de objetos
18
10. Iniciar os clientes
Rode o cliente
Informe o endereo do servidor e objetos a utilizar
> java MensagemClient maquina.com.br mensagens
Exerccio
Implemente os exemplos mostrados, inventando uma
mensagem diferente para seu objeto remoto. Use o seu
cliente para acessar os objetos remotos registrados
nas mquinas de seus colegas.
19
Resumo
java.rmi.Remote extends interface Mensagem extends Remote{ Mensagem.java
void getMensagem() throws RemoteException;
} 1
java.rmi.server.UnicastRemoteObject
implements
2
extends
MensagemImpl.java MensagemImpl_Skel
MensagemImpl_Stub
Mensagem.java
5 4 ...
MensagemServer.java void getMensagem throws
Mensagem h =(Mensagem) MensagemImpl rf = RemoteException {
Naming.lookup("hello"); System.out.println("Hello");
Stub Skel
new MensagemImpl();
h.getMensagem(); Naming.bind(rf, "hello"); }
3
6 Java 2 RMIC
compiler
MensagemImpl
(obj remoto)
MensagemImpl_Stub MensagemImpl_Skel
JRMP
20
Curso J100: Java 2 Standard Edition
Reviso 17.0
argonavis.com.br
21