Você está na página 1de 416

INTRODUO

Grupo Multitecnus, 2013


www.multitecnus.com

Grupo Multitecnus ,2013

1. Introduo

1.1. Cdigo-fonte e Bytecode


1.2. Compilao e Execuo no Console
1.3. Eclipse
1.3.1. Instalao
1.3.2. Executando o Eclipse
1.3.3. Perspectiva
1.3.4. Programando em Java
1.3.5. Configurao do Eclipse

9
10
13
14
15
18
20
38

2. Programando em Java

41

2.1. Aplicativos
2.2. Variveis de Memria
2.3. Declarao de variveis
2.4. Comentrios
2.5. Sequncias de Escape

42
47
50
56
57
2

Grupo Multitecnus ,2013

2.6. Operadores
2.6.1. Operador Atribuio
2.6.2. Operadores Aritmticos
2.6.3. Operadores Relacionais
2.6.4. Operadores Lgicos
2.6.5. Operador de Concatenao
2.7. Mtodo
2.7.1. Mtodos criados pelo programador
2.8. Atributo
2.9. Classe e Objeto
2.10. Herana
2.10.1. Herana e Converso de Tipos
2.11. Polimorfismo
2.11.1. @Override
2.12. Pacote
2.12.1. Criando e Utilizando um Pacote
2.13. Modificadores
2.13.1 Modificadores de Classe
2.13.2 Modificadores de Mtodo
2.13.2 Modificadores de Atributo

59
60
60
64
65
65
66
72
82
85
94
102
106
115
116
123
129
129
131
133
3

Grupo Multitecnus ,2013

2.14. Palavras-chave this e super


2.15. Interface
2.16. Fluxos de Controle
2.16.1. Execuo Condicional: if
2.16.2. Execuo Condicional: switch
2.16.3. Repetio: for
2.16.4. Repetio: while
2.16.5. Repetio: do/while
2.17. Array
2.17.1. Declarando uma varivel do tipo array
2.17.2. Criando um array
2.17.3. Iniciando um array
2.18. Tratamento de Exceo
2.18.1. Manipulando Excees Especficas
2.18.2. Clusula Finally
2.18.3. Clusulas Throw e Throws
2.19. Interface Grfica GUI (Graphical User Iinterface)
2.19.1. AWT (Abstract Window Toolkit) e Swing
2.19.2. Swing
2.19.2.1. Instalao do Window Builder

135
141
144
145
157
163
170
180
182
183
184
187
191
196
200
202
207
208
211
211
4

Grupo Multitecnus ,2013

2.19.2.2. JApplet
2.19.2.3. Iniciando um Projeto Grfico
2.19.3. Fixao de Problemas (Quick Fix)
2.19.3.1. Fixao do Problema: imports nunca utilizados
2.19.3.2. Fixao do Problema: no declarao de serialVersionUID
2.19.4. Layout
2.19.5. Manipulao de Evento
2.19.5.1. Exemplos de manipulao de evento
2.20. Thread
2.20.1. Interface Runnable
2.20.2. Estendendo a Classe Thread
2.20.3. Sincronizando Threads
2.21. JFrame
2.21.1. Frame com mais de uma Thread em Execuo
2.22. JAR
2.22.1 Gerando o arquivo .jar
2.23. Tipos Genricos
2.23.1. Nomeando Variveis de Tipo: Conveno Utilizada

220
221
233
234
237
241
246
261
270
271
275
277
282
286
293
294
304
307

Grupo Multitecnus ,2013

2.24. Colees
2.24.1. Algoritmos
2.24.1.1. Sort
2.24.1.2. Shuffle
2.24.1.3. Reverse
2.24.1.4. Rotate
2.24.1.5. Swap
2.24.1.6. ReplaceAll
2.24.1.7. Fill
2.24.1.8. BinarySearch
2.24.1.9. IndexOfSubList
2.24.1.10. LastIndexOfSubList
2.24.1.11. Frequency
2.24.1.12. Disjoint
2.24.1.13. Min
2.24.1.14. Max
2.24.2. Exemplo
2.25. JDBC
2.25.1. MySQL
2.25.2. Manipulando Dados no MySQL com Java

308
312
312
313
313
313
313
314
314
314
314
315
315
315
316
316
317
329
330
340
6

Grupo Multitecnus ,2013

2.26. Arquivos em Disco


2.26.1. FileInputStream
2.26.2. FileOutputStream
2.26.3. Operao com Arquivo em Disco
2.27. Serializao
2.28. Anotaes
2.28.1. Criando Anotaes com o Eclipse
2.28.2. Anotaes Predefinidas
2.29. XML eXtensible Markup Language
2.29.1. Meta-informao
2.29.2. Regras
2.29.3. DTD Document Type Definition
2.29.4. XSD XML Schema Definition
2.29.5. Manipulando XML pelo Eclipse

350
354
355
356
362
371
373
375
384
385
391
394
406
410

Referncias Bibliogrficas

415

Grupo Multitecnus ,2013

1. Introduo
Java uma Linguagem de Programao orientada a objetos (LPOO),
projetada para ser portvel entre diferentes plataformas de hardware e software,
ou seja, um programa criado no ambiente Windows pode ser executado no
ambiente Linux ou UNIX.

Como qualquer linguagem de programao, JAVA lhe permitir escrever


programas que rodaro com capacidade semelhante de qualquer programa para
desktop. Java tambm permite construir pginas Web, e que podem ser acessadas
por um navegador, tal como: Chrome, Firefox, IE , Opera, etc.

Grupo Multitecnus ,2013

1.1. Cdigo-fonte e Bytecode

Java uma linguagem compilada, o que significa que seu cdigo-fonte


deve ser compilado. Ao passo que outras linguagens criam, com a compilao, um
cdigo-objeto (cdigo-fonte traduzido para linguagem de mquina) seguido de um
cdigo-executvel final (como C e C++) com a linkedio, Java cria, com a
compilao, um cdigo intermedirio denominado Bytecode, igualmente em
cdigo binrio, mas que necessita de uma mquina virtual Java (ou JVM, Java
Virtual Machine) para ser executado. Assim, todo sistema que contiver um JVM
instalado, poder executar o bytecode da mesma forma. E isso que confere Java
a flexibilidade de rodar em qualquer plataforma.

Grupo Multitecnus ,2013

1.2. Compilao e Execuo no Console

Por exemplo, seja o arquivo PrimeiroExemplo.java contendo o cdigofonte que se deseja executar:
public class PrimeiroExemplo
{
public static void main(String[] args)
{
System.out.println("Primeiro Exemplo!");
}
}
Este programa escreve na tela a mensagem Primeiro Exemplo! .

10

Grupo Multitecnus ,2013

Para compilar o cdigo-fonte, deve-se executar o arquivo javac.exe,


encontrado na pasta bin de instalao do Java ( JAVA_HOME\bin ), informando o
nome completo do arquivo contendo o cdigo-fonte (com a extenso, inclusive):
javac PrimeiroExemplo.java
Isto far com que seja criado o arquivo PrimeiroExemplo.class. Para executar o
arquivo .class criado pela compilao, deve-se executar o arquivo java.exe,
informando o nome do bytecode criado sem, no entanto, utilizar a extenso .class
java PrimeiroExemplo
No informe o nome completo na execuo (javac PrimeiroExemplo.class); se o
fizer, Java informar que houve uma exceo (erro) de execuo.
Java sensvel ao caso, sendo assim letras maisculas e minsculas so
consideradas diferentes.
11

Grupo Multitecnus ,2013

A seguir, so exibidos os passos na tela do MS-DOS:


O comando dir mostra o
contedo da pasta
C:\java. Note que,
inicialmente, s existe o
cdigo-fonte,
PrimeiroExemplo.java.
Aps a compilao, o
comando dir mostra o
arquivo
PrimeiroExemplo.class
criado, e que o
bytecode citado em 1.1.
Observe a execuo de
PrimeiroExemplo.class
por meio do arquivo java.

12

Grupo Multitecnus ,2013

1.3. Eclipse

Alm

do

modo

console,

pode-se

utilizar

um

ambiente

de

desenvolvimento integrado (IDE Integrated Development Environment) para criar


e executar cdigos em Java. Um IDE um ambiente que realiza edio de texto,
compilao e execuo, alm de outras tarefas, como depurao do cdigo-fonte,
refatorao

(refactoring),

que

altera

cdigo

mantendo

as

mesmas

funcionalidades. uma tcnica que visa a procura e a eliminao de bugs


(problemas) num sistema de software.
H IDEs no mercado para vrias linguagens. Para Java, as mais utilizadas
so o Netbeans e o Eclipse (o qual ser utilizado neste trabalho).
13

Grupo Multitecnus ,2013

1.3.1. Instalao

Para instalar o Eclipse, basta que seja efetuado o download do IDE (arquivo
.zip) em http://www.eclipse.org/downloads/, descomprimindo-o numa pasta
qualquer do HD do seu computador. Assim que o fizer, aconselho-o a criar um atalho
para o arquivo eclipse.exe, facilitando o acesso ao mesmo.
Neste trabalho ser utilizado o Eclipse IDE for Java EE Developers e o JRE
(Java Runtime Environment) para executar os programas Java. Efetue o download do
JRE adequado ao seu caso. Para o ambiente utilizado neste trabalho, acesse o site
http://www.oracle.com/technetwork/java/javase/downloads/jre-6u26-download-400751.html
e faa o download do arquivo jre-6u26-windows-x64.exe .

14

Grupo Multitecnus ,2013

1.3.2. Executando o Eclipse

Na pasta onde foi descomprimido o arquivo baixado, execute o


eclipse.exe. Surge, ento, a imagem abaixo:

15

Grupo Multitecnus ,2013

Em seguida, o Eclipse pede para voc informar o local que conter os arquivos dos
projetos criados por voc (Workspace):

16

Grupo Multitecnus ,2013

Aps clicar o boto OK, surge o ambiente de desenvolvimento:

17

Grupo Multitecnus ,2013

1.3.3. Perspectiva

Para iniciar os trabalhos com Java,


selecione a perspectiva (perspective)
Java, o que far com que a bancada
de trabalho (workbench) contenha
janelas e ferramentas prprias para o
desenvolvimento de programas na
linguagem. Para tal, d um clique em
Window -> Open Perspective -> Java

18

Grupo Multitecnus ,2013

Com esta perspectiva (Java), o workbench se parecer com:

Voc poder configurar outras perspectivas (como JAVA EE ), se necessrio.

19

Grupo Multitecnus ,2013

1.3.4. Programando em Java

Para iniciar os trabalhos , crie um projeto (Java Project) clicando em


File -> New -> Java Project.
A criao do projeto ser,
ento, o primeiro passo no
desenvolvimento do cdigofonte. Depois, deve-se criar
uma classe e sua funo
main, a partir da qual o
cdigo (aps a compilao)
poder ser executado.

20

Grupo Multitecnus ,2013

Ao surgir a janela de criao de um novo projeto, digite um nome para ele (por
exemplo, projeto1. Isto criar a pasta projeto1 no Workspace. Clique em Next.

21

Grupo Multitecnus ,2013

A prxima janela diz respeito a configuraes adicionais (como a pasta onde ser
criado o bytecode gerado pelo projeto: Default output folder). Clique em Finish.

22

Grupo Multitecnus ,2013

Na janela Package Explorer d um clique na ponta da seta anterior a projeto1. Em


seguida, d um clique com o boto direito do mouse em src e, para terminar,
clique em Class:

23

Grupo Multitecnus ,2013

Digite PrimeiroExemplo como nome da classe, e crie a funo main:

24

Grupo Multitecnus ,2013

Observe que o nome da classe aparece na janela Package Explorer:

A etapa, agora, a criao do cdigo adicional ao cdigo j preparado pelo Eclipse.


25

Grupo Multitecnus ,2013

ATENO
Como j foi mencionado, Java sensvel ao caso do caractere. Isto
significa que, para o compilador Java, o caractere R diferente do caractere r.
Sempre inicie o nome da classe com uma letra. H uma conveno em
Java que recomenda que o nome de uma classe sempre inicie em maiscula.
uma boa prtica de programao. No utilize todos os caracteres do nome em
maiscula.
Utilize o prprio Eclipse para digitar seus cdigos, pois os caracteres de
alguns editores de texto como o MS-Word causam erro no cdigo (por exemplo, as
aspas do Word no so reconhecidas como aspas pelo editor do Eclipse).
26

Grupo Multitecnus ,2013

Clicando o nome da classe recm criada, o cdigo inicial disponibilizado para


edio.

27

Grupo Multitecnus ,2013

Digite a linha de comando abaixo na funo main:


System.out.println("Primeiro Exemplo!");
O cdigo resultante mostrado abaixo:

28

Grupo Multitecnus ,2013

Uma vez que voc altere o cdigo, o Eclipse realiza, de forma automtica, a
compilao. Isto pode ser visualizado no menu Project, item Build Automatically:

29

Grupo Multitecnus ,2013

Pronto. Se tudo foi feito conforme os passos anteriores, hora de executar o


cdigo, cujo objetivo exibir a mensagem Primeiro Exemplo! . Voc pode utilizar
um dentre trs possibilidades:

a) Clicar em Run -> Run:

b) Pressionar Ctrl+F11;

c) Clicar no atalho:

30

Grupo Multitecnus ,2013

Na janela que surge, clique em OK. Isto far com que o arquivo
PrimeiroExemplo.java seja salvo antes da execuo.

31

Grupo Multitecnus ,2013

O resultado da execuo pode ser visto em Console (parte inferior do ambiente).

32

Grupo Multitecnus ,2013

Abaixo, mostrada com mais detalhe a janela Console:

33

Grupo Multitecnus ,2013

Caso seja cometido algum erro, como o no balanceamento das aspas duplas na
linha de comando, ou mesmo utilizar a letra s minscula para definir o comando
System, ser gerada uma mensagem de erro pelo compilador

34

Grupo Multitecnus ,2013

Caso voc prossiga (clicando em Proceed), o erro ser exibido em Console:

35

Grupo Multitecnus ,2013

Outras sinalizaes de erro sero disponibilizadas pelo Eclipse:


a) No cdigo:

b) Na janela Problems:

36

Grupo Multitecnus ,2013

O Eclipse pode auxili-lo durante a digitao. Para ver como funciona, v ao cdigofonte, digite o trecho System. e pressione Ctrl+espao. Surge, ento, uma janela
propondo-lhe sugestes de cdigo. Clique em uma delas para visualizar um texto
explicativo e, em seguida, um clique duplo para aceit-la:

37

Grupo Multitecnus ,2013

1.3.5. Configurao do Eclipse

Como foi dito anteriormente, o Eclipse est configurado para compilar o


cdigo automaticamente, e voc pode alterar essa configurao acessando o menu
Project. Outra forma que voc tem para configurar o ambiente, clicando em
Window -> Preferences:

38

Grupo Multitecnus ,2013

Voc pode alterar uma


ou mais configuraes do
ambiente do Eclipse. Por
exemplo, em General ->
Workspace, voc pode
marcar

ou

desmarcar

Build automatically, alm


de outras opes.

39

Grupo Multitecnus ,2013

Outra configurao que


pode ser interessante,
poder

visualizar

os

nmeros das linhas.


V em General -> Editors
-> Text Editors e marque
Show line numbers.

40

Grupo Multitecnus ,2013

2. Programando em Java
Programas escritos em Java podem ser construdos para rodar na Web ou
localmente. Podem conectar equipamentos e controlar dispositivos. Enfim, uma
linguagem muito poderosa, e que permite a construo de poderosos sistemas em
ambientes crticos, como os utilizados em transaes financeiras, bem como
sistemas mais simples, em ambientes nem to crticos como os do mercado
financeiro.
uma linguagem que utiliza o paradigma da orientao a objetos,
implementando vrias das facilidades que esse paradigma disponibiliza.

41

Grupo Multitecnus ,2013

2.1. Aplicativos
Aplicativos so cdigos Java com a seguinte estrutura mnima:

public class Nome_da_classe


{
public static void main(String[] args)
{
}
}
Inicialmente, criaremos programas Java cujos resultados sero exibidos
no console do Eclipse, e que, apesar de no possurem apelo visual algum,
permitiro ensinar os conceitos iniciais da linguagem.
42

Grupo Multitecnus ,2013

Inicia-se um aplicativo com a declarao public class seguido do nome


da classe, que deve iniciar com maiscula, de acordo com a conveno de criao
de programas em Java. Aps esta declarao, delimita-se o contedo da classe por
chaves (aberta e fechada), como abaixo:
public class Nome_da_classe
{

43

Grupo Multitecnus ,2013

Uma vez criada a classe, deve-se construir a funo principal (main)


dentro dos limites impostos pela classe:
public class Nome_da_classe
{
public static void main(String[] args)
{
}
}

Funo, que na orientao a objetos chamada mtodo, o local que


contm o cdigo a ser executado. Uma classe pode possuir um ou mais mtodos.
44

Grupo Multitecnus ,2013

O mtodo main inicia com public static void main (String[] args),
seguido de chaves (aberta e fechada), delimitando o mtodo:
public class Nome_da_classe
{
public static void main(String[] args)
{
}
}
Observe que o mtodo foi escrito algumas colunas deslocadas direita, o
que chamado identao. Esta tcnica no altera o desempenho de execuo, ou
facilita a compilao, mas permite uma visualizao mais fcil do cdigo pelo
programador. uma boa prtica de programao, e deve ser utilizada.
45

Grupo Multitecnus ,2013

Observaes:
a) No utilize espao em branco para separar as palavras de um nome composto.
Utilize, para esse fim, o trao sublinhado (underline), ou a tcnica de iniciar com
maiscula cada incio de palavra que compuser o nome. Por exemplo, se o
nome da classe deve conter as palavras primeiro e exemplo, ento, o nome
da classe pode ser: Primeiro_exemplo ou PrimeiroExemplo;
b) Eclipse posiciona a chave aberta aps o nome da classe e aps o nome do
mtodo. No exemplo dado neste trabalho, a chave aberta foi posicionada logo
abaixo do nome da classe e do nome do mtodo. Independe o posicionamento
da chave aberta. O importante a abertura e o fechamento dos limites (da
classe e do mtodo main), a despeito de qual tcnica seja utilizada.
46

Grupo Multitecnus ,2013

2.2. Variveis de Memria


Tambm chamadas simplesmente de Variveis, so smbolos criados pelo
programador para referenciar valores armazenados na memria, permitindo sua
manipulao de maneira transparente, isto , sem haver a necessidade de se
conhecer a posio de memria (endereo de memria), que fica a cargo do
Sistema Operacional gerenciar.
Antes de utilizar uma varivel, precisamos dizer ao interpretador Java
qual o tipo de valor que queremos armazenar naquela varivel, o que far com que
o Sistema Operacional aloque uma quantidade de memria suficiente para
armazenar o valor desejado.

47

Grupo Multitecnus ,2013

Tipos mais comum em Java, memria ocupada, e valores que podem ser atribudos
a uma varivel do tipo especificado:
- Tipo inteiro:
- long (64 bits): -9.223.372.036.854.775.808L a + 9.223.372.036.854.775.807L
- int (32 bits): -2.147.483.648 a + 2.147.483.647
- short (16 bits): -32.768 a +32.767
- byte (8 bits): -128 a + 127
- Tipo em ponto flutuante:
- double (64 bits): 1,797693134862311570 x 10+308 (15 dg. signif.)
- float (32 bits): 3,40282347 x 10+38 (7 dg. signif.)
- Tipo lgico (booleano):
- boolean (1 bit): false / true
48

Grupo Multitecnus ,2013

- Tipo caractere:
- char (16 bits): Caracteres alfanumricos e simblicos, delimitados por aspas
simples (apstrofes). Uma varivel do tipo char s pode
armazenar um (e apenas um) caractere por vez.
- Tipo literal:
- String: Conjunto de caracteres (alfanumricos e simblicos) delimitados por
aspas duplas. Observe que String, ao contrrio dos demais tipos
listados anteriormente, String inicia com letra maiscula. Na
realidade, trata-se de uma classe, mas a utilizaremos, por enquanto,
como um tipo comum.
49

Grupo Multitecnus ,2013

2.3. Declarao de variveis


Uma varivel pode ser definida em qualquer ponto de um programa em
Java (algumas regras sero discutidas mais tarde). Para tal, defina o tipo a ser
utilizado e o nome da varivel (sempre iniciando com letra minscula), seguido de
ponto e vrgula.
Por exemplo, no Eclipse, crie um novo projeto e execute o cdigo abaixo:
public class Atrib_Val{
public static void main (String args[]){
int a;
a = 1;
System.out.println (a: + a);
}
}
50

Grupo Multitecnus ,2013

Observao:
a) Para iniciar um novo projeto, de um clique com o boto direito do mouse no
nome do projeto atualmente em uso (visvel no Package Explorer) e, em
seguida, em Close Project. Caso haja alteraes no salvas, aparecer a janela
de confirmao abaixo:

b) Em seguida, repita as operaes para criar um projeto Java. Aps criada, voc
poder criar uma nova classe clicando com o boto direito do mouse no nome
do novo projeto (tambm visvel no Package Explorer).
51

Grupo Multitecnus ,2013

c) Toda linha de comando em Java deve finalizar com um caractere ponto e


vrgula:
int a;
a = 1;
System.out.println (a: + a);
d) Pode-se definir mais de uma varivel de mesmo tipo na mesma declarao,
separando-se os nomes da variveis pelo caractere vrgula:
int b , c;
b = 1;
c = 2;
System.out.println (b: + b + c: + c);
52

Grupo Multitecnus ,2013

e) O comando System.out.println exibe o que est entre parnteses: o que estiver


entre aspas, impresso como escrito; o que no estiver entre aspas, ser
substitudo pelo seu contedo. Equivale ao comando escrever do algoritmo.
int a;
a = 1;
System.out.println (a: + a);
No exemplo acima, so executados os seguintes passos:
-Declara-se a varivel de tipo int de nome a: int a;
-Atribui-se o valor 1 varivel a: a = 1;
-Imprime-se (na tela) a informao: a: 1 (resultado da juno da string a: com o
contedo da varivel a).
53

Grupo Multitecnus ,2013

Abaixo, listam-se algumas declaraes de variveis:


long a;

byte f = 10, g, h;

char primeira_letra = A;

int b, c, d = 100;

double i;

boolean valido = true;

short e;

float j;

String str = Al Voc !;

Observaes:
a) As variveis d, f, primeira_letra, valido e str so iniciadas na declarao;
b) Os nomes das variveis so de responsabilidade do programador. Pode ser o
nome que voc desejar. Um mtodo no pode ter duas variveis com o mesmo
nome;
c) Inicie o nome da varivel com letra minscula ou trao sublinhado (underline).
Os demais podem ser caracteres, traos sublinhados e/ou nmeros. No use
espaos em branco ou caracteres especiais ou acentuados.
54

Grupo Multitecnus ,2013

Um cdigo com vrias declaraes pode ser visto a seguir:


public class Atrib_Val
{
public static void main (String args[])
{
int a, b;
short c = 100;
byte d = 10, e;
double f;
char g = A;
boolean h = true;
String str = Al Voc !;
a = 1;
b = 2;
e = 15;
f = 1.0;

System.out.println (a: + a);


System.out.println (b: + b);
System.out.println (c: + c);
System.out.println (d: + d);
System.out.println (e: + e);
System.out.println (f: + f);
System.out.println (g: + g);
System.out.println (h: + h);
System.out.println (str: + str);
}
}

55

Grupo Multitecnus ,2013

2.4. Comentrios
Muitas vezes, deve-se adicionar uma ou mais linhas de comentrio ao
cdigo, sendo que o comentrio de uma linha iniciado por // , e o de vrias
linhas delimitado por /* e */ . Por exemplo:
public class Atrib_Val // O nome da classe deve iniciar com maiscula
{
public static void main (String args[])
{
/*
O cdigo (linhas de comando) fica aqui.
Toda linha de comando termina com um
ponto e vrgula.
*/
System.out.println (Exemplificando comentrios!);
}
}
56

Grupo Multitecnus ,2013

2.5. Sequncias de Escape

Nem todos os caracteres so imprimveis, como o caractere LF ( Line


Feed, ou nova linha que ocorre quando voc pressiona a tecla ENTER) ou o
caractere aspas (que serve ele mesmo para delimitar uma String).
Para resolver esse problema, Java herdou da linguagem C as constantes
caractere de barra invertida, ou Sequncias de Escape, algumas listadas abaixo:

\n

LF nova linha (Line Feed)

\t

TAB tabulao

\\

Barra invertida

Apstrofo

Aspas
57

Grupo Multitecnus ,2013

Por exemplo:

public class Seq_escape


{
public static void main (String args[])
{
System.out.println (Uma linha. \n Outra linha.);
System.out.println (Itens:);
System.out.println (\t 1. Primeiro item);
System.out.println (\t 2. Segundo item);
System.out.println (\t 3. Terceiro item);
}
}

58

Grupo Multitecnus ,2013

2.6. Operadores
Ao executar o trecho de cdigo abaixo:
System.out.println (Dez = + 10);
Java realiza as seguintes tarefas:
a) Converte o nmero 10 na string 10;
b) Une (concatena) a string Dez = com a string 10 (da converso acima);
c) Imprime (na tela) a string resultante da concatenao: Dez = 10.
A operao de concatenao realizada pelo operador de concatenao: +.
Java define os seguintes operadores: atribuio, aritmticos, relacionais,
lgicos e concatenao.
59

Grupo Multitecnus ,2013

2.6.1. Operador Atribuio


Nome
Recebe

Operador

Exemplo

num = 10

Explicao
A varivel num recebe 10

2.6.2. Operadores Aritmticos


Nome

Operador

Exemplo

Explicao

Adio

a + b

O contedo de a adicionado ao contedo de b

Positivo (unrio)

+ a

O sinal de a mantido (no h inverso de sinal)

Subtrao

a - b

Negativo (unrio)

- a

Multiplicao

a * b

Os contedos de a e b so multiplicados

Diviso

a / b

O contedo de a dividido pelo contedo de b

Mdulo

a % 2

Obtm-se o resto da diviso de a por 2

O contedo de a subtrado do contedo de b


O sinal de a invertido (se positivo vira negativo)

60

Grupo Multitecnus ,2013

Observao:
a) H dois operadores aritmticos unrios, denominados: incremento e
decremento. Eles operam de forma semelhante s operaes de adio e
subtrao, respectivamente, mas com somente um operando.
Na tabela abaixo, listam-se exemplos desses operadores:
Nome

Operador

Operao

Explicao

Pr-incremento

++

++ a

Incrementa o valor de a de uma unidade antes de us-lo

Ps-incremento

++

a ++

Usa o valor da varivel a e depois a incrementa de um

Pr-decremento

--

--a

Decrementa o valor de a antes de usar a varivel

Ps-decremento

--

a--

Usa a varivel a e depois decrementa seu valor

61

Grupo Multitecnus ,2013

O operador incremento adiciona uma unidade varivel, ou seja,


a ++ ;
equivale a:
a = a + 1;
enquanto que o operador decremento realiza operao inversa, ou seja,
a --;
equivale a:
a = a - 1;
Por exemplo, considerando os trechos de cdigo abaixo:
a = 1;
r1 = ++ a ;

b = 1;
r2 = b ++ ;

c = 1;
r3 = - - c ;

d = 1;
r4 = d - - ;

b recebe 1
r2 recebe 1
b passa a 2

c recebe 1
c passa a 0
r3 recebe 0

d recebe 1
r4 recebe 1
d passa a 0

Tem-se que:
a recebe 1
a passa a 2
r1 recebe 2

62

Grupo Multitecnus ,2013

b) As operaes de adio, subtrao, multiplicao, diviso e mdulo (resto da


diviso) podem ser combinados com o operador atribuio, de tal forma que:

A operao

Equivale a

a += 2;

a = a + 2;

a -= 2;

a = a - 2;

a *= 2;

a = a * 2;

a /= 2;

a = a / 2;

a %= 2;

a = a % 2;

No exemplo dado, ao invs de se utilizar o valor dois, poderia ser utilizada uma
varivel, sendo que o valor final da varivel a passaria a depender do valor dessa
outra varivel. Deve-se, pois, tomar cuidado para no haver diviso do valor de a
por zero, o que ocasionaria um erro em tempo de execuo.
63

Grupo Multitecnus ,2013

2.6.3. Operadores Relacionais


Nome

Operador

Operao

Igual a

==

a==b

Resulta true se a igual a b (por exemplo: 1 == 1)

Diferente de

!=

a !=b

Resulta true se a diferente de b (por exemplo: 1 != 2)

Maior que

>

a > b

Resulta true se o valor de a maior do que o valor de b


(por exemplo: 2 > 1)

>=

a >= b

Resulta true se o valor de a maior ou igual ao valor de


b (por exemplo: 2 > = 1 e 1 > = 1)

<

a < b

Resulta true se o valor de a menor do que o valor de b


(por exemplo: 1 < 2)

<=

a <= b

Resulta true se o valor de a menor ou igual ao valor de


b (por exemplo: 1 < = 2 e 1 < = 1)

Maior ou igual a
Menor que
Menor ou igual a

Explicao

64

Grupo Multitecnus ,2013

2.6.4. Operadores Lgicos


Nome

Operador

Operao

Negao

!a

E (AND)

&&

a == 1 && b = = 5

OU (OR)

||

a == 1 || b = = 5

Explicao
Resulta false se a true, e vice-versa
Resulta true se e somente se a igual a 1 e b igual a 5;
do contrrio, resulta false
Resulta true se a igual a 1 ou b igual a 5; se a for
diferente de 1 e b for diferente de 5, resulta false

2.6.5. Operador de Concatenao


Nome

Operador

Operao

Concatenao

Al + voc!

Explicao
Resulta na string Al voc!

65

Grupo Multitecnus ,2013

2.7. Mtodo
Conforme voc vai tornando o seu programa complexo, voc deve
subdividi-lo em partes menores, cada parte desta executando tarefas especficas,
tornando o cdigo mais simples de manter (fazer correes e melhorias), ou seja,
voc deve utilizar sub-rotinas chamadas mtodos na orientao a objetos .
Mtodos, ento, so trechos de cdigo executados uma ou vrias vezes
dentro do cdigo principal (mtodo main) ou dentro de outros mtodos. Java
disponibiliza, por meio de suas classes predefinidas, mtodos com vrias
finalidades. Alm desses, outros mtodos podem ser criados pelo programador.
Por exemplo, a classe Math possui vrios mtodos para executar rotinas
matemticas, como a raiz quadrada (square root), como mostrado abaixo, onde a
varivel n recebe a raiz quadrada de 16 (que igual a 4.0):
double n = Math.sqrt (16) ;
66

Grupo Multitecnus ,2013

Um mtodo definido por um nome (iniciando por letra minscula), o


tipo de dado retornado e parnteses, os quais podem aceitar valores (parmetros)
ou no. Quando um mtodo no retorna valor algum, o tipo do mtodo definido
como void. No caso de sqrt deve-se informar, na chamada do mtodo, um valor
numrico entre parnteses, o qual ter sua raiz quadrada extrada (valor double),
sendo esse valor informado ao trecho chamador da funo.
A forma como um mtodo invocado (executado) depende do tipo da
classe que o define. Para executar o mtodo sqrt utilizou-se a seguinte sintaxe:
Nome_da_classe . nome_do_mtodo ( parmetro ) ;
Isto necessrio porque o mtodo sqrt no est definido na classe que est sendo
criada, e sim, na classe Math. Essa classe, como dito anteriormente, predefinida,
e faz parte do framework (conjunto de classes predefinidas) de Java.

67

Grupo Multitecnus ,2013

Observe que a varivel n do tipo double porque o valor retornado pelo


mtodo sqrt da classe Math um valor do tipo double.
Outra observao, diz respeito declarao em uma s linha:
double n = Math.sqrt (16) ;
que poderia ser escrita da forma abaixo:
double n ;
n = Math.sqrt (16) ;
O tipo da varivel recebedora do valor retornado pelo mtodo sqrt tem
de ser double. Porm, em determinadas situaes, o tipo do valor a ser atribudo a
uma varivel deve ser alterado (antes da atribuio) e, s ento, ser atribudo. A
isto chamamos de converso de tipo (ou typecast).
Algumas converses de tipo so realizadas de forma implcita. Um
exemplo, quando valores numricos so convertidos para string antes de serem
impressos (ou concatenados a outra string antes da impresso).
68

Grupo Multitecnus ,2013

Outras converses de tipo devem ser realizadas de forma explcita. Este


caso ocorre quando um valor de determinado tipo deve ser atribudo a uma
varivel de outro tipo e a converso implcita no possvel. Por exemplo, o trecho
de cdigo abaixo vlido, e imprime na tela 1.0:
int num = 1 ;
double d ;
d = num ;
System.out.println (d) ;
Esta converso possvel porque, tanto int como double, so tipos numricos, e o
espao de memria utilizado por double maior do que espao de memria
utilizado por int.
69

Grupo Multitecnus ,2013

J o trecho de cdigo abaixo invlido:


int num ;
double d = 1 ;
num = d;
System.out.println (num) ;
e o compilador Java emitir a seguinte mensagem de erro:
Type mismatch: cannot convert from double to int
Isto acontece porque o valor double ocupar mais espao do que a quantidade de
memria alocada para int. Ou seja, de forma figurada pode-se dizer que,
Um caminho suporta um piano, mas um piano no suporta um caminho.
Nesse caso, o tipo double seria o caminho, e o tipo int o piano.
70

Grupo Multitecnus ,2013

Assim, o valor double contido na varivel d deve ser convertido para int antes ser
atribudo varivel num. Isto se faz explicitando o novo tipo, que deve estar
delimitado por parnteses, entre o operador de atribuio e o valor a ser
convertido, como mostrado abaixo:
int num ;
double d = 1 ; // a converso (implcita) para 1.0 realizada
num = (int) d;
System.out.println (num) ;

Ao ser executado, impresso o valor 1 no formato inteiro (sem o ponto e o valor


decimal).
Observao: somente o valor a ser atribudo tem seu tipo alterado. A varivel (d,
no exemplo acima) continua sendo do tipo double, contendo o valor 1.0.
71

Grupo Multitecnus ,2013

2.7.1. Mtodos criados pelo programador


So aqueles que so criados pelo programador para executar tarefas
especficas s necessidades do programa.
Para criar um mtodo, voc deve especificar o tipo de valor que o
mtodo retorna (valor que vai ser atribudo varivel esquerda do operador
atribuio, ou que ter outra utilizao qualquer), o seu nome, dois parnteses e
duas chaves delimitando o cdigo a ser executado (variveis e comandos). O ltimo
comando de uma funo deve ser o comando:

return valor_retorno ;

onde valor_retorno uma varivel ou constante de mesmo tipo (ou compatvel)


que o valor de retorno do mtodo.
72

Grupo Multitecnus ,2013

Por exemplo, segue abaixo um mtodo que retorna 6 elevado 5 potncia:


int eleva ( )
{
int a, b = 6;
a = b * b * b *b *b;
return a ;
}
Na realidade, como este mtodo retorna sempre o mesmo valor (65), ele poderia
criado sem uso de variveis, como mostrado abaixo:
int eleva ( )
{
return 6*6*6*6*6 ;
}
73

Grupo Multitecnus ,2013

Para utiliz-lo, voc deve escrever seu cdigo entre as chaves do cdigo principal. A
chamada ao mtodo feita em outro mtodo (no caso abaixo, o mtodo main):

public class Potenciacao


{
int eleva ( )
{
return 6*6*6*6*6 ;
}
public static void main (String args[ ])
{
int resultado;
resultado = eleva ( );
System.out.println ("6^5 = " + resultado);
}
}
74

Grupo Multitecnus ,2013

Quando voc manda executar o cdigo (Run), ocorre o seguinte erro:


Cannot make a static reference to the non-static method eleva () from the type Potenciacao

Para corrigi-lo, insira a palavra static antes do tipo do mtodo:


public class Potenciacao
{
static int eleva ( )
{
return 6*6*6*6*6 ;
}
public static void main (String args[ ])
{
int resultado;
resultado = eleva ( );
System.out.println ("6^5 = " + resultado);
}
}

75

Grupo Multitecnus ,2013

Voc pode definir variveis dentro do mtodo, mas elas somente sero visveis
dentro do prprio mtodo. Assim sendo, uma varivel definida no mtodo eleva
no visvel dentro do mtodo main. A forma geral de definio de um mtodo
como abaixo:
static <tipo_do_mtodo> <nome_do_mtodo> ( )
{
declarao de variveis locais
comandos ;
return <valor> ;
}

As informaes entre os sinais de menor (<) e maior (>) devem ser fornecidas pelo
programador.
76

Grupo Multitecnus ,2013

No caso do mtodo eleva, j foi dito que ele poderia trabalhar com variveis
internamente, ao invs de valores constantes,
static int eleva ( )
{
int a, b = 6;
a = b * b * b *b *b;
return a ;
}

No caso apresentado, o mtodo definiu duas variveis: a e b. importante lembrar


que essas variveis no podem ser utilizadas no mtodo main. Voc pode at
definir variveis dentro e main que contenham os mesmos nomes das variveis em
outro mtodo, mas, o compilador Java as tratar como se fossem variveis
diferentes.
77

Grupo Multitecnus ,2013

Por exemplo, as variveis resultado do mtodo eleva e do mtodo main ocuparo


posies de memria diferentes, ou seja, para Java elas so variveis distintas:
public class Potenciacao
{
static int eleva ( )
{
int resultado, b = 6;
resultado = b * b * b *b *b;
return resultado ;
}
public static void main (String args[ ])
{
int resultado ;
resultado = eleva ( );
System.out.println ("6^5 = " + resultado);
}
}
78

Grupo Multitecnus ,2013

O mtodo eleva retorna, para o ponto de chamada, o resultado de 6


elevado a 5, no retornando qualquer valor diferente deste. Se voc quiser elevar 6
a uma potncia diferente de 5, ter de passar um argumento para o mtodo
informando qual a nova potncia. Esse argumento ser, ento, atribudo a uma
varivel de parmetro, declarada entre os parnteses que seguem o nome do
mtodo, e que deve ter tipo compatvel com o tipo do valor do argumento sendo
informado no momento da chamada:
static <tipo_do_mtodo> <nome_do_mtodo>

<tipo_do _parmetro> <nome_do parmetro> )

{
}

A este mecanismo chama-se passagem de valores por parmetro.


A varivel de parmetro comporta-se como uma varivel local, e s
visvel dentro do mtodo em que criada, ou seja, no pode ser utilizada em
outro mtodo.
79

Grupo Multitecnus ,2013

Abaixo tem-se o mtodo eleva alterado para receber a potncia enviada


por parmetro, utilizando a varivel inteira pot como varivel de parmetro. J no
ponto de chamada da funo, inserido o valor desejado entre parnteses (como
uma constante ou o contedo de uma varivel):
static int eleva (int pot )
{
int resultado;
return (int) Math.pow (6, pot);
}
public static void main (String args[ ])
{
int resultado ;
resultado = eleva ( 3 );
System.out.println ("6^3 = " + resultado);
}
80

Grupo Multitecnus ,2013

O mtodo pow da classe Math realiza a potenciao entre o primeiro e o


segundo parmetros. Na realidade, o mtodo eleva criado aqui no precisa ser
criado, uma vez que pow realiza a mesma tarefa, basta que voc fornea
argumentos que, no final, produziro o mesmo resultado de eleva. Este mtodo s
foi criado por motivos didticos.
O Eclipse lhe avisa que o mtodo pow retorna um valor double:

81

Grupo Multitecnus ,2013

2.8. Atributo
Uma varivel criada dentro dos limites de um mtodo s enxergada
por aquele mtodo, no sendo enxergada pelos demais mtodos da classe. Isto
significa dizer que o trecho de cdigo abaixo,
static int dobro ()
{
return num * 2;
}

// A varivel num foi declarada em main

public static void main (String args[ ])


{
int num = 5, resultado;
resultado = dobro ();
System.out.println ("5 x 2 = " + resultado);
}
82

Grupo Multitecnus ,2013

ao ser compilado, causa a seguinte mensagem de erro pelo compilador Java:


num cannot be resolved to a variable
O motivo que o mtodo dobro tentou utilizar a varivel num definida no mtodo
main. Porm, para o compilador Java, no h varivel declarada no mtodo dobro
com nome igual a num, ou seja, o mtodo dobro no pode utilizar uma varivel
chamada num. Na realidade, o mtodo no declarou varivel alguma e, por isso,
no pode utilizar variveis em seu cdigo. Um mtodo pode at declarar variveis e
no utiliz-las, mas, ao utilizar uma varivel, ele tem por obrigao declar-la.
Em algumas situaes, entretanto, uma varivel deve ser enxergada por
vrios mtodos. Nesses casos, deve-se declarar uma varivel que pertence classe,
e no a um mtodo em particular. Com isso, todos os mtodos enxergaro a
varivel, conhecida por atributo (ou atributo da classe) na orientao a objetos.
83

Grupo Multitecnus ,2013

Segue, abaixo, a classe Operacao, seu atributo num e seus mtodos dobro e main:
class Operacao
{
static int num = 5;
static int dobro ()
{
return num * 2;
}

// Agora, num um atributo da classe

public static void main (String args[ ])


{
int resultado;
resultado = dobro ();
System.out.println ("5 x 2 = " + resultado);
}
}
84

Grupo Multitecnus ,2013

2.9. Classe e Objeto


Mostrou-se, anteriormente, os diversos tipos de dados que podem ser
associados s variveis para a manipulao de valores (numricos ou no).
Mostrou-se, tambm, como facilitar a clareza do cdigo dividindo-o em
mtodos (sub-rotinas dentro da classe).
Dito isto, defini-se Classe como sendo um tipo Java especial que contm
dados (tambm chamados atributos ou propriedades) e mtodos para operar
sobre esses dados.
Por exemplo, suponha que voc deseja construir um aplicativo que
imprima o permetro das figuras geomtricas quadrado e tringulo.
O primeiro passo criar as classes: Quadrado e Triangulo.
Cada classe possuir seus atributos e um mtodo para calcular o
permetro da figura respectiva.
85

Grupo Multitecnus ,2013

Inicie um novo projeto no Eclipse. Crie uma classe e lhe d o nome


Quadrado. Lembre-se que, pela conveno criada pela Sun para a linguagem Java,
uma classe inicia com letra maiscula.

Deixe a opo para criar a funo main desmarcada. Clique em Finish.


86

Grupo Multitecnus ,2013

Em seguida, complete a classe Quadrado, gerada pelo Eclipse, com o cdigo em


negrito abaixo:

public class Quadrado{


double lado;
double perimetro( )
{
return 4 * lado ;
}
}

Salve as alteraes. A classe Quadrado est pronta para uso.

87

Grupo Multitecnus ,2013

Repita os passos anteriores (File -> New -> Class) para criar a classe
Triangulo, completando-a com o cdigo abaixo:

public class Triangulo{


double lado1, lado2, lado3;
double perimetro( )
{
return lado1 + lado2 + lado3 ;
}
}

88

Grupo Multitecnus ,2013

Para finalizar, crie uma terceira classe, Figuras, a qual ser o nosso
aplicativo (a que conter o mtodo main). Marque a opo para criar o mtodo
main e, em seguida, clique em Finish.

89

Grupo Multitecnus ,2013

Em seguida, complete a classe Figuras com o cdigo abaixo:


public class Figuras{
public static void main(String[] args) {
Quadrado q;
Triangulo t;
double p;
q = new Quadrado( ) ; // Iniciando q
t = new Triangulo( ); // Iniciando t
q.lado = 10;
p = q.perimetro( );
System.out.println ("Permetro do Quadrado: " + p);
t.lado1 = 10;
t.lado2 = 20;
t.lado3 = 30;
p = t.perimetro( );
System.out.println ("Permetro do Tringulo: " + p);
}
}

90

Grupo Multitecnus ,2013

Salve as alteraes e execute o aplicativo. Veja os resultados para os clculos dos


permetros de ambas as figuras (Quadrado e Triangulo):
Permetro do Quadrado: 40.0
Permetro do Tringulo: 60.0

Pelos resultados obtidos, observa-se que cada figura teve seu permetro
corretamente calculado.
Dito isto, pode-se agora definir alguns conceitos:
Classe: um tipo especial que contm atributos (variveis) e mtodos (funes)
para manipular os atributos da classe;
Atributos: so as variveis definidas em uma classe;
Mtodos: so as funes que, retornando ou no valor, servem para, entre outras
coisas, alterar os atributos da classe a qual pertencem ou efetuar
clculos utilizando valores internos e frmulas (como o clculo dos
permetros das figuras).
91

Grupo Multitecnus ,2013

Objeto: uma varivel cujo tipo uma classe. Diz-se, tambm, ser uma varivel de
instncia de uma classe. Uma vez declarado o objeto de uma classe, podese manipular seus atributos, ou invocar seus mtodos, por meio do objeto
daquela classe, bastando, para isso, inici-lo por meio do operador new:
a)

Declare o objeto: Quadrado q;

b)

Inicie o objeto: q = new Quadrado( ) ;

No exemplo dado, o objeto q uma varivel de instncia da classe


Quadrado. Observe que, na iniciao do objeto, aps o operador new
deve-se especificar o mtodo construtor da classe (que tem nome idntico
ao da classe, porm, por se tratar de um mtodo, termina com
parnteses). importante ressaltar que, mesmo que voc no crie um
mtodo construtor, ele existir e ser utilizado na iniciao do objeto.
92

Grupo Multitecnus ,2013

c) Para manipular os atributos da classe, basta digitar o nome do objeto


iniciado, um caractere ponto e o nome do atributo ao qual ser
atribudo algum valor: q.lado = 10;

d) Da mesma forma, invoca-se um mtodo: p = q.perimetro( );

Raciocnio anlogo faz-se para o objeto t da classe Triangulo:


Triangulo t;
t = new Triangulo( );
t.lado1 = 10;
t.lado2 = 20;
t.lado3 = 30;
p = t.perimetro( );
93

Grupo Multitecnus ,2013

2.10. Herana
Uma das maiores vantagens da programao orientada a objetos, a
possibilidade de reaproveitar o cdigo j existente, sem a necessidade de
repetio, e o Java fortemente orientado a objeto.
Por exemplo, suponha que na firma hipottica PJL, os empregados sejam
identificados por suas matrculas e nomes, e possuem um salrio. H, porm, duas
subclasses de empregados: os vendedores e os tcnicos. Os vendedores tem uma
comisso sobre o salrio e os tcnicos tem um ttulo (advogado, engenheiro, etc.).
Isso significa dizer que o vendedor tem, alm de matrcula, nome, e
salrio, uma quarta informao, a porcentagem de comisso, ou seja, podemos
dizer que a classe Vendedor herda os atributos da classe Empregado, e define seu
prprio atributo (comissao). O mesmo pode-se dizer da classe Tecnico, cuja quarta
informao o atributo titulo.
94

Grupo Multitecnus ,2013

Graficamente, pode-se representar o sistema proposto pela UML:


Empregado
matricula : int
nome : String
salario : double

Vendedor
comissao : double

Tecnico
titulo : String

No caso da generalizao, diz-se que Vendedor um tipo de Empregado, ou seja,


todo Vendedor ser um Empregado, mas nem todo Empregado ser Vendedor.
Assim sendo, deve-se criar a classe Empregado e, depois, criar as classes Vendedor
e Tecnico, as quais so extenses da classe Empregado (chamada de superclasse).
95

Grupo Multitecnus ,2013

Inicie um novo projeto no Eclipse. Crie uma classe e lhe d o nome Empregado.
Lembre-se que, pela conveno criada pela Sun para a linguagem Java, uma classe
inicia com letra maiscula. Deixe a opo para criar a funo main desmarcada.
Clique em Finish. Em seguida, complete a classe com o cdigo em negrito abaixo:
public class Empregado{
int matricula;
String nome;
double salario;
}

Salve as alteraes.

96

Grupo Multitecnus ,2013

Crie a classe Vendedor e complete a classe com o cdigo em negrito abaixo:


public class Vendedor extends Empregado{
double comissao;
}

Salve as alteraes.
Crie, agora, a classe Tecnico e complete a classe com o cdigo em negrito abaixo:
public class Tecnico extends Empregado{
String titulo;
}

97

Grupo Multitecnus ,2013

Ao criar a classe Vendedor como abaixo:


public class Vendedor extends Empregado{
explicamos ao compilador que a classe herdar todos os atributos e mtodos que a
classe Empregado tiver, alm daquilo que a prpria classe Vendedor definir. Apesar
de no haver digitao algumas na classe Vendedor que explicite os atributos
matricula, nome e salario (sem o uso de acentos pois se trata de variveis), so
vlidas as linhas de comando mostradas abaixo:
Vendedor v;
v = new Vendedor();
v.matricula = 1234;
v.nome = Jos Luiz;
v.comissao = 20;

// 20% de comisso
98

Grupo Multitecnus ,2013

S falta o aplicativo, em cuja classe os objetos instanciaro as classes


Empregado, Vendedor e Tecnico, que o termo correto para dizer que um
determinado objeto objeto de uma dada classe.
Para tal, crie a classe que Firma, cujo cdigo-fonte definido como
abaixo:
public class Firma {
public static void main(String args[]) {
Empregado e;
Vendedor v;
Tecnico t;
e = new Empregado();
v = new Vendedor();
t = new Tecnico();
99

Grupo Multitecnus ,2013

e.nome = "Antnio";
e.matricula = 1234 ;
e.salario = 200.00;
v.nome = "Joo";
v.matricula = 1235 ;
v.salario = 200.00;
v.comissao = 20;

// 20% de comisso

t.nome = "Jos";
t.matricula = 1236 ;
t.salario = 2000.00 ;
t.titulo = "Doutor";

100

Grupo Multitecnus ,2013

System.out.println ( "Matrcula: "+ e.matricula + "Nome = " +


e.nome + "Salrio: R$" + e.salario);
System.out.println ( "Matrcula: "+ v.matricula + "Nome = " +
v.nome + "Salrio: R$" + v.salario +
"(no includa a comisso de: " + v.comissao + "%)" );
System.out.println ( "Matrcula: "+ t.matricula + "Nome = " +
t.titulo + " " + t.nome + "Salrio: R$" + t.salario);
}
}

101

Grupo Multitecnus ,2013

2.10.1. Herana e Converso de Tipos


Um objeto de uma subclasse (especfica) pode ser instanciado por meio
da superclasse (genrica), bem como pode haver converso de tipo, implcita ou
explcita, no momento da instanciao. Isto importante em algumas situaes,
como, por exemplo, na passagem de parmetros a mtodos que podem receber
objetos da superclasse, bem como objetos da classe derivada. Por exemplo, dadas
a superclasse ClasseA e sua respectiva subclasse, ClasseB:

public class ClasseA


{

public class ClasseB extends ClasseA


{

int a = 1;
}

int b = 2;
}

102

Grupo Multitecnus ,2013

So vlidas as instrues que seguem ao comentrios:

1) Criao de um objeto por meio de seu mtodo construtor:


ClasseA obj1 = new ClasseA();
System.out.println("obj1.a = " + obj1.a);
ClasseB obj2 = new ClasseB();
System.out.println("obj2.a = " + obj2.a);
System.out.println("obj2.a = " + obj2.b);

2) Criao de um objeto da superclasse por meio de um objeto da subclasse:


obj2.a = 12;
ClasseA obj3 = obj2;
System.out.println("obj3.a = " + obj3.a);
103

Grupo Multitecnus ,2013

3) Criao do objeto da superclasse por meio da chamada ao mtodo construtor da


subclasse.
ClasseA obj4 = new ClasseB();
System.out.println("obj4.a = " + obj4.a);
4) Criao do objeto da superclasse por meio da chamada ao mtodo construtor da
subclasse.
ClasseB obj5 = (ClasseB) obj4;
System.out.println("obj5.a = " + obj5.a);
System.out.println("obj5.a = " + obj5.b);

104

Grupo Multitecnus ,2013

ATENO
Uma superclasse (genrica) no pode ser convertida para uma subclasse
(especfica), ou seja, o objeto de uma subclasse no pode ser instanciado por meio
de uma chamada ao mtodo construtor da superclasse, mesmo com converso
explcita de tipo. Sendo assim, o seguinte trecho seria invlido:

ClasseB obj2 = (ClasseB) new ClasseA();


System.out.println("obj2.a = " + obj2.a);
System.out.println("obj2.a = " + obj2.b);

105

Grupo Multitecnus ,2013

2.11. Polimorfismo
No s atributos podem ser herdados; mtodos tambm o podem. No
caso da firma PJL, o vendedor deve ter x% de comisso.
Suponha que seja necessria a construo de mtodo que calcule o
salrio lquido de todos os empregados, descontando-se 15% de imposto. Por
exemplo, considerando-se os salrios:

Empregado = 200,00
Vendedor = 200,00 // Salrio-base
Obs.: Supondo uma comisso de 20% , o salrio de Vendedor vai a: 240,00,
resultado de: 200,00 + 20% = 200,00 + 40,00 = 240,00
Tcnico = 2.000,00

106

Grupo Multitecnus ,2013

tem-se, para o salrio lquido de cada um:


Empregado = 170,00

// 200,00 - 15% = 200,00 - 30,00 = 170,00

Vendedor = 204,00

// 200,00 + 20% = 200,00 + 40,00 = 240,00


// 240,00 - 15% = 240,00 - 36,00 = 204,00

Tcnico = 1700,00

// 2.000,00 - 15% = 2.000,00 - 300,00 = 1700,00

O mtodo para clculo do salrio para a classe Empregado (e que ser herdado
pela classe Tecnico) pode ser igual a:
public double sal_liq()
{
return 0.85 * salario;
}
Obs.: Retirar x% de um valor, o mesmo que multiplic-lo por [1.0 - (x100)], pois:
a) 15% de 100 = 100 15% de 100 = 100 (100 x 0.15) = 100 15 = 85
b) 15% de 100 = 100 x 0.85 = 85
107

Grupo Multitecnus ,2013

A classe Vendedor, porm, dever implementar seu prprio mtodo, uma vez que
o clculo difere daquele utilizado pelo mtodo da superclasse:
public double sal_liq()
{
double sal;
sal = salario * (1+comissao/100); // aumento da (comisso)
sal = 0.85 * sal;
// desconto de 15%
return sal;
}

108

Grupo Multitecnus ,2013

Graficamente, tem-se:
Empregado
matricula : int
nome : String
salario : double
sal_liq() : double

Vendedor
comissao : double

Tecnico
titulo : String

sal_liq() : double

Sendo assim, preciso alterar os cdigos das classes Empregado e Vendedor, alm
do aplicativo (classe Firma), para que os salrios lquidos sejam visualizados.

109

Grupo Multitecnus ,2013

Alterando a classe Empregado:


public class Empregado
{
int matricula;
String nome;
double salario;
public double sal_liq ()
{
return 0.85 * salario;
}
}
Salve as modificaes.

110

Grupo Multitecnus ,2013

Alterando a classe Vendedor:


public class Vendedor extends Empregado
{
double comissao;
public double sal_liq ()
{
double sal;
sal = salario * (1 + comissao / 100);
sal = 0.85 * sal;
return sal;
}
}
Salve as modificaes.

111

Grupo Multitecnus ,2013

Altere o trecho da classe Firma onde so gerados os relatrios, substituindo o


atributo salario pela chamada ao mtodo sal_liq():

System.out.println ( "Matrcula: "+ e.matricula + "Nome = " + e.nome +


"Salrio: R$" + e.sal_liq () );
System.out.println ( "Matrcula: "+ v.matricula + "Nome = " + v.nome +
"Salrio: R$ + v.sal_liq () +
"(j includa a comisso de: " + v.comissao + "%)" );
System.out.println ( "Matrcula: "+ t.matricula + "Nome = " + t.titulo +
t.nome + "Salrio: R$" + t.sal_liq () );

Salve as modificaes e execute o cdigo.


112

Grupo Multitecnus ,2013

Observe que as classes Empregado, Tecnico e Vendedor utilizam o


mtodo sal_liq para clculo do salrio lquido, porm a classe Vendedor utiliza um
mtodo diferente daquele definido na classe ancestral Empregado.
Chama-se Polimorfismo, a capacidade de mtodos de mesmo nome
efetuarem tarefas diferentes, em funo da classe que os utiliza (invocados por
meio do objeto).
Neste caso, o mtodo sal_liq efetua clculo diferente quando utilizado
pelo objeto da classe Vendedor, daquele efetuado quando o objeto em questo
instancia, ou a classe Empregado, ou a classe Tecnico.

113

Grupo Multitecnus ,2013

Obs.: Um outro tipo de polimorfismo, chamado de polimorfismo de sobrecarga,


acontece quando a classe possui mtodos com o mesmo nome, porm, com
parmetros de tipos diferentes e/ou quantidade de parmetros diferentes.
Por exemplo, seja a classe Sobrecarga:
class Sobrecarga
{
int opera (int n) { return n * n; }
int opera (int x, int y) { return x * y; }
}
Uma varivel de instncia dessa classe que invoque o mtodo opera com um
parmetro, estar invocando o primeiro mtodo, e retornar o quadrado do
valor passado como parmetro. De outro lado, se o mtodo for invocado
com a passagem de dois parmetros, retornar a multiplicao entre eles.
114

Grupo Multitecnus ,2013

2.11.1. @Override
A anotao @Override utilizada quando o mtodo da subclasse deve
sobrescrever o mtodo da superclasse utilizando a mesma assinatura, ou seja,
mesmo tipo de retorno, mesmo nome e os mesmos parmetros (quantidade,
nomes e tipos). Os blocos de comando que os mtodos definem podem ser
diferentes, mas as assinaturas devem ser as mesmas.

Obs.: Anotaes sero estudadas de forma mais aprofundada em 2.28. Anotaes.

115

Grupo Multitecnus ,2013

2.12. Pacote
Um pacote serve para agrupar um conjunto de classes em funo de suas
responsabilidades, permitindo a viso do todo em subsistemas, tornando mais fcil
seu entendimento.
em Java, uma boa prtica de programao criar um pacote, unidade de
software que conter uma ou mais classes. Um pacote tambm pode conter outros
pacotes.
Uma vez criado, voc poder utilizar as classes (mtodos e atributos) que
fizerem parte daquele pacote, bastando que voc o importe.
Por exemplo, o aplicativo abaixo exibe informaes de data e hora do
sistema:

116

Grupo Multitecnus ,2013

public class Hora {


public static void main (String args [ ])
{
Calendar cal = new GregorianCalendar();
System.out.println ("Ano:

System.out.println ("Ms:

System.out.println ("Semana do ano:


System.out.println ("Semana do ms:
System.out.println ("Dia do ms:

System.out.println ("Dia do ano:

System.out.println ("Dia da semana: "


System.out.println ("Hora (24h):
"
System.out.println ("Hora:

System.out.println ("Minuto:

System.out.println ("Segundo:
"
System.out.println ("AM_PM:
"

+ cal.get (Calendar.YEAR));
+ cal.get (Calendar.MONTH) + " (janeiro = 0)");
+ cal.get (Calendar.WEEK_OF_YEAR));
+ cal.get (Calendar.WEEK_OF_MONTH));
+ cal.get (Calendar.DAY_OF_MONTH));
+ cal.get (Calendar.DAY_OF_YEAR));
+ cal.get (Calendar.DAY_OF_WEEK) + " (domingo= 1)");
+ cal.get (Calendar.HOUR_OF_DAY));
+ cal.get (Calendar.HOUR));
+ cal.get (Calendar.MINUTE));
+ cal.get (Calendar.SECOND));
+ cal.get (Calendar.AM_PM) + " (manh = 0)");

}
}
117

Grupo Multitecnus ,2013

Ao execut-lo, o compilador gera o seguinte erro:


Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Calendar cannot be resolved to a type
GregorianCalendar cannot be resolved to a type
Calendar cannot be resolved to a variable

Resolve-se o problema informando ao compilador onde encontrar as classes


Calendar e GregorianCalendar, inserindo, no incio do cdigo, comandos import,
com os quais se pede para importar o pacote especificado, ou seja, as classes
requeridas (para que se possa utilizar os mtodos e atributos das classes definidas
no pacote):
import java.util.Calendar;
import java.util.GregorianCalendar;

Dessa forma, o cdigo, ento, fica como a seguir:


118

Grupo Multitecnus ,2013

import java.util.Calendar;
import java.util.GregorianCalendar;
public class Hora {
public static void main (String args [ ])
{
Calendar cal = new GregorianCalendar();
System.out.println ("Ano:
System.out.println ("Ms:
System.out.println ("Semana do ano:
System.out.println ("Semana do ms:
System.out.println ("Dia do ms:
System.out.println ("Dia do ano:
System.out.println ("Dia da semana:
System.out.println ("Hora (24h):
System.out.println ("Hora:
System.out.println ("Minuto:
System.out.println ("Segundo:
System.out.println ("AM_PM:

"
"

"
"

+ cal.get (Calendar.YEAR));
+ cal.get (Calendar.MONTH) + " (janeiro = 0)");
+ cal.get (Calendar.WEEK_OF_YEAR));
+ cal.get (Calendar.WEEK_OF_MONTH));
+ cal.get (Calendar.DAY_OF_MONTH));
+ cal.get (Calendar.DAY_OF_YEAR));
+ cal.get (Calendar.DAY_OF_WEEK) + " (domingo= 1)");
+ cal.get (Calendar.HOUR_OF_DAY));
+ cal.get (Calendar.HOUR));
+ cal.get (Calendar.MINUTE));
+ cal.get (Calendar.SECOND));
+ cal.get (Calendar.AM_PM) + " (manh = 0)");

}
}
119

Grupo Multitecnus ,2013

Ao execut-lo, so geradas as seguintes informaes:


Ano:
Ms:
Semana do ano:
Semana do ms:
Dia do ms:
Dia do ano:
Dia da semana:
Hora (24h):
Hora:
Minuto:
Segundo:
AM_PM:

2011
6 (janeiro = 0)
31
5
26
207
3 (domingo = 1)
19
7
1
47
1 (manh = 0)

A data e a hora so proveem do sistema no momento da execuo (aqui, esta parte


do trabalho estava sendo realizado s 19h01min47s, do dia 5 de julho de 2011.
120

Grupo Multitecnus ,2013

As linhas de comando:
import java.util.Calendar;
import java.util.GregorianCalendar;

poderiam ser substitudas pela linha de comando:

import java.util.*;

Nesse caso, pede-se para o compilador importar todas as classes presentes em


java.util (o * um caractere curinga que significa tudo) .

121

Grupo Multitecnus ,2013

Um pacote criado no Workspace ativo faz com que os arquivos .java do


projeto dono do pacote sejam armazenados em subpastas.
Por exemplo, seja o diretrio:
C:\Users\usuario\workspace
Seja, tambm, o projeto: prj_pacote. Se voc cria um pacote de nome:
br.com.pacote, ento, os arquivos .java criados nesse projeto (correspondendo s
classes do projeto) sero armazenados em:

C:\Users\usuario\workspace\prj_pacote\src\br\com\pacote

122

Grupo Multitecnus ,2013

2.12.1. Criando e Utilizando um Pacote


No Eclipse, crie um projeto e lhe d o nome prj_Operacao. Clique com o
boto direito do mouse sobre o projeto, em New e, em seguida, em Package. Dlhe o nome exemplo_pacote. Observe que na tela de criao do pacote, aparece o
diretrio em que sero salvos os cdigos-fonte do seu projeto. Crie, agora, a classe
Operacao, com o cdigo seguinte:

123

Grupo Multitecnus ,2013

package exemplo_pacote;
public class Operacao
{
private int num;
public int getNum()
{
return num;
}
public void setNum(int num)
{
this.num = num;
}
public int dobro()
{
return getNum() * 2;
}
}
124

Grupo Multitecnus ,2013

No incio do cdigo, a linha de comando


package exemplo_pacote;
informa o nome do pacote criado para o projeto. Salve-o.

Crie, agora, outro projeto e lhe d o nome prj_usa_operacao. Certifiquese que o projeto prj_Operacao est aberto (caso no esteja, d um clique duplo
sobre o nome do projeto). Clique com o boto direito do mouse sobre o nome do
projeto e depois em Build Path; em seguida, clique em Configure Build Path... . Na
tela que surge (janela Properties for prj_usa_operacao), na aba Projects, clique no
boto Add... como mostrado abaixo:

125

Grupo Multitecnus ,2013

Boto Add...
126

Grupo Multitecnus ,2013

Em seguida, selecione o projeto

prj_operacao

(ela contm a classe a ser utilizada


no aplicativo que ser construdo) e,
depois, em OK.

127

Grupo Multitecnus ,2013

Crie, finalmente, a classe Usa_Operacao:


import exemplo_pacote.Operacao;
public class Usa_Operacao {
public static void main(String[] args) {
Operacao operacao = new Operacao();
}
}
Observe a linha de comando: " import exemplo_pacote.Operacao; " no incio do
cdigo. Comente a linha de comando e veja a mensagem de erro mostrada pelo
Eclipse, informando que a classe Usa_Operacao no conhece a classe Operacao
(definida no pacote exemplo_pacote).
A importao poderia ser definida, tambm, como:
import exemplo_pacote.*;
128

Grupo Multitecnus ,2013

2.13. Modificadores
Na construo dos aplicativos, observa-se que o Eclipse insere a palavra
public antes de classes e mtodos, alm da palavra static antes do mtodo main.
As palavras public e static so denominadas modificadores, cujas
caractersticas so listadas a seguir.
2.13.1 Modificadores de Classe
- PUBLIC: Classes public podem ser instanciadas por qualquer objeto livremente.
Para declarar uma classe como public, inclua a palavra reservada public
na definio da classe.
public class Nome_da_Classe

129

Grupo Multitecnus ,2013

- ABSTRACT: So classes que no permitem que um objeto as instancie, ou seja,


serve para definir superclasses genricas.
Para declarar uma classe como abstract, inclua a palavra reservada
abstract na definio da classe.
public abstract class Nome_da_Classe
- FINAL: So classes que no permitem que voc crie subclasses (herana).
Para declarar uma classe como final, inclua a palavra reservada final na
definio da classe.
public final class Nome_da_Classe

130

Grupo Multitecnus ,2013

2.13.2 Modificadores de Mtodo


- PUBLIC: Faz com que o mtodo possa ser utilizado livremente.
public double sal_liq ()
- PROTECTED: Faz com que o mtodo somente possa ser invocado na classe em
que definido, nas respectivas subclasses, e nas classes dentro do
mesmo pacote. No visualizvel em classes de outros pacotes.
protected double sal_liq ()
- FINAL: Faz com que o mtodo no possa ser sobrescrito (override) nas subclasses.
final double sal_liq ()
- PRIVATE: Faz com que o mtodo somente possa ser invocado na classe em que
definido.
private double sal_liq ()
131

Grupo Multitecnus ,2013

- STATIC: Um mtodo com visibilidade static pode ser invocado sem a utilizao de
um objeto, como o caso do mtodo main na criao de um aplicativo.
public static void main (String args[])
Por exemplo, a partir da declarao:
public class Operacao {
public static String msg()
{
return "Mensagem";
}
Outra classe pode invocar o mtodo msg() por meio do nome da classe
Operacao (no preciso instanci-la):
public class Testa_static {
public static void main(String[] args) {
System.out.println ( Operacao.msg() );
132

Grupo Multitecnus ,2013

2.13.2 Modificadores de Atributo


- PUBLIC: Faz com que o atributo possa ser utilizado livremente pela varivel de
instncia da classe (objeto).
public double salario;
- PROTECTED: Faz com que o atributo somente possa ser manipulado na classe em
que definido e nas respectivas subclasses. No visualizvel em
classes de outros pacotes.
protected double salario;
- FINAL: Faz com que o atributo seja uma constante, ou seja, recebe um valor na
iniciao, o qual no pode ser alterado. uma boa prtica escrever o
nome do atributo constante em caixa alta.
final double SALARIO = 100.0;
133

Grupo Multitecnus ,2013

- PRIVATE: Faz com que o atributo somente possa ser manipulado na classe em que
definido.
private double salario;
- STATIC: Um atributo static pode ser manipulado sem a utilizao de um objeto.
Por exemplo, a partir da declarao:
public class Operacao {
public static int num;
Outra classe do mesmo pacote (ou mesmo uma subclasse) pode alterar o
valor de num por meio do nome da classe Operacao (no preciso
instanci-la):
public class Testa_static {
public static void main(String[] args) {
Operacao.num = 2;
134

Grupo Multitecnus ,2013

2.14. Palavras-chave this e super


Uma boa prtica de programao orientada a objetos, encapsular os
dados, isto , torn-los private e s permitir sua manipulao por meio dos
mtodos da classe.
Uma classe conhece todos os seus mtodos e atributos. J outras
classes somente possuem acesso aos mtodos e atributos com visibilidade PUBLIC.
Se uma classe necessita manipular um atributo privado de outra classe, deve fazlo por meio de um mtodo pblico da outra classe. Com isso, comum uma classe
declarar seus atributos privados, declarando, em consequncia, mtodos pblicos
denominados setters e getters para, respectivamente, atribuir e retornar o valor de
atributos.

135

Grupo Multitecnus ,2013

Por exemplo, seja a classe Numero que define o atributo num, o mtodo getNum
(para retornar o valor que num possa conter no momento da chamada ao mtodo)
e o mtodo setNum, cuja funo atribuir o valor passado por parmetro ao
atributo. O cdigo como segue:
public class Numero
{
private int num;
public int getNum()
{
return num;
}
public void setNum(int num)
{
this.num = num;
}
}
136

Grupo Multitecnus ,2013

No cdigo acima, observa-se que getNum retorna o valor do atributo num, ou seja,
informa o valor de num no momento da chamada ao mtodo.
public int getNum()
{
return num;
}
J o mtodo setNum deve atribuir o valor do parmetro ao atributo num
da classe. Porm, observe que a varivel de parmetro tem o mesmo nome do
atributo da classe: num. Diferencia-se a varivel do atributo pelo uso da palavrachave this. Dessa forma, o atributo num pode ser manipulado utilizando-se a
forma: this.num, sendo obrigatrio o uso de this quando o atributo for manipulado
em um mtodo que possua uma varivel de mesmo nome (do contrrio, o
compilador Java no saber que se deseja manipular o atributo, ao invs da
varivel).
137

Grupo Multitecnus ,2013

Segue cdigo do mtodo:


public void setNum(int num)
{
this.num = num;
}
O uso de this referencia o atributo, ao invs da varivel do mtodo.
Observe, tambm, que o mtodo declarado como sendo do tipo void,
tipo utilizado quando o mtodo no retorna valor algum para o ponto de chamada.
Por exemplo, no caso do mtodo setNum, sua nica funo atribuir ao atributo
da classe o valor contido no parmetro. Uma vez realizada a atribuio, o mtodo
no tem mais o que fazer, devendo ser encerrado neste exato momento.
No se utiliza return em um mtodo que seja do tipo void.

138

Grupo Multitecnus ,2013

Toda classe Java tem definida, de maneira implcita, alm da palavrachave this a palavra-chave super.
Como foi visto, a palavra this referencia a classe atual (na qual
utilizada). J a palavra super referencia atributos e mtodos da classe ancestral
(superclasse).
Como exemplo, sero construdas duas classes, uma delas por herana,
onde o mtodo imprime servir para identificar qual classe tem o mtodo
executado.
public class Super_classe
{
String mensagem ( )
{
return Mensagem da Super classe;
}
}
139

Grupo Multitecnus ,2013

public class Subclasse extends Super_classe


{
String mensagem ( )
{
return Mensagem da Subclasse;
}
void imprime ( )
{
System.out.println ("Mtodo imprime da subclasse: " +
super.mensagem() + " - " + this. mensagem() );
}
}

140

Grupo Multitecnus ,2013

2.15. Interface
Em uma linguagem como C++, pode-se utilizar o mecanismo da herana
mltipla, onde duas ou mais classes geram outra por herana. O exemplo clssico
a ser citado, o da classe CarroAnfibio, formado, por herana das classes Carro e
Barco:
class CarroAnfibio : public Carro, public Barco

Isto no possvel em Java, haja vista que este mecanismo fonte de


srios problemas (por exemplo: se duas superclasses que possuam mtodos de
mesma assinatura, porm, com diferentes codificaes, geram uma subclasse por
herana, na chamada ao mtodo por meio do objeto da subclasse, qual cdigo
deve ser executado?).

141

Grupo Multitecnus ,2013

Apesar disso, h em Java um mecanismo chamado Interface, que parece


muito com uma classe, porm, contendo apenas constantes (constante ou varivel
constante, a varivel que recebe o modificador de tipo final, alm de um valor
compatvel com seu tipo, no podendo haver alterao desse valor durante o ciclo
de vida das classes nas quais a constante seja visvel e prottipos de mtodos. A
implementao dos prottipos se faz na classe que implementa a interface e,
exceo das classes abstratas, toda classe que implemente uma dada interface,
deve implementar todas as declaraes de mtodo contidas nela.
A implementao dos prottipos se faz na classe que implementa a
interface e, exceo das classes abstratas, toda classe que implemente uma dada
interface, deve implementar todas as declaraes de mtodo contidas nela.

142

Grupo Multitecnus ,2013

Para declarar uma interface simples, utilize a sintaxe:


public interface NomeInterface {
final tipo CONSTANTE;
public valorRetorno1 nomeMtodo1 (tipo parmetro, ...);
public valorRetorno2 nomeMtodo2 (tipo parmetro, ...);
}
Para declarar uma interface que herde outras interfaces, utilize a sintaxe:
public interface NomeInterface extends Interface1, Interface2, ..., InterfaceN {
final tipo CONSTANTE;
public valorRetorno1 nomeMtodo1 (tipo parmetro, ...);
public valorRetorno2 nomeMtodo2 (tipo parmetro, ...);
}
E, para utilizar a interface, voc a implementa numa dada classe:
public class NomeClasse implements NomeInterface1 , NomeInterface2 , ...
143

Grupo Multitecnus ,2013

2.16. Fluxos de Controle


O conjunto de sentenas que perfazem controle de fluxo de programao
em Java, aproximadamente o mesmo que o existente na maioria das linguagens,
utilizando basicamente estruturas condicionais e de repetio, iguais s usadas em
C/C++. Podem ser, basicamente:
a) Execuo condicional
a.1) if
a.2) switch
b) Repetio
b.1) for
b.2) while
b.3) do/ while
144

Grupo Multitecnus ,2013

2.16.1. Execuo Condicional: if


Sintaxe:
if (<condio>)
{
comando11;
comando12;
comando1N;
}
Isto significa que: se (if) a condio (<condio>) verdadeira (true) ento o bloco
de comandos (comando1, comando2, ..., comandoN) entre a chave aberta ({), aps
a linha do if, e a chave fechada ({) executado.
Observe que os caracteres ponto e vrgula so utilizados para encerrar os
comandos, no sendo utilizado aps o parntese fechado da condio do if (para
no encerr-lo, pois isso s se d aps a execuo do ltimo comando do bloco).
145

Grupo Multitecnus ,2013

Pode-se utilizar, tambm, uma clusula else, para execuo de comandos nos
casos em que a condio aps o if for falsa (false). Sintaxe:
if (<condio>)
{
comando11;
comando1N;
}
else
{
comando21;
comando2N;
}

Isto significa que: se a condio verdadeira ento o bloco de comandos 1, entre a


chave aberta ({) aps o if e a chave fechada antes do else, executado; seno
(else), se a condio falsa (false), o bloco de comandos 2 entre o abre chave aps
o else e o fecha chave correspondente (aps o ltimo comando) executado.
146

Grupo Multitecnus ,2013

Obs1: O uso da clusula else opcional. Caso no seja utilizada e a condio


resulte num valor lgico false, nenhum comando executado.

Obs2: Quando voc tiver que executar condicionalmente apenas um comando, o


uso de chaves para delimitar o comando opcional.

Obs3: Comandos if sucessivos podem ser aninhados, ou seja, o bloco de


comandos que seguem o if pode conter outro comando if, e assim
sucessivamente. Isto se faz necessrio, quando precisamos, aps uma
primeira filtragem, executar processamentos diferentes. Por exemplo, aps
selecionar todos os funcionrios da seo de vendas, somente recebero
aumento de 10% no salrio os que ganham menos de 500,00. Caso
contrrio, ganharo 7,5%.
147

Grupo Multitecnus ,2013

Para exemplificar , vamos resolver a equao do 2 grau, tomando como


medida preventiva o fato de delta no ser negativo (como no existe raiz quadrada
de nmero negativo no conjunto dos reais, extrair raiz quadrada de nmero
negativo resulta em erro). A forma geral da equao do 2 grau ax2 + bx + c = 0.
Calcula-se delta como: = b2 4ac. As razes so calculadas por: x = -b .
2a
Os passos para resolver o problema so:
- Obter os valores de a, b, c.
- Calcular o valor de delta (
)
- Se o valor de delta negativo (<0)
- exibir mensagem de erro
- Seno (se o valor de delta maior ou igual a zero):
- calcular as razes
- exibir os valores das razes

148

Grupo Multitecnus ,2013

E o algoritmo:
Incio
real a, b, c, delta, x1, x2
ler a , b, c
delta b * b 4 * a * c
se (delta < 0)
{
escrever No h razes reais
}
seno
{

x1 ( -b + raiz_quadrada (delta) ) / (2 * a)
x2 ( -b - raiz_quadrada (delta) ) / (2 * a)
escrever x1 = , x1 , x2 = , x2
}
Fim.
149

Grupo Multitecnus ,2013

Obs.: O comando ler do algoritmo ser efetuado pelo mtodo showInputDialog da


classe JOptionPane:
String valor = JOptionPane.showInputDialog("Digite o valor de a");
que produz a janela de entrada de dados abaixo:

Obs.: Para utilizar JOptionPane.showInputDialog importe javax.swing.*.


Obs.: Preste bastante ateno no uso dos parnteses, alterando a precedncia dos
operadores, no clculo das razes x1 e x2. O uso incorreto, ou mesmo o no
uso, dos parnteses, leva resultados incorretos das razes.
150

Grupo Multitecnus ,2013

Obs.: O valor lido por showInputDialog tem o tipo String. Caso voc necessite ler
um valor do tipo numrico, voc precisa converter o valor de String para
numrico, utilizando, ou o mtodo parseInt da classe Integer:
String snum;
int
num;
snum= JOptionPane.showInputDialog(Nmero");
num = Integer.parseInt(snum);

ou o mtodo parseDouble da classe Double:


String snum;
double num;
snum= JOptionPane.showInputDialog(Nmero");
num = Double.parseDouble(snum);

151

Grupo Multitecnus ,2013

Obs.: A leitura tambm pode ser realizada dentro dos parnteses do mtodo de
converso. Por exemplo:
double num = Double.parseDouble( JOptionPane.showInputDialog(Digite o valor de a ") );

Observe no cdigo Java para o problema proposto, apresentado em seguida,


que no foram utilizadas as chaves aps o comando if, porque somente um
comando ser executado, tornando opcional o uso das chaves. J o else precisa
delimitar o bloco com chaves, pois h a execuo de mais de um comando. Crie um
aplicativo no Eclipse, digite o cdigo que segue. Experimente fornecer os valores:

a=1

b = 10 ;

c=5

152

Grupo Multitecnus ,2013

import javax.swing.*;
public class Eq2Grau {
public static void main(String[] args) {
double a = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor de a"));
double b = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor de b"));
double c = Double.parseDouble(JOptionPane.showInputDialog("Digite o valor de c"));
double delta = b*b - 4*a*c;
if (delta < 0)
System.out.println ("No existem razes reias!");
else
{
double x1 = (-b + Math.sqrt(delta))/(2*a);
double x2 = (-b - Math.sqrt(delta))/(2*a);
System.out.println ("Com println: x1= " + x1 + " - x2= " + x2);
System.out.printf ("Com printf : x1= %1.3f - x2= %10.2f \n", x1, x2);
}
}
}
153

Grupo Multitecnus ,2013

Quando voc executa o cdigo, os seguintes resultados so obtidos:


Com println: x1 = -0.5278640450004204 - x2 = -9.47213595499958
Com printf : x1 = -0,528 - x2 =

-9,47

O mtodo printf tem a seguinte sintaxe:


System.out.printf (contedo , vairvel1, varivel2, ..., varivelN);
O parmetro contedo uma string que contm a mensagem a ser impressa, e,
opcionalmente, especificadores de formato. A cada especificador de formato
utilizado corresponder uma varivel de tipo compatvel:
%d valores inteiros
%f valores reais
154

Grupo Multitecnus ,2013

Os especificadores de formato tambm podem definir quantidade


mnima de caracteres e preciso (valores reais). Assim, caso o valor no contenha
dgitos suficientes para alcanar o tamanho mnimo, a sada preenchida,
esquerda, com espaos em branco. O sinal de negao unrio e o ponto decimal
(valores reais) so levados em considerao. No cdigo anterior, observe que o
mtodo println imprime os valores de x1 e x2 sem nenhuma formatao:
x1 = -0.5278640450004204 - x2 = -9.47213595499958
enquanto que o mtodo printf
System.out.printf ("Com printf : x1= %1.3f - x2= %10.2f \n", x1, x2);
formata a sada para mostrar x1 com, pelo menos, um dgito, e trs casas decimais,
e x2 com, pelo menos, dez dgitos, e duas casas decimais:
x1 = -0,528 - x2 =

-9,47

Como x2 possui cinco dgitos, a sada preenchida com cinco espaos em branco
antes do sinal menos (unrio).
155

Grupo Multitecnus ,2013

Pode-se formatar valores de uma varivel pelo uso do mtodo format da


classe String. Por exemplo, o trecho de cdigo abaixo:
String sn;
double num = 1;
sn = String.format("%1.1f %3.7f",num, num);
System.out.println ("Formatado: " + sn);
quando executado, produz a seguinte sada:
Formatado: 1,0

1,0000000

156

Grupo Multitecnus ,2013

2.16.2. Execuo Condicional: switch


Sintaxe:
switch (<varivel>)
{
case <valor1> :
bloco de comandos 1;
break;
case <valor2> :
bloco de comandos 2;
break;

}
Este comando executa o primeiro bloco de comandos aps do case que contiver
valor igual ao da varivel avaliada dentro dos parnteses do switch. A execuo s
para quando encontrada a clusula break, ou quando o comando switch termina.
157

Grupo Multitecnus ,2013

O cdigo seguinte imprime um nmero por extenso:


import javax.swing.*;
public class Extenso {
public static void main(String[] args) {
int num = Integer.parseInt( JOptionPane.showInputDialog("Nmero") );
String snum = " nmero fora do intervalo!" ;
switch (num)
{
case 1:

snum= "Um";
break;

case 2:

snum= "Dois";
break;

case 3:

snum= "Trs";
break;

}
JOptionPane.showMessageDialog(null,"Nmero por extenso: " + snum);
}
}

158

Grupo Multitecnus ,2013

Obs.: A varivel snum foi iniciada com " valor fornecido fora do intervalo!, pois, caso
seja fornecido um nmero fora do intervalo considerado (1, 2 ou 3), ser
impressa a mensagem de erro:
Nmero por extenso: valor fornecido fora do intervalo!
Resolve-se isto, tambm, pela utilizao da clusula default (opcional) do
comando switch, cujo bloco executado nos casos em que nenhum valor
anterior atenda avaliao efetuada.
String snum;
switch (num) {
case 1: snum= "Um";
break;
case 2:

snum= "Dois";
break;

case 3:

snum= "Trs";
break;

default:

snum = " valor fornecido fora do intervalo!"

}
159

Grupo Multitecnus ,2013

Obs.: Uma vez iniciada a execuo de comandos de um bloco, a execuo no para


enquanto switch no encontrar uma clusula break,o que pode ser til em
alguns casos, como o do exemplo abaixo, que imprime a pronncia de uma letra:
import javax.swing.*;
public class Pronuncia_Letra {
public static void main(String[] args) {
String p , str = JOptionPane.showInputDialog("Letra");
char letra = str.charAt(0);
switch (letra)
{
case 'a':
case 'A': p = "a";
break;
160

Grupo Multitecnus ,2013

case 'b':
case 'B': p = "b";
break;
case 'w':
case 'W': p = "dabli";
break;
default: p = "Letra fora do intervalo!";
}
JOptionPane.showMessageDialog(null, "Pronncia da letra " + letra + ":\n" + p);
}
}

Obs.: Observe que, se for digitada a letra em caixa baixa, o comando switch iniciar a
execuo do bloco vazio (no contm comando algum); porm, como no h
clusula break, a execuo continua com os comandos do bloco aps a letra em
caixa alta at encontrar a clusula break.
161

Grupo Multitecnus ,2013

Obs.: O mtodo showMessageDialog tem a mesma funo do comando escrever do


algoritmo. Fornea null como primeiro parmetro, e a mensagem a exibir como
segundo parmetro.
Obs.: O mtodo charAt da classe String foi utilizado, porque uma varivel de tipo
complexo como String no consegue ser avaliada pelo comando switch. Somente
variveis de tipo inteiro (int, short, byte) ou variveis do tipo char conseguem ser
avaliadas pelo switch.
Porm, o valor retornado por JOptionPane.showInputDialog do tipo String e
no se pode converter um valor de String para char forando a converso como
se faz de float para int.
Sendo assim, preciso utilizar o mtodo charAt (<posio>), que retorna o
caractere da string na posio especificada (no exemplo dado, requerido o
caractere na primeira posio posio zero).
162

Grupo Multitecnus ,2013

2.16.3. Repetio: for


Sintaxe:
for ( <iniciao> ; <condio> ; <atualizao> )
{
comando1;
comando2;
.
.
.
comandoN;
}
Isto significa que: para (for) uma dada <iniciao> (de uma ou mais
variveis separadas por vrgula), deve-se executar o bloco, enquanto a condio
<condio> for verdadeira, o que se pode mudar atravs da <atualizao>. Um
bloco de comandos em repetio diz-se estar em loop. Uma condio inicialmente
falsa faz com que o bloco no seja executado.
163

Grupo Multitecnus ,2013

Por exemplo, o cdigo abaixo imprime os nmeros de 0 a 10:


public class Repeticao_com_For {
public static void main(String[] args) {
int i, n = 0;
for (i = 0; i <= 10 ; i++)
{
System.out.println (n);
n++;
}
System.out.println (Loop finalizado!);
}
}

O valor da varivel i inicia com 0 e, de um em um (i++) vai imprimindo os


valores da varivel n, cujo valor inicia com 0, e vai sendo incrementada (n++) . O loop
(repetio) continua at o valor de i, aps o incremento, ultrapassa o valor 10,
fazendo com que a avaliao i <= 10 resulte falso, parando, assim, o loop. O cdigo,
ento, continua sendo executado aps a chave fechada do comando for.
164

Grupo Multitecnus ,2013

Obs.: A varivel de controle da repetio tambm pode ser utilizada, o que


dispensaria, no exemplo dado, o uso da varivel n, pois ambas tm, sempre, o
mesmo valor. Assim, o cdigo poderia ser como abaixo:

public class Repeticao_com_For {


public static void main(String[] args) {
int i;
for (i = 0; i <= 10 ; i++)
{
System.out.println (i);
}
System.out.println (Loop finalizado!);
}
}
165

Grupo Multitecnus ,2013

Obs.: O passo de atualizao pode ser positivo ou negativo, unitrio ou diferente de


um. No caso de passos diferentes do unitrio, pode-se combinar o operador
adequado com o operador atribuio. Por exemplo, para imprimir todos os
nmero mpares de 1 at 100:
public class Repeticao_com_For {
public static void main(String[] args) {
int i;
for (i = 1; i < 100 ; i+=2)
{
System.out.println (i);
}
System.out.println (Loop finalizado!);
}
}
166

Grupo Multitecnus ,2013

Obs.: comum iniciar a varivel do for com o valor zero; em consequncia, a


condio de parada deve ir at o nmero anterior em relao quantidade de
repeties desejadas. Por exemplo, para imprimir a frase repetio com for
10 vezes, pode-se fazer como mostrado abaixo, onde a varivel i inicia com 0 e
vai at 9 (o loop finalizado quando a varivel i alcana o valor 10):
public class Repeticao_com_For {
public static void main(String[] args) {
int i;
for (i = 0; i < 10 ; i++)
{
System.out.println (repetio com for);
}
System.out.println (Loop finalizado!);
}
}
167

Grupo Multitecnus ,2013

Obs.: Uma condio inicialmente falsa faz com que o comando for seja finalizado sem
executar o bloco de comandos. Por exemplo, o cdigo abaixo deveria escrever
todos os valores entre 100 e 1, mas a condio foi escrita como i < 0, o que faz
com o loop finalize sem executar comando algum do bloco:
public class Repeticao_com_For {
public static void main(String[] args) {
int i;
for (i = 100 ; i < 0 ; i--)
{
System.out.println (i);
}
System.out.println (Loop finalizado!);
}
}
Neste caso, a condio deveria ser igual a: i > 0 .
168

Grupo Multitecnus ,2013

Obs.: Um exemplo com for que inicia duas variveis dentro dos parnteses (bem
como, atualiza tambm ambas as varivel):
public class Repeticao_com_For {
public static void main(String[] args) {
int i;
float n;
for (i = 0, n=0; i < 10 ; i++ , n+=0.25)
{
System.out.println (n);
}
System.out.println ("Loop finalizado!");
}
}
Este cdigo imprime os dez primeiros valores, iniciando em 0, variando de 0,25
em 0,25. Observe o uso da vrgula em i = 0, n=0 e i++ , n+=0.25.
169

Grupo Multitecnus ,2013

2.16.4. Repetio: while


Sintaxe:
while(<condio>)
{
comando1;
comando2;
.
.
.
comandoN;
}

Isto significa que: enquanto (while) a <condio> for verdadeira devese executar os comandos do bloco.

170

Grupo Multitecnus ,2013

Por exemplo, o cdigo abaixo imprime os nmeros de 1 a 5:


public class Repeticao_com_While {
public static void main(String[] args) {
int i = 1;
while (i < 6)
{
System.out.println (i);
i++;
}
System.out.println ("Loop finalizado!");
}
}
Observe que a varivel contadora, i, nem iniciada automaticamente, e nem sofre
incremento automtico, como acontece com o comando for. Dessa forma, deve-se
cuidar para que a varivel seja iniciada e incrementada com os valores adequados.
171

Grupo Multitecnus ,2013

O incremento da varivel tambm pode ocorrer durante o teste da condio


(dentro dos parnteses):
public class Repeticao_com_While {
public static void main(String[] args) {
int i = 1;
while (i++ < 6)
{
System.out.println (i);
}
System.out.println ("Loop finalizado!");
}
}

Este exemplo produz um relatrio incorreto, pois imprime os valores de 2 at 6.


172

Grupo Multitecnus ,2013

O que ocorre no trecho:


int i = 1;
while (i++ < 6)
{
System.out.println (i);
}
o seguinte:
a) i 1
b) i < 6 ?
b.1) i i + 1
b.2) sim: escreve o valor de i
b.3) retorna ao passo b
c) fim da rotina
Observe que a varivel incrementada com uma condio verdadeira ou falsa, ou
seja, o primeiro valor a ser impresso o nmero 2. Alm disso, a repetio s para
quando o valor de i igual a 6, ou seja, aps ter impresso este valor (na tela).
173

Grupo Multitecnus ,2013

Para entender melhor o que ocorre, verifique os passos no computador chins:


i1

// i recebe 1

i<6?

// 1 < 6 ?

ii+1

// i recebe 2

sim , i menor que 6: imprime 2

i<6?
ii+1

// 2 < 6 ?
// i recebe 3

sim , i menor que 6: imprime 3

i<6?
ii+1

// 3 < 6 ?
// i recebe 4

sim , i menor que 6: imprime 4

i<6?
ii+1

// 4 < 6 ?
// i recebe 5

sim , i menor que 6: imprime 5

i<6?
ii+1

// 5 < 6 ?
// i recebe 6

sim , i menor que 6: imprime 6

i<6?
ii+1

// 6 < 6 ?
// i recebe 7

no , i igual a 6: fim da repetio


174

Grupo Multitecnus ,2013

O cdigo correto seria, ento:


public class Repeticao_com_While {
public static void main(String[] args) {
int i = 0;
while (i++ < 5)
{
System.out.println (i);
}
System.out.println ("Loop finalizado!");
}
}

Este exemplo produz um relatrio correto, pois imprime os valores de 1 at 5, o


que pode ser verificado pelo computador chins que segue.
175

Grupo Multitecnus ,2013

Computador chins para o exerccio imprimir os valores de 1 a 5:


i0

// i recebe 0

i<5?

// 0 < 5 ?

ii+1

// i recebe 1

sim , i menor que 5: imprime 1

i<5?
ii+1

// 1 < 5 ?
// i recebe 2

sim , i menor que 5: imprime 2

i<5?
ii+1

// 2 < 5 ?
// i recebe 3

sim , i menor que 5: imprime 3

i<5?
ii+1

// 3 < 5 ?
// i recebe 4

sim , i menor que 5: imprime 4

i<5?
ii+1

// 4 < 5 ?
// i recebe 5

sim , i menor que 5: imprime 5

i<5?
ii+1

// 5 < 5 ?
// i recebe 6

no , i igual a 5: fim da repetio


176

Grupo Multitecnus ,2013

Neste exerccio, pode-se utilizar, com mais vantagens, o operador pr-incremento


(ao invs do operador de ps-incremento):
public class Repeticao_com_While {
public static void main(String[] args) {
int i = 0;
while (++i < 6)
{
System.out.println (i);
}
System.out.println ("Loop finalizado!");
}
}
Este exemplo tambm produz um relatrio correto, pois imprime os valores de 1
at 5, Porm, verifique que o valor dentro da condio foi alterado para 6.
177

Grupo Multitecnus ,2013

Computador chins para o exerccio imprimir os valores de 1 a 5:


i0

// i recebe 0

ii+1

// i recebe 1

i<6?

// 1 < 6 ?

sim , i menor que 6: imprime 1


ii+1
i<6?

// i recebe 2
// 2 < 6 ?

sim , i menor que 6: imprime 2


ii+1
i<6?

// i recebe 3
// 3 < 6 ?

sim , i menor que 6: imprime 3

ii+1
i<6?

// i recebe 4
// 4 < 6 ?

sim , i menor que 6: imprime 4


ii+1

// i recebe 5

i<6?

// 5 < 6 ?

sim , i menor que 6: imprime 5

ii+1
i<6?

// i recebe 6
// 6 < 6 ?

no , i igual a 6: fim da repetio

178

Grupo Multitecnus ,2013

Por exemplo, o cdigo abaixo l uma frase enquanto no for digitada a palavra fim
(frase no igual a fim):
import javax.swing.*;
public class Repeticao_while {
public static void main(String[] args) {
String frase = "";
while (!frase.equals("fim"))
{
frase = JOptionPane.showInputDialog("Digite uma frase");
}
System.out.println ("Loop finalizado!");
}
}

Este exemplo demonstra como comparar o valor de uma varivel String com outro
valor (tambm String) por meio do mtodo equals (da classe String). Observe o
operador de negao ! posicionado antes do mtodo equals.
179

Grupo Multitecnus ,2013

2.16.5. Repetio: do/while


Sintaxe:
do
{
comando1;
comando2;
.
.
.
comandoN;
} while (<condio>) ;
Isto significa: executar (do) os comandos do bloco enquanto (while) a
<condio> for verdadeira. Assim, os comandos so executados pelo menos uma
vez, mesmo que a condio seja, inicialmente, falsa.
180

Grupo Multitecnus ,2013

Por exemplo, o cdigo abaixo l uma frase enquanto no for digitada a palavra fim:
import javax.swing.*;
public class Repeticao_while {
public static void main(String[] args) {
String frase;
do
{
frase = JOptionPane.showInputDialog("Digite uma frase");
} while (!frase.equals("fim"));
System.out.println ("Loop finalizado!");
}
}
181

Grupo Multitecnus ,2013

2.17. Array
Variveis so criadas em um cdigo para permitir a manipulao de
valores. Porm, em determinados momentos, a quantidade de valores a manipular
to grande, que inviabiliza a criao e gerncia desses valores (por meio de suas
variveis).
Resolve-se esse problema criando variveis do tipo array (que podem
atuar como matrizes), as quais contm sequncias de valores de mesmo tipo.
So variveis indexadas, homogneas (todos os valores armazenados
devem ser do mesmo tipo de dados), e que podem ter seus valores alterados por
meio de ndices.

182

Grupo Multitecnus ,2013

2.17.1. Declarando uma varivel do tipo array


Para declarar uma varivel array, voc especifica o tipo dos dados a
armazenar, o nome da varivel array, seguido de colchetes (um par abre-fecha para
cada dimenso da matriz). Por exemplo, para declarar um vetor de inteiros, faa
como abaixo:
int vet [ ] ;
Obs.: O par de colchetes tambm pode vir aps o tipo:
int [ ] vet ;
Para criar um array bidimensional de tipo float:
float matriz [ ] [ ] ;
float [ ] matriz [ ] ;
float [ ] [ ] matriz ;
sendo que qualquer uma das trs formas aceita.
183

Grupo Multitecnus ,2013

2.17.2. Criando um array


Para criar um array, utilize a palavra-chave "new", seguido do tipo do
array e, entre colchetes, a quantidade de elementos a armazenar (cujo primeiro
elemento estar posicionado no ndice zero). Por exemplo, se voc deseja
armazenar 5 valores inteiros e list-los em seguida, execute o cdigo abaixo:
import javax.swing.*;
public class Array {
public static void main(String[] args) {
int vet[] = new int[5];
int i;
for (i=0; i< 5; i++)
{
vet[i] = Integer.parseInt(JOptionPane.showInputDialog("Nmero:"));
}
for (i=0; i< 5; i++)
System.out.println (vet[i]);
}
}

184

Grupo Multitecnus ,2013

Para manipular uma matriz 3x3 de inteiros:


import javax.swing.*;
public class Matriz_3x3 {
public static void main(String[] args) {
int mat[] = new int[3][3];
int i, j;
for (i=0; i< 3; i++)
for (j=0; j< 3; j++)
{
mat[i][j] = Integer.parseInt(JOptionPane.showInputDialog("Nmero:"));
}
for (i=0; i< 3; i++)
for (j=0; j< 3; j++)
{
System.out.println (mat[ + i + ] [ + j + ] = + mat[i][j] ) ;
}
}
}
185

Grupo Multitecnus ,2013

Obs.: A estrutura de comandos for aninhados:


for ( i = 0; i < 3; i++ )
for ( j = 0; j < 3; j++ )
{
bloco de comandos;
}
Faz com que, a cada valor de i, o valor de j seja variado de 0 at 2, o que
permite a execuo do bloco de comandos por 9 vezes. O computador chins
para essa estrutura :
i0
j0
j1
j2

i1
j0
j1
j2

i2
j0
j1
j2

Obs.: O primeiro for executa somente um comando, que o segundo for, o qual
executa o bloco. Por isso que somente o segundo for utiliza chaves.
186

Grupo Multitecnus ,2013

2.17.3. Iniciando um array


Voc pode iniciar arrays antes do uso, no momento da criao. Para tal,
especifique, entre chaves, os valores iniciais do array:
int a [ ] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0} ;
Isto faz com que seja criado um array de 10 elementos inteiros, contendo, cada
posio (da posio 0 posio 9), os elementos acima (separados por vrgula).
Para arrays de mais de uma dimenso, voc pode iniciar cada dimenso
com um par de chaves (compreendendo um array multidimensional como sendo um
array de arrays). Por exemplo,
int mat [ ] [ ] = { {1, 2, 3} , {4, 5, 6} , {7, 8, 9} } ;
cria um array 3 x 3, iniciando-o com os nmeros acima.

187

Grupo Multitecnus ,2013

O array criado tem a seguinte representao grfica:

Coluna 0

Coluna 1

Coluna 2

Linha 0

mat[0][0]

mat[0][1]

mat[0][2]

Linha 1

mat[1][0]

mat[1][1]

mat[1][2]

Linha 2

mat[2][0]

mat[2][1]

mat[2][2]

mat =

ou, utilizando os ndices da matriz:

188

Grupo Multitecnus ,2013

Por exemplo, a classe seguinte imprime o ms, o dia da semana e o turno, por extenso,
utilizando arrays:
import java.util.*;
public class Hora
{
public static void main (String args [ ])
{
Calendar cal = new GregorianCalendar();
String [ ] mes = { "Janeiro" , "Fevereiro" , "Maro" , "Abril" , "Maio" , "Junho" ,
"Julho" , "Agosto" , "Setembro" , "Outubro" , "Novembro" , "Dezembro"} ;
String [ ] semana = { "Domingo" , "Segunda-feira" , "Tera-feira" , "Quarta-feira",
"Quinta-feira" , "Sexta-feira" , "Sbado} ;
String [ ] am_pm = { "AM","PM"} ;
System.out.println ("Ms:
System.out.println ("Dia da semana:
System.out.println ("AM_PM:

+ mes [cal.get(Calendar.MONTH)]);
+ semana [cal.get (Calendar.DAY_OF_WEEK)-1]);
+ am_pm [cal.get (Calendar.AM_PM)]);

}
}
189

Grupo Multitecnus ,2013

Obs.: A chamada a cal.get:


System.out.println ("Dia da semana:

+ semana [ cal.get (Calendar.DAY_OF_WEEK) -1 ] );

tem o valor de retorno diminudo de uma unidade, porque, por exemplo, o mtodo
retorna 1 quando se trata de domingo; porm, no array semana, domingo est
localizado na posio 0 do array:
String [ ] semana = { "Domingo" , "Segunda-feira" , "Tera-feira" , "Quarta-feira",
"Quinta-feira" , "Sexta-feira" , "Sbado} ;

Obs.: Pode-se declarar variveis definindo o tipo seguido de seus nomes, como em,
int a, b, c;
Da mesma forma, pode-se declarar arrays:
String [ ]

mes = { "Jan" , "Fev" , "Mar" , "Abr" , "Mai" , "Jun , "Jul" , "Ago" , "Set" , "Out" , Nov" , "Dez" }
semana = { "Domingo" , "Segunda" , "Tera" , "Quarta", "Quinta" , "Sexta" , "Sbado " }
am_pm = { "AM","PM" }

;
190

Grupo Multitecnus ,2013

2.18. Tratamento de Exceo


Um aplicativo construdo para manipular uma entrada numrica, pode
ter de manipular uma entrada no numrica, como uma letra, o que certamente
causar um erro em tempo de execuo.
Para evitar maiores dissabores, pode-se manipular as excees que
ocorram por meio da classe Exception, e do bloco try / catch :
try
{
// linhas de comando
}
catch ( Exception erro )
{
// Comandos para tratamento da exceo
}

191

Grupo Multitecnus ,2013

Este bloco tenta (try) executar um ou mais comandos. Em caso de erro, uma
exceo levantada, a execuo do bloco interrompida e o fluxo de execuo
do programa passa imediatamente a ser executado aps a captura (catch) da
exceo. Por exemplo, crie o aplicativo abaixo para somar dois valores inteiros. Na
execuo, fornea um nmero qualquer e, em seguida, a letra w:
import javax.swing.*;
public class Trata_Excecao {
public static void main(String[] args) {
int a, b, resultado;
a = Integer.parseInt(JOptionPane.showInputDialog("Digite um nmero"));
b = Integer.parseInt(JOptionPane.showInputDialog("Digite outro nmero));
resultado = a + b;
System.out.println (Resultado: + resultado);
}
}
192

Grupo Multitecnus ,2013

Quando a letra fornecida, ocorre uma exceo, com a gerao de uma mensagem
de erro parecida com esta:
Exception in thread "main" java.lang.NumberFormatException: For input string: w"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Trata_Excecao.main(Trata_Excecao.java:8)

A mensagem informa que ocorreu uma exceo (exception) de formato


de nmero (NumberFormatException) devido entrada do caractere w ao invs de
uma entrada numrica, e aponta a linha 8 como sendo a linha onde a exceo
ocorreu ( Trata_Excecao.java:8 ).
Para solucionar este problema, deve-se inserir o bloco try/catch nos
locais onde podem ocorrer excees.
193

Grupo Multitecnus ,2013

import javax.swing.*;
public class Trata_Excecao {
public static void main(String[] args) {
int a, b, resultado;
try {
a = Integer.parseInt(JOptionPane.showInputDialog("Digite um nmero"));
b = Integer.parseInt(JOptionPane.showInputDialog("Digite outro nmero));
resultado = a + b;
System.out.println (Resultado: + resultado);
}
catch ( Exception erro) {
System.out.println (Entrada invlida!);
}
}
}
194

Grupo Multitecnus ,2013

Assim, caso uma das entradas seja invlidas, a mensagem Entrada invlida! emitida.
Pode-se, tambm, exibir a mensagem de erro da classe Exception, instanciada
durante a captura da exceo gerada. Para tal, deve-se alterar o cdigo anterior:
catch ( Exception erro) {
System.out.println (Mensagem de erro: + erro.getMessage() );
}

No caso da digitao da letra w, a mensagem de sada ser a seguinte:

Mensagem de erro: For input string: "w

195

Grupo Multitecnus ,2013

2.18.1. Manipulando Excees Especficas


A Classe Exception (subclasse de Throwable) lhe permite manipular qualquer
tipo de erro recupervel pelo interpretador Java. Porm, h momentos em que se
necessria a manipulao especfica de uma dada exceo.
A classe Exception deriva as seguintes classes de tratamento de excees:

a) AWTException
Quando ocorre uma exceo nas operaes grficas.

b) ClassNotFoundException
Quando uma classe instanciada mas o interpretador Java no consegue
encontr-la.
196

Grupo Multitecnus ,2013

c) CloneNotSupportedException
Clones so cpias exatas de objetos. Por exemplo:
String nome1 = Exemplo de clone;
String nome 2 = nome1.toString ( );
faz com que nome2 clone o objeto nome1 , isto , so objetos diferentes com o mesmo
contedo.
Assim sendo, uma exceo CloneNotSupportedException ocorre, quando a classe que a
utiliza no implementa a interface Cloneable.
public class <nome> implements Cloneable

d) IllegalAccessException
Quando o mtodo invocado no pblico ou est em um pacote no visvel
pela classe, ocorre uma exceo de acesso ilegal.
197

Grupo Multitecnus ,2013

e) InstantiationException
Quando uma classe no pode ser instanciada por uma classe abstrata ou ser
uma interface (interfaces devem ser implementadas).

f) InterruptedException
Quando uma thread interrompe outra thread que j estava interrompida.

g) NoSuchMethodException
Quando um mtodo no encontrado pelo interpretador Java.

h) IOException
Quando ocorre um erro de I/O (do ingls: Input/Output, que significa:
Entrada/Sada).
198

Grupo Multitecnus ,2013

i) RuntimeException
Quando ocorre um erro em tempo de execuo.

j) SQLException
Prov informaes sobre erros ocorridos em acessos a uma base de dados.

Obs.: De vrias dessas derivam outras, fornecendo manipulaes ainda mais especficas.
Por exemplo, de RuntimeException derivam ArithmeticException (nos erros em
operaes aritmticas, como, por exemplo, diviso por zero no permitido para
operaes computacionais), ou ArrayIndexOutOfBoundsException (quando um
array acessado com um ndice ilegal).

199

Grupo Multitecnus ,2013

2.18.2. Clusula Finally


Ao ocorrer uma exceo, por vezes necessria a execuo de diversas
tarefas antes de o cdigo encerrar por completo. Por exemplo, uma conexo com
um banco de dados deve ser sempre fechada, mesmo que uma operao cause
uma exceo (como uma diviso por zero).
Para executar cdigo havendo, ou no, uma exceo, utiliza-se a clusula
Finally, que pode vir aps uma ou mais clusulas catch:
try {
comandos;
}
finally {
comandos a serem executados ao final
}
200

Grupo Multitecnus ,2013

A clusula Finally pode vir aps uma ou mais clusulas catch:


try {
comandos;
}
catch (...) {
}
catch (...) {
}
finally {
comandos a serem executados ao final
}

201

Grupo Multitecnus ,2013

2.18.3. Clusulas Throw e Throws


A clusula Throw permite o lanamento de excees diretamente de um
mtodo. Isto pode ser til quando no se deve ter a captura da exceo, colocando
disposio do programador informaes que facilitaro a depurao do cdigo
para eliminao de erros de programao (por exemplo, erros relacionados a
passagem incorreta de parmetros). J a clusula Throws declara, na assinatura do
mtodo, quais excees sero lanadas. Throw pode ser utilizado em conjunto com
try/catch.
A sintaxe envolve a declarao de uma ou mais classes de exceo
(separadas por vrgula) por meio de Throws:
tipo nome_do_mtodo (lista de parmetros) throws Exceo
e o lanamento da exceo por meio de Throw:
throw new Exceo (parmetro);
202

Grupo Multitecnus ,2013

Para exemplificar, construa o cdigo abaixo:


public static void main(String[] args) throws ArithmeticException ,
NumberFormatException {
try
{
int a = Integer.parseInt (JOptionPane.showInputDialog("Digite o valor de a"));
int b = Integer.parseInt (JOptionPane.showInputDialog("Digite o valor de b"));
if (b == 0)
throw new ArithmeticException("Erro de diviso por zero!");
int result = a/b;
System.out.println ("Resultado= " + result);
}
catch (NumberFormatException nfe)
{
System.out.println ("Erro: fornecido um valor no inteiro!");
}
}
203

Grupo Multitecnus ,2013

Pode-se, ento, testar o aplicativo de trs formas:


a) Fornecer os valores 20 e 10 para os campos num1 e num2
=> Neste caso impresso o valor 2 ao final.
b) Fornecer os valores 20 e 0 (zero) para os campos num1 e num2
=> Neste caso, so impressas vrias mensagens, dentre elas, uma com o nmero
da linha do cdigo onde ocorreu o problema.
Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: Erro de diviso por zero!

c) Fornecer os valores 20 e 1O (nmero 1, seguido da letra O maiscula) ou 20 e


10.0 (valor em ponto flutuante) para os campos num1 e num2 (ou
=> Neste caso, impressa apenas a mensagem:
Erro: fornecido um valor no inteiro!
204

Grupo Multitecnus ,2013

Obs.: Se a exceo for lanada novamente no corpo de uma clusula catch , o


controle da execuo enviado classe chamadora que, na ausncia de
tratamento correspondente, transmite o controle da execuo JVM, que
emite mensagens de erro e encerra o aplicativo. Por exemplo, segue o cdigo
anterior alterado:
catch (NumberFormatException nfe)
{
System.out.println ("Erro: fornecido um valor no inteiro!");
throw new NumberFormatException();
}
Obs.2: Pode-se, tambm, criar uma classe (por herana de uma classe de exceo)
para manipulaes de forma personalizada. Deve-se declarar os mtodos
construtores da classe criada, de tal forma que se possa instanci-la com ou
sem envio de parmetro.
205

Grupo Multitecnus ,2013

Por exemplo, segue a classe ExcecaoAritmetica, subclasse de ArithmeticException:

class ExcecaoAritmetica extends ArithmeticException {


ExcecaoAritmetica () {
super ();
}
ExcecaoAritmetica (String msg ) {
super (msg);
}
}
Use-a como abaixo:
throw new ExcecaoAritmetica();
ou
throw new ExcecaoAritmetica("Erro de diviso por zero!");

206

Grupo Multitecnus ,2013

2.19. Interface Grfica GUI (Graphical User Iinterface)


Interfaces grficas permitem uma interao mais amigvel na execuo de
aplicativos por meio de janelas, se comparadas com programas feitos para rodar em
console (MS-DOS, por exemplo). Em boa parte, o teclado substitudo pelo mouse, o
que facilita determinadas tarefas, sendo um quesito de usabilidade bastante apreciado
pelo usurio comum, pois torna o uso do aplicativo bastante intuitivo.
Componentes GUI (pronncia: gui), tambm chamados de widgets (de
windows gadget), que em traduo livre significa: acessrios do windows, so objetos
que podem ser manipulados via teclado, mouse, ou qualquer outra tecnologia que
permita essa interao (comandos de voz, por exemplo). Esses widgets podem ser:
botes, listas, cursores, menus, etc. Em exerccios anteriores, foram utilizados os
widgets MessageDialog e InputDialog da classe JOptionPane.

207

Grupo Multitecnus ,2013

2.19.1. AWT (Abstract Window Toolkit) e Swing


AWT e Swing so dois conjuntos de componentes GUI que permitem a
criao de aplicativos grficos. Componentes AWT, quando exibidos, possuem a viso
caracterstica do sistema operacional em que so executados. Assim, a exibio e o
comportamento de um componente (por exemplo, um boto) de um aplicativo
executado no ambiente Windows poder diferir quando essa execuo se der no
ambiente Unix.
Componentes Swing so projetados para agir de maneira flexvel, permitindo
que se especifique se o comportamento e exibio sero os caractersticos para a
plataforma em uso (Windows, Linux, Unix), ou se agiro de forma independente de
plataforma.

208

Grupo Multitecnus ,2013

2.19.2. Swing
Swing permite o desenvolvimento de interfaces grficas com Java. E isto
facilitado com a instalao do framework Window Builder.
2.19.2.1. Instalao do Window Builder
Clique em Help -> Eclipse Marketplace :

209

Grupo Multitecnus ,2013

No campo Find, digite window builder e pressione Enter:

Se preferir, digite swing neste campo e pressione Enter.


210

Grupo Multitecnus ,2013

Na janela do Marketplace, procure a ocorrncia WindowBuilder Pro GUI Designer,

Clique em Learn more.


211

Grupo Multitecnus ,2013

Em seguida, clique na seta que um link para o site de atualizao (Update Site):

212

Grupo Multitecnus ,2013

Copie a URL (http://dl.google.com/eclipse/inst/d2wbpro/latest/3.6):

Na parte inferior desta janela, voc pode conferir que o plugin gratuito
(Commercial Free).

213

Grupo Multitecnus ,2013

Clique em Help Install New Software...

214

Grupo Multitecnus ,2013

Cole a URL no campo Work with:

Clique em Select All; em seguida, cllique em Next > .


215

Grupo Multitecnus ,2013

Clique em Next > :

216

Grupo Multitecnus ,2013

Clique em I accept the terms of the license agreement, e, depois, em Finish para
instalar os plugins.

217

Grupo Multitecnus ,2013

Eclipse, ento, instala os plugins desejados:

Aparece uma janela de advertncia de segurana (Security Warning). Clique em OK

218

Grupo Multitecnus ,2013

Clique em Restart Now para que o Eclipse finalize as instalaes solicitadas:

219

Grupo Multitecnus ,2013

2.19.2.2. JApplet

Applets Java rodam em uma pgina Web com capacidade semelhante de


qualquer programa tradicional. Componentes Swing utilizam o caractere J no
incio do nome, evitando confuso com elementos da biblioteca AWT (sendo assim,
o elemento Button de AWT, se chamar JButton em Swing). O uso do caractere
J deve-se, muito provavelmente, ao nome original: Swing JFC - Java Foundation
Classes.
Como so programas Java sendo executados no cliente, por meio da JVM
l instalada, o uso de applets envolve questes de segurana. Dentre as restries
impostas aos applets, de que estes aplicativos devem ser executados dentro de
um modelo denominado Sandbox (ou caixa de areia), o que os impede de realizar
uma gama de tarefas, como, por exemplo, acessar os dados do computador que os
executa.
220

Grupo Multitecnus ,2013

2.19.2.3. Iniciando um Projeto Grfico

a) No Eclipse, abra a Perspectiva Java;


b) Inicie um novo projeto (Java Project); d-lhe o nome de prj.applet;
c) Crie o JApplet (por meio da tecla de atalho Create new visual classes:

221

Grupo Multitecnus ,2013

d) Nomeie a classe sendo criada como MeuApplet (esse nome de


responsabilidade do programador, ou seja, no precisa ser necessariamente
MeuApplet);

e) Clique em Finish para criar o applet.


222

Grupo Multitecnus ,2013

O Eclipse, ento, mostra a janela de codificao da classe MeuApplet criada. Esta


classe uma extenso de JApplet, a qual extende a classe Applet e adiciona suporte
ao uso de elementos Swing.

223

Grupo Multitecnus ,2013

Segue, abaixo, o cdigo exibido na janela Source do Eclipse:


import javax.swing.JApplet;
public class MeuApplet extends JApplet {
/**
* Create the applet.
*/
public JApplet1() {
}
}

224

Grupo Multitecnus ,2013

Clique na aba Design para visualizar os componentes GUI:

225

Grupo Multitecnus ,2013

O ambiente passa a ser ento como abaixo:

Agora, pode-se clicar num componente e depois no continer para


adicionar elementos interface grfica.
226

Grupo Multitecnus ,2013

Adicione um componente Jlabel:

Altere a propriedade text para Login (d um clique na caixa de edio da


propriedade text e digite a palavra Login).
227

Grupo Multitecnus ,2013

Adicione, agora, um componente JTextField:

Salve e execute.
228

Grupo Multitecnus ,2013

A janela que se apresenta a seguinte:

Nela pode-se ver o label e o campo de texto. Observe que as dimenses do campo
de texto so muito grandes, em razo do layout utilizado (BorderLayout).
229

Grupo Multitecnus ,2013

Clique na aba Source para ver o cdigo gerado:


import javax.swing.JApplet;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import javax.swing.JTextField;
public class MeuApplet extends JApplet {
private JTextField textField;
/**
* Create the applet.
*/
public MeuAppplet() {
JLabel lblNewLabel = new JLabel("Login");
getContentPane().add(lblNewLabel, BorderLayout.WEST);
textField = new JTextField();
textField.setText("");
getContentPane().add(textField, BorderLayout.CENTER);
textField.setColumns(10);
}
}
230

Grupo Multitecnus ,2013

Nele voc pode ver a criao dos objetos Jlabel e JTextField:


JLabel lblNewLabel = new JLabel("Login");
textField = new JTextField();
E a adio dos componentes ao continer ativo (mtodo add), definindo-se o local
de posicionamento de cada um deles ( esquerda WEST ou ao centro CENTER):

getContentPane().add ( lblNewLabel , BorderLayout.WEST );


getContentPane().add ( textField , BorderLayout.CENTER );

Todo componente de uma interface grfica (janela) deve ser adicionado a


um continer para poder ser exibido. A classe Container estende a classe
Component. Assim, um objeto da classe Container um componente que pode
conter outros componentes.
231

Grupo Multitecnus ,2013

Componentes adicionados a contineres so colocados em uma lista, que


define a ordem em que esses elementos so percorridos (por exemplo, com o uso
da tecla TAB). Caso um ndice no seja especificado, o componente posicionado
como ltimo elemento da lista.
Na pgina:
http://download.oracle.com/javase/1.5.0/docs/api/java/awt/Container.html

So listados vrios mtodos muito teis.

232

Grupo Multitecnus ,2013

2.19.3. Fixao de Problemas


Voc deve ter observado que, na criao dos JApplets, ou mesmo quando
voc altera o gerenciador de layout, surgem mensagens de advertncia que o
avisam sobre inconsistncias no cdigo, seja pela incluso de imports que o cdigo
no necessita (The import XXX is never used), seja pela no declarao de um
nmero de verso, denominado serialVersionUID (The serializable class YYYY does
not declare a static final serialVersionUID field of type long), obrigatria para toda
classe que implemente a interface Serializable.
Para fixar (solucionar) esses problemas, clique com o boto direito do
mouse sobre o problema (mostrado na aba Problems) e, em seguida, em Quick Fix.

233

Grupo Multitecnus ,2013

2.19.3.1. Fixao do Problema: imports nunca utilizados


Clique sobre uma das mensagens import is never used e, em seguida,
sobre Quick Fix:

234

Grupo Multitecnus ,2013

Surge a janela ao lado, com a opo


Remove unused import j selecionada por
padro. Clique em Finish para proceder
correo, ou em Select All (para selecionar os
problemas que deseja ver corrigidos pelo
Eclipse) e Finish.

235

Grupo Multitecnus ,2013

Obs.: Se todas as mensagens


import is never used forem
selecionadas antes de Quick Fix,
como mostrado ao lado:

o Eclipse exibir a janela Quick Fix com


todos os problemas j selecionados.

236

Grupo Multitecnus ,2013

2.19.3.2. Fixao do Problema: no declarao de serialVersionUID


Clique sobre a mensagem The serializable class YYYY does not declare a
static final serialVersionUID field of type long e, em seguida, sobre Quick Fix:

237

Grupo Multitecnus ,2013

Surge a janela abaixo:

238

Grupo Multitecnus ,2013

Caso a opo selecionada seja: Add default serial version ID, o Eclipse adiciona a
declarao abaixo (em negrito):
public class MeuAppplet extends JApplet {
private static final long serialVersionUID = 1L;
private JTextField textField;

Caso a opo selecionada seja: Add generated serial version ID, o Eclipse adiciona a
declarao abaixo (em negrito):
public class MeuAppplet extends JApplet {
private static final long serialVersionUID = 6147590370495918235L;
private JTextField textField;
239

Grupo Multitecnus ,2013

Obs.: Caso voc selecione itens relacionados a problemas diferentes e pea para
fixar o problema (Quick Fix), o Eclipse exibir a janela de advertncia abaixo:

Neste caso, selecione problemas similares para depois clicar em Quick Fix,
ou ento, clique em Source Clean Up... e configure conforme desejado.
240

Grupo Multitecnus ,2013

2.19.4. Layout
O posicionamento de widgets em uma interface pode ser de forma
absoluta, ou atravs de Gerenciadores de Layout (Layout Managers).
O Eclipse (por meio do Window Builder) disponibiliza 10 gerenciadores
de layout: BorderLayout, BoxLayout, CardLayout, FlowLayout, FormLayout,
GridLayout, GridBagLayout, GroupLayout, MigLayout e SpringLayout.
a) Absolute layout
Este modo dispensa os gerenciadores de layout, e permite o
posicionamento dos componentes de forma absoluta.
b) BorderLayout
Posiciona e redimensiona os componentes em cinco regies: NORTH
(acima), SOUTH (abaixo), EAST (direita), WEST (esquerda) e CENTER (centro).
241

Grupo Multitecnus ,2013

c) BoxLayout
Posiciona os componentes um em cima do outro (mtodo construtor
passando o parmetro Y_AXIS),
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));

ou os posiciona um aps o outro, em linha outro (mtodo construtor passando o


parmetro X_AXIS),
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS));

d) CardLayout
Utilizado para gerenciar vrias pginas dentro de uma mesma janela,
sendo que somente uma pgina visvel por vez, como num arquivo de fichas.
e) FlowLayout
Arranja os componentes horizontalmente, da esquerda para a direita.
242

Grupo Multitecnus ,2013

f) FormLayout

Alinha os componentes, verticalmente ou horizontalmente, em uma


clula de um grid que ocupa toda a janela.

g) GridLayout
Dispe os componentes segundo uma grade, sendo que a dimenso da
clula que determina a dimenso dos componentes, pois um componente
sempre ocupa uma clula inteira. O mtodo construtor deve definir: n de linhas,
n de colunas, separao horizontal e separao vertical.
GridLayout (num_linhas, num_colunas, sep_horiz, sep_vert)

243

Grupo Multitecnus ,2013

h) GridBagLayout
um gerenciador de layout que alinha componentes tanto vertical como
horizontal (pela diviso da tela numa matiz), sem, contudo, exigir que os
componentes tenham o mesmo tamanho, como faz GridLayout.
Cada componente gerenciado por GridBagLayout associado com uma
instncia de GridBagConstraints (restries) que especifica como o componente
posicionado na rea requerida.

i) GroupLayout
um gerenciador de layout que agrupa os componentes de forma
hierrquica,

em

duas

formas:

sequencial

paralela,

dependendo

do

posicionamento dos elementos no continer.


244

Grupo Multitecnus ,2013

j) MigLayout

o mais verstil e flexvel dos gerenciadores de layout do Swing. Posiciona


os elementos baseado em um grid.

k) SpringLayout

Posiciona os elementos de acordo com um conjunto de restries


(putConstraint).

245

Grupo Multitecnus ,2013

2.19.5. Manipulao de Evento


As aes realizadas sobre aplicativos grficos em Java geram eventos, e
estes podem ser manipulados de acordo com a necessidade de programao.
Dessa forma, quando um boto sofre a ao de clique do mouse, um evento
disparado, o aplicativo notificado desta ao e, se houver cdigo escrito para
trat-la, esse cdigo automaticamente executado.
Para exemplificar, crie um projeto Java e inicie uma JApplet (classe
Manip_Evento) contendo trs JLabel, um JTextField e um JButton.
Altere a propriedade text do primeiro JLabel para Entrada e do segundo
JLabel para Sada; deixe a propriedade text do terceiro JLabel sem contedo algum
(deixe esse campo vazio) e altere sua propriedade Variable para lblSaida. Altere a
propriedade text de JButton para Boto. Por ltimo, altere a propriedade Variable
de JTextField para tfEntrada.
246

Grupo Multitecnus ,2013

A janela deve ser parecida com:

247

Grupo Multitecnus ,2013

Obs1.: Aumente as larguras de tfEntrada e lblSaida caso ache necessrio;


Obs2.: Foi utilizado, neste projeto, o gerenciador SpringLayout. Abaixo v-se a
janela com todos os elementos selecionados:

248

Grupo Multitecnus ,2013

O prximo passo manipular o evento de clique no boto, fazendo com que o


contedo do campo JTextField (tfEntrada) seja exibido no terceiro JLabel (lblSaida),
como mostrado na sequncia abaixo:

249

Grupo Multitecnus ,2013

D um clique com o boto direito do mouse sobre o componente JButton; em


seguida, clique em: Add event handler action actionPerformed.

250

Grupo Multitecnus ,2013

O seguinte cdigo gerado:


JButton btnNewButton = new JButton("Bot\u00E3o");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});

Nele pode-se ver a criao de um objeto da interface ActionListener, cuja funo


observar (listen) determinado componente, verificando a ocorrncia de eventos.
No caso acima, uma vez que o evento ocorra, o mtodo actionPerformed
executado. O objeto e (da classe ActionEvent) fornece informaes sobre o
componente responsvel pelo evento (por exemplo, em uma janela com dois
botes, o mtodo getActionCommand retorna uma string que possui o contedo
da propriedade text do boto que sofreu o clique do mouse).
251

Grupo Multitecnus ,2013

Dito isto, altere o mtodo actionPerformed com o cdigo em negrito:


JButton btnNewButton = new JButton("Bot\u00E3o");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lblSaida.setText ( tfEntrada.getText () );
}
});

Observe que o Eclipse gera a seguinte mensagem de erro:

Isto acontece porque o objeto lblSaida da classe Manip_Evento foi declarado dentro
do construtor (Manip_Evento), no sendo enxergado dentro de actionPerformed.
252

Grupo Multitecnus ,2013

Para solucionar esse problema, altere a linha:


JLabel lblSaida = new JLabel("");
para:
lblSaida = new JLabel("");
Insira o cdigo abaixo, aps a definio da classe Manip_Evento (fora de qualquer
mtodo):
private JLabel lblSaida;
resultando no seguinte trecho de cdigo:
public class Manip_Evento extends JApplet {
private JTextField tfEntrada;
private JLabel lblSaida;
Salve o projeto e o execute. Digite algo na caixa de texto e d um clique no boto.
253

Grupo Multitecnus ,2013

So vrios os eventos que podem ser manipulados para os diversos componentes, e


uma listagem completa pode ser acessada em:
http://download.oracle.com/javase/1.5.0/docs/api/java/awt/event/package-summary.html

e em:
http://download.oracle.com/javase/7/docs/api/index.html

Obs.: Pode-se manipular eventos de forma automtica, como mostrado no exemplo


anterior, como tambm pela criao de uma classe interna (inner class)
classe que possui os componentes que sofrero eventos a serem
manipulados.
Por exemplo, crie uma janela com dois JButton, cujos eventos de clique
devam ser manipulados, e um JLabel para informar qual boto sofreu o
clique.

254

Grupo Multitecnus ,2013

A janela deve se parecer com:

Uma vez criada a janela, acesse o cdigo-fonte (aba Source).

255

Grupo Multitecnus ,2013

O cdigo inicial criado o seguinte:


import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;

JLabel lblBotao = new JLabel("Nenhum ");


lblBotao.setBounds(199, 116, 89, 14);
getContentPane().add(lblBotao);

public class Manip_Evento extends JApplet {


}
/**
* Create the applet.
*/
public Manip_Evento() {
getContentPane().setLayout(null);

JButton bt1 = new JButton("Bot\u00E3o 1");


bt1.setBounds(83, 48, 89, 23);
getContentPane().add(bt1);
JButton bt2= new JButton("Bot\u00E3o 2");
bt2.setBounds(224, 48, 89, 23);
getContentPane().add(bt2);
JLabel lblNewLabel = new JLabel("Bot\u00E3o clicado: ");
lblNewLabel.setBounds(119, 116, 70, 14);
getContentPane().add(lblNewLabel);
256

Grupo Multitecnus ,2013

Faa as seguintes alteraes:


a) Para ter acesso interface ActionListener, inclua o pacote abaixo:
import java.awt.event.*;
b) Altere a visibilidade dos componentes: bt1, bt2 e lblBotao para global. Para tal,
esses componentes devem ser declarados dentro da classe, mas fora de qualquer
mtodo:
public class Manip_Evento_2 extends JApplet {
private JButton bt1;
private JButton bt2;
private JLabel lblBotao;
Os objetos continuaro a ser criados dentro de Manip_Evento. Por exemplo:
bt1 = new JButton("Bot\u00E3o 1");
257

Grupo Multitecnus ,2013

c) Crie a classe Manipula_Evento, logo aps a chave de fechamento do mtodo


Manip_Evento, implementando o mtodo actionPerformed:
class Manipula_Evento implements ActionListener
{
public void actionPerformed (ActionEvent ae)
{
JButton bt = (JButton) ae.getSource();
if (bt == bt1)
lblBotao.setText("Boto 1");
else
lblBotao.setText("Boto 2");
}
}

O mtodo getSource retorna um objeto que atribudo ao objeto bt aps a


converso do tipo de Object para JButton. Aps isto, imprime-se uma mensagem
em funo de bt ser igual a bt1, ou no (isto , ser igual a bt2).
258

Grupo Multitecnus ,2013

d) Crie um objeto da classe Manipula_Evento:


Manipula_Evento me = new Manipula_Evento();
e) Adicione os componentes a serem observados (listening) pelo mtodo
addActionListener:
bt1.addActionListener(me);
bt2.addActionListener(me);

259

Grupo Multitecnus ,2013

O cdigo resultante fica como abaixo. Salve o projeto e execute-o.


import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.event.*;

lblBotao = new JLabel("Nenhum");


lblBotao.setBounds(199, 116, 89, 14);
getContentPane().add(lblBotao);

public class Manip_Evento_2 extends JApplet {

Manipula_Evento me = new Manipula_Evento();


bt1.addActionListener(me);
bt2.addActionListener(me);

private JButton bt1;


private JButton bt2;
private JLabel lblBotao;

}
class Manipula_Evento implements ActionListener
{
public void actionPerformed (ActionEvent ae)
{
JButton bt = (JButton) ae.getSource();
if (bt == bt1)
lblBotao.setText("Boto 1");
else
lblBotao.setText("Boto 2");
}
}

public Manip_Evento_2() {
getContentPane().setLayout(null);
bt1 = new JButton("Bot\u00E3o 1");
bt1.setBounds(83, 48, 89, 23);
getContentPane().add(bt1);
bt2 = new JButton("Bot\u00E3o 2");
bt2.setBounds(224, 48, 89, 23);
getContentPane().add(bt2);
JLabel lblNewLabel = new JLabel("Bot\u00E3o clicado: ");
lblNewLabel.setBounds(119, 116, 70, 14);
getContentPane().add(lblNewLabel);

260

Grupo Multitecnus ,2013

2.19.5.1. Exemplos de manipulao de evento

a) Acompanhar a digitao em um JTextField:


Manipule o evento keyReleased de tfEntrada (cdigo da manipulao em
negrito):
tfEntrada = new JTextField();
tfEntrada.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent arg0) {
lblSaida.setText(tfEntrada.getText());
}
});

Salve o projeto e o execute.

261

Grupo Multitecnus ,2013

b) Obter o item selecionado em um JComboBox:


Insira um componente JComboBox;

D um clique em

(propriedade model); selecione ComboBox model items,

pressione a tecla ENTER e, em seguida, digite: um, dois e trs:

262

Grupo Multitecnus ,2013

Clique em itemStateChanged (key itemStateChanged):


JComboBox comboBox = new JComboBox();
comboBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
lblSaida.setText(arg0.getItem().toString() );
}
});

Salve o projeto e o execute.

263

Grupo Multitecnus ,2013

c) Componente JCheckBox:
Crie uma janela contendo 2 componentes JCheckBox, 3 JLabels e 1 JButton:

Altere as propriedades Variable e text como mostrado acima.

264

Grupo Multitecnus ,2013

Clique em itemStateChanged (item itemStateChanged) para ambos os


componentes JCheckBox. Crie os seguintes cdigos:
ch1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
if (ch1.isSelected())
lblGosto.setText("Cinema selecionado");
else
lblGosto.setText("Cinema no selecionado");
}
});

e,
ch2.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent arg0) {
if (ch2.isSelected())
lblGosto.setText(Teatro selecionado");
else
lblGosto.setText(" Teatro no selecionado");
}
});
265

Grupo Multitecnus ,2013

Clique em actionPerformed (action actionPerformed) para o


componente JButton. Crie o seguinte cdigo (em negrito):
btnBoto.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String sel = "";
if (ch1.isSelected())
sel = Cinema";
if (ch2.isSelected())
if (sel == "")
sel = Teatro";
else
sel += " e Teatro";
lblGosto.setText(sel);
}
});
Salve o projeto e o execute.
266

Grupo Multitecnus ,2013

d) Componente JRadioButton:
Adicione um componente JRadioButton. Inclua-o em um grupo (boto direito
do mouse, Set ButtonGroup New standard):

267

Grupo Multitecnus ,2013

Adicione outro componente JRadioButton. Inclua-o no mesmo grupo do Boto


de Rdio 1 (Set ButtonGroup buttonGroup):

268

Grupo Multitecnus ,2013

O agrupamento dos botes de rdio permite que a seleo seja mutuamente


exclusiva, ou seja, um clique em um boto de rdio de um grupo retira a seleo de
qualquer outro boto de rdio do mesmo grupo.
Clique em itemStateChanged (item itemStateChanged) para ambos os
componentes JRadioButton. Crie os cdigos abaixo, salve o projeto e o execute:
rbot1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
lblSelecao.setText("Boto de rdio 1 selecionado.");
}
});
e,
rbot2.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
lblSelecao.setText(Boto de rdio 2 selecionado.");
}
});
269

Grupo Multitecnus ,2013

2.20. Thread
Em determinadas situaes, necessria a execuo de cdigos
diferentes (ou mesmo, vrias instncias do mesmo cdigo) ao mesmo tempo como
quando voc est navegando pela internet simultaneamente a um download
em processamento, ao passo que um relgio, concomitantemente, lhe mostra as
horas.
Para resolver este tipo de problema, cria-se threads, que baseadas nas
mquinas multiprocessadas, executam cada tarefa em diferentes CPUs. Porm,
cada thread dividir o tempo da CPU em funo da prioridade da sua execuo.
Cada thread executada no seu prprio espao de memria. Contudo,
cada thread pode ver os mesmos dados globais que o resto da aplicao, podendo,
inclusive, alter-los,

270

Grupo Multitecnus ,2013

2.20.1. Interface Runnable


O cdigo abaixo implementa a interface Runnable, e cria um relgio
digital, que atualiza o JLabel lblHora:
import javax.swing.JApplet;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.util.*;
import java.awt.event.*;
public class Relogio extends JApplet implements Runnable {
private JLabel lblHora;
private Thread hora;
private JLabel lblSaida;
private JButton btnNewButton;

271

Grupo Multitecnus ,2013

/**
* Create the applet.
*/
public Relogio() {
getContentPane().setLayout(null);
lblHora = new JLabel("");
lblHora.setBounds(73, 40, 80, 14);
getContentPane().add(lblHora);
btnNewButton = new JButton("Sair");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
hora = null;
System.exit (0);
}
});
btnNewButton.setBounds(66, 116, 60, 23);
getContentPane().add(btnNewButton);
}

272

Grupo Multitecnus ,2013

// O mtodo start() executado toda vez que um applet inicia sua execuo
public void start ( ) {
if (hora == null) {
hora = new Thread (this);
hora.start ( );
}
}
/* O mtodo run() (interface Runnable) contm os comandos a serem executados em
uma thread */
public void run ( ) {
while (true) {
try {
Thread.sleep (1000);
}
catch (InterruptedException ie) { }
lblHora.setText (getTime ( ));
}
}

273

Grupo Multitecnus ,2013

private String getTime ( ) {


Calendar cal = new GregorianCalendar ( );
String hora = Integer.toString (cal.get (Calendar.HOUR_OF_DAY)),
minuto = Integer.toString (cal.get (Calendar.MINUTE)),
segundo = Integer.toString (cal.get (Calendar.SECOND));
minuto = minuto.length ( ) == 2 ? minuto : "0" + minuto;
hora = hora + ":" + minuto ;
segundo = segundo.length ( ) == 2 ? segundo : "0" + segundo;
hora = hora + ":" + segundo;
return hora;
}
}

274

2.20.2. Estendendo a Classe Thread

Grupo Multitecnus ,2013

Outra soluo para processamento simultneo de cdigo a que estende


a classe Thread, como, por exemplo, a classe Exibe_Nums, mostrada abaixo:
public class Exibe_Nums extends Thread {
int s, contagem = 0;
public Exibe_Nums(int s) {
this.s = s;
}
public void run ( ) {
while (contagem++ < 10) {
try {
System.out.println(s + "s");
Thread.sleep (s * 1000);
}
catch (InterruptedException ie) {
System.out.println ("Erro: " + ie);
}
}
System.out.println ("Fim da contagem de " + s + "s!");
}
}

275

Grupo Multitecnus ,2013

A classe Exibe_Nums imprime o total de segundos decorridos desde o incio (start)


da Thread. Para test-la, crie a classe Nums:
public class Nums {
public static void main(String[] args) {
Thread e1 = new Exibe_Nums(1);
e1.start();
Thread e3 = new Exibe_Nums(3);
e3.start();
}
}
O trecho destacado em negrito, mostra a parte do cdigo que instancia os
objetos e1 e e3, e inicia ambas as threads, com intervalos respectivos de 1s e 3s
entre as exibies.
276

Grupo Multitecnus ,2013

2.20.3. Sincronizando Threads


Muitas vezes, processos simultneos operam sobre um mesmo objeto,
como, por exemplo, um processo que escreve em uma tabela enquanto o outro
processo l dados dessa mesma tabela. Deve-se garantir, nesses casos, que os
processos sincronizem suas operaes, ou seja, quando um processo escrever na
tabela, o outro esperar essa escrita terminar, e vice-versa, evitando-se, com isso,
que os dados sejam corrompidos.
Para tal, deve-se utilizar a palavra-chave synchronized, antes do mtodo a
ser sincronizado. Por exemplo, seja o mtodo atualiza, do tipo void, e que necessita
ser sincronizado:
public synchronized void atualiza ( )

277

Grupo Multitecnus ,2013

Abaixo lista-se a classe Nums, modificada em relao ao exerccio anterior, de forma


que o mtodo construtor da classe Exibe_Nums envie uma letra identificadora no
momento da instanciao do objeto e um objeto da classe Numero :

public class Nums {


public static void main(String[] args) {
Numero n = new Numero();
Thread e1 = new Exibe_Nums('a',n);
e1.start();
Thread e3 = new Exibe_Nums('b',n);
e3.start();
}
}
278

Grupo Multitecnus ,2013

Segue, agora, a listagem da classe Exibe_Nums, a qual estende a classe Thread, e


que possui o mtodo sincronizado atualiza:

public class Exibe_Nums extends Thread {


char c;
int contagem = 0;
Numero n;
public Exibe_Nums (char c, Numero n) {
this.c = c;
this.n = n;
}

279

Grupo Multitecnus ,2013

public synchronized void atualiza ( ) {


try {
if (c == 'a')
n.num++;
else
n.num *= 5;
System.out.println("Num (" + c + ") = " + n.num);
Thread.sleep (1000);
}
catch (InterruptedException ie) {
System.out.println ("Erro: " + ie);
}
}

280

Grupo Multitecnus ,2013

public void run ( ) {


while (contagem++ < 5) {
atualiza();
}
System.out.println ("Fim da contagem de " + c + "!");
}
} // Fim da classe Exibe_Nums

Para finalizar, lista-se a classe Numero:

public class Numero {


int num;
}
281

Grupo Multitecnus ,2013

2.21. JFrame

Um objeto JFrame uma janela com ttulo e borda, cujo layout default
BorderLayout.
Um objeto JFrame , inicialmente, invisvel. Para torn-lo visvel, invoca-se
o mtodo setVisible (boolean), da classe Component, passando true por parmetro.
Ao terminar de utilizar a janela, o objeto JFrame deve ser destrudo com o
mtodo dispose ( ), o que faz com que todos os componentes contidos no JFrame e
todas as janelas que o pertenam, sejam tambm destrudos.

282

Grupo Multitecnus ,2013

Para criar um frame, crie um projeto e clique, em seguida, em JFrame:

283

Grupo Multitecnus ,2013

Altere a visibilidade do objeto criado frame, declarando-o fora do mtodo main:


public class Janela extends JFrame {
private JPanel contentPane;
private static Janela frame;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame = new Janela();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
284

Grupo Multitecnus ,2013

Insira um boto e manipule o evento de clique:


JButton btnSair = new JButton("Sair");
btnSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
frame.dispose();
}
});

285

Grupo Multitecnus ,2013

2.21.1. Frame com mais de uma Thread em Execuo

Crie a classe Relogio, um JFrame contendo dois componentes JLabel


(lblTexto e lblHora) e um JButton (btnSair).

286

Grupo Multitecnus ,2013

Neste exemplo, o texto que a palavra "Horrio" ficar piscando em


intervalos de 0,5s (thread pisca), enquanto que o horrio ser atualizado de
segundo em segundo (thread hora). Uma varivel booleana (fim) controlar o loop
while, com o consequente fim das threads, ao invs de se usar System.exit(0).
Segue o cdigo completo. Copie-o para dentro do Eclipse aps a incluso
dos componentes JLabel e JButton.

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import java.util.*;

287

Grupo Multitecnus ,2013

public class Relogio extends JFrame implements Runnable {


private JPanel contentPane;
private static Relogio frame;
private Thread hora, pisca;
private JLabel lblHora;
private JLabel lblTexto;
private boolean fim = false;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
frame = new Relogio();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
288

/**
* Create the frame.
*/
public Relogio() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 716, 459);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);

Grupo Multitecnus ,2013

JButton btnSair = new JButton("Sair");


btnSair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
fim = true;
hora.interrupt();
hora = null;
pisca.interrupt();
pisca = null;
frame.dispose();
}
catch(SecurityException se){}
}
});
289

Grupo Multitecnus ,2013

btnSair.setMnemonic('r');
btnSair.setBounds(297, 320, 89, 23);
contentPane.add(btnSair);
lblTexto = new JLabel("Hor\u00E1rio:");
lblTexto.setBounds(461, 28, 65, 14);
contentPane.add(lblTexto);
lblHora = new JLabel("00:00:00");
lblHora.setBounds(537, 28, 76, 14);
contentPane.add(lblHora);
if (hora == null) {
hora = new Thread(this);
hora.start();
}
if (pisca == null) {
pisca = new Thread(this);
pisca.start();
}
}

290

Grupo Multitecnus ,2013

public void run()


{
while ( ! fim ) {
if (Thread.currentThread() == hora) {
try {
lblHora.setText(getTime());
Thread.sleep(1000);
}
catch (InterruptedException ie) { }
}
else
if (Thread.currentThread() == pisca) {
try {
lblTexto.setVisible( ! lblTexto.isVisible() );
Thread.sleep(500);
}
catch (InterruptedException ie) { }
}
}
}

291

Grupo Multitecnus ,2013

private String getTime ( ) {


Calendar cal = new GregorianCalendar ( );
String horario = Integer.toString (cal.get (Calendar.HOUR_OF_DAY)),
minuto = Integer.toString (cal.get (Calendar.MINUTE)),
segundo = Integer.toString (cal.get (Calendar.SECOND));
minuto = minuto.length ( ) == 2 ? minuto : "0" + minuto;
horario = horario + ":" + minuto ;
segundo = segundo.length ( ) == 2 ? segundo : "0" + segundo;
horario = horario + ":" + segundo;
return horario;
}
}

292

Grupo Multitecnus ,2013

2.22. JAR

Para executar um aplicativo Java fora do ambiente de desenvolvimento


do Eclipse, preciso que se faa uso do programa "java.exe", como mostrado em
"1.2. Compilao e Execuo no Console".
Porm, o aplicativo pode referenciar um ou mais recursos (outras classes,
imagens, sons, arquivos de configurao, etc.), e que devem estar presentes no
momento da execuo.
Para que isso seja possvel, pode-se comprimir todos os recursos num
arquivo ".jar", formato de compresso baseado no conhecido formato de
compresso "ZIP".

293

Grupo Multitecnus ,2013

2.22.1 Gerando o arquivo .jar

Gera-se um arquivo ".jar" no Eclipse de forma muito simples. Utilizando o


projeto anterior (que declara a classe Relogio), d um clique com o boto direito
do mouse sobre o nome do projeto, e depois, em Export ... .

294

Grupo Multitecnus ,2013

Na janela que surge, clique em Java -> Runnable JAR file -> Next:

295

Grupo Multitecnus ,2013

Aps clicar em Next, clique em Launch configuration e selecione o nome do projeto


(neste exemplo, clique em "Relogio prj.thread"):

296

Grupo Multitecnus ,2013

Nomeie o arquivo ".jar" como "relogio":

297

Grupo Multitecnus ,2013

Finalize a operao, clicando em Finish:

298

Grupo Multitecnus ,2013

Caso haja algum aviso de advertncia de compilao (warning), uma janela surgir
alertando-o do problema. No caso do exemplo dado, a insero da declarao:
private static final long serialVersionUID
como descrito em "2.19.3.2. Fixao do Problema: no declarao de static final
serialVersionUID" resolveria o problema e evitaria o surgimento dessa janela.
Clique em OK para continuar:

299

Grupo Multitecnus ,2013

Caso haja outros erros, como erros de sintaxe (compile erros), clique em OK,
retorne ao cdigo e corrija todos os erros antes de gerar o arquivo ".jar", pois, do
contrrio, a execuo gerar uma mensagem de erro (Unresolved compilation
problem).

300

Grupo Multitecnus ,2013

Se o arquivo ".jar" foi gerado com sucesso, v ao console (no Windows, d um


clique em Acessrios -> Prompt de Comando), v at pasta (diretrio) onde o
arquivo ".jar" est armazenado e execute a linha de comando seguinte:
java -jar <nome do arquivo ".jar" >
Observe a especificao "-jar" aps "java", indicando ao JVM que trata-se
da execuo de um arquivo ".jar".
Por exemplo, se o nome do arquivo o mesmo do gerado no exemplo
anterior (relogio.jar) e o diretrio igual a C:\multitecnus, entre na janela de
console, mude para esse diretrio (cd C:\multitecnus), digite o comando
java -jar relogio.jar
e pressione a tecla ENTER.

301

Grupo Multitecnus ,2013

A imagem abaixo mostra a janela de console, o prompt do sistema (indicando o


disco "C:" e o diretrio "\multitecnus" atuais) e a linha de comando a executar.

302

Grupo Multitecnus ,2013

Aps a liberao da tecla ENTER, surge a janela contendo o frame, da mesma


forma como acontece no Eclipse:

303

Grupo Multitecnus ,2013

2.23. Tipos Genricos

Um Tipo Genrico utiliza um tipo de varivel denominado T, que pode


ser utilizado dentro da classe ou interface que o declare.
Por exemplo, seja a classe Teste, um JFrame que contm dois
componentes JTextField (tf1 e tf2) e um JButton (bt).
Na manipulao do evento de clique do boto, ser criado um objeto da
classe genrica Numero, a ser criada aps a classe Teste. A classe genrica conter,
apenas, mtodos para atribuir o valor do parmetro ao atributo interno da classe,
cujo tipo genrico e igual a T, obter o valor do atributo, alm de obter o valor do
atributo convertido para String.

304

Grupo Multitecnus ,2013

Na linha seguinte ao trmino da classe Teste (aps a chave que fecha o


cdigo da classe Teste), digite o cdigo da classe Numero, como descrito abaixo:
class Numero<T> {
private T num;
public void set (T num) {
this.num = num;
}
public T get() {
return this.num;
}
public String getString() {
return String.valueOf (this.num);
}
}
305

Grupo Multitecnus ,2013

O cdigo de manipulao do evento de clique no boto ser o seguinte:

bt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
Numero<Integer> n = new Numero<Integer>();
n.set(Integer.parseInt(tf1.getText()));
tf2.setText(n.getString());
}
});

No exemplo acima, trabalhou-se com o tipo de dado Integer; porm, o tipo T pode
ser substitudo por qualquer tipo concreto, como Double.

306

Grupo Multitecnus ,2013

2.23.1. Nomeando Variveis de Tipo: Conveno Utilizada


Por conveno, os nomes das variveis de tipo so compostos por uma
letra em maiscula.
Os nomes mais comuns so:
E

: Element (elemento)

: Key (chave)

: Number (nmero)

: Type (tipo)

: Value (valor)

S, U,

: outros tipos

307

Grupo Multitecnus ,2013

2.24. Colees
Colees so objetos que podem armazenar, recuperar e manipular
dados. A interface mais bsica a Collection, que implementa a interface Iterable
(cujo mtodo iterator retorna um objeto iterador para atuar sobre um conjunto de
objetos de tipo T. A interface iterator<E> declara mtodos para percorrer uma
coleo, ou eliminar seus elementos). Estendem Collection as seguintes interfaces:
a. List : Coleo que permite elementos repetidos (como as sequncias na
matemtica).
b. Set : Coleo que no permite elementos repetidos (como os conjuntos na
matemtica).
c. SortedSet : Coleo que no permite elementos repetidos, e que os mantm em
ordem crescente.
d. Queue : Coleo que representa uma fila (FIFO).
e. Deque : Coleo que pode representar uma fila (FIFO) ou uma pilha (LIFO).
308

Grupo Multitecnus ,2013

As interfaces Map e SortedMap representam mapeamentos, ao invs de colees,


mas so listadas aqui porque possuem mtodos que manipulam dados da
mesma forma que colees.

f. Map : Mapeamento contendo chaves e seus respectivos valores. No pode haver


chaves duplicadas, com cada chave sendo relacionada a somente um
valor. No uma coleo, mas atua de forma anloga.
g. SortedMap : um Map que mantm as chaves em ordem crescente.

309

Grupo Multitecnus ,2013

A seguir, apresenta-se implementaes para as interfaces listadas:


List
ArrayList : implementa List como um array de tamanho varivel.
LinkedList : implementa List como uma lista duplamente encadeada.
Possui desempenho bem menor do que ArrayList.
Set
HashSet : implementa Set como uma tabela hash.
TreeSet : implementa SortedSet como uma rvore binria balanceada.
LinkedHashSet : estende HashSet como uma lista duplamente encadeada
Deque
ArrayDeque : implementa Deque como um array de tamanho varivel.
Map
HashMap : implementa Map como uma tabela hash.
TreeMap : implementa Map como uma rvore Rubro-Negra.
LinkedHashMap : estende HashMap implementando-a como uma lista
encadeada.
310

Grupo Multitecnus ,2013

Vrios mtodos das interfaces e classes listados em 2.23 podem ser vistos
na planilha anexa colecoes.xlsx, encontrada no endereo:
http://www.multitecnus.com/java
Documentao mais aprofundada sobre colees pode ser encontrada em:
http://download.oracle.com/javase/6/docs/technotes/guides/collections/index.html
http://download.oracle.com/javase/6/docs/technotes/guides/collections/overview.html
http://docs.oracle.com/javase/7/docs/api/java/util/package-tree.html

311

Grupo Multitecnus ,2013

2.24.1. Algoritmos
So algoritmos polimrficos providos por java na forma de mtodos
estticos, e que, em sua maioria, aplicam-se manipulao de listas.
2.24.1.1. Sort : Ordena os valores de uma lista por meio de merge sort.
ArrayList<String> lista2 = (ArrayList<String>) lista1.clone();
Collections.sort(lista2);

Obs.1: Obter lista2 (clone da lista lista1) ao invs de utilizar a lista original,
preserva a lista original (mantm a ordem de entrada dos elementos
lista).
Obs.2: No ho h o reordenamento de elementos iguais, o que torna a ordenao
rpida e estvel.

312

Grupo Multitecnus ,2013

2.24.1.2. Shuffle : Ordena de forma aleatria os valores de uma lista.


Collections.shuffle (lista);
2.24.1.3. Reverse : Inverte uma lista (lista em ordem contrria a de entrada).
Collections.reverse (lista);
2.24.1.4. Rotate : Desloca os elementos de uma lista pela distncia especificada,
como em uma lista circular.
Collections.rotate (lista, deslocamento);
2.24.1.5. Swap : Alterna os elementos das posies especificadas.
Collections.swap (lista, pos1, pos2);
313

Grupo Multitecnus ,2013

2.24.1.6. ReplaceAll : Troca um valor por outro de todos os elementos que


possuam valor igual ao valor especificado.
Collections.replaceAll (lista, ocorrencia, novoValor);
2.24.1.7. Fill : Altera todos os elementos da lista com o valor especificado.
Collections.fill (lista, valor);
2.24.1.8. BinarySearch : Realiza uma busca binria, retornando a posio em que o
valor fornecido ocorre (primeira posio: zero), ou um
nmero negativo, indicando no haver tal ocorrncia.
int pos = Collections.binarySearch (lista, valor);
2.24.1.9. IndexOfSubList : Retorna a posio inicial em que uma sub-lista ocorre
em uma lista, ou -1, caso no haja ocorrncia.
int pos = Collections.indexOfSubList (lista, subLista);
314

Grupo Multitecnus ,2013

2.24.1.10. LastIndexOfSubList : Retorna a posio inicial da ltima ocorrncia de


uma sub-lista em uma lista, ou -1, caso no haja
ocorrncia.
int pos = Collections.lastIndexOfSubList (lista, subLista);

2.24.1.11. Frequency : Retorna a quantidade de ocorrncias do valor fornecido.


int f = Collections.frequency (lista, valor);

2.24.1.12. Disjoint : Retorna true se duas listas no tiverem elementos em comum.


boolean comparacao = Collections.disjoint (lista1, lista2);

315

Grupo Multitecnus ,2013

2.24.1.13. Min : Retorna o menor elemento da lista.

Collections.min (lista);
2.24.1.14. Max : Retorna o maior elemento da lista.

Collections.max (lista);

316

Grupo Multitecnus ,2013

2.24.2. Exemplo: Construa uma janela como a mostrada abaixo:

317

Grupo Multitecnus ,2013

Alguns componentes e seus nomes


btnEntraValor
tfEntrada

listagemEntrada

btnEsvaziaLista

318

Grupo Multitecnus ,2013

Alguns componentes e seus nomes

btnListaEntrada
btnSort
btnShuffle
btnReverse

listagemSaida

319

Grupo Multitecnus ,2013

Alguns componentes e seus nomes

rotateIndex
swapPos1
btnRotate

swapPos2

btnSwap
btnReplaceAll

tfNovoValor

tfOcorrencia

320

Grupo Multitecnus ,2013

Alguns componentes e seus nomes

btnFill
btnBinarySearch
btnIndexOfSubList
btnLastIndexOfSubList

tfFill
tfBinarySearch
tfIndexOfSubList
tfLastIndexOfSubList
321

Grupo Multitecnus ,2013

Alguns componentes e seus nomes

btnFrequency
btnDisjoint

tfFrequency
tfDisjoint

btnMin
btnMax

btnSair
322

Grupo Multitecnus ,2013

Para executar o aplicativo, siga os seguintes passos:


a) Digite um valor no campo de entrada:

E clique no boto btnEntraValor. Surge na janela ao lado o valor entrado:

323

Grupo Multitecnus ,2013

Para executar o aplicativo, siga os seguintes passos:


b) Digite um valor no campo de entrada:

E clique no boto btnEntraValor. Surge ao lado (listagemEntrada) o valor entrado:

324

Grupo Multitecnus ,2013

c) Insira os valores: 1, 2, 3, 4, 6 e 5 (nesta ordem):

d) Para esvaziar a lista, d um clique no boto btnEsvaziaLista. Isto elimina os


elementos da lista.
e) Para executar a rotao dos elementos, selecione, antes, o deslocamento e,
depois, clique no boto btnRotate:

325

Grupo Multitecnus ,2013

f) Para trocar dois elementos de posio:


f.1) Defina a primeira posio:

f.2) Defina a segunda posio:

f.3) Clique em btnSwap para trocar os elementos de posio.

326

Grupo Multitecnus ,2013

g) Antes de clicar o boto btnReplaceAll, preencha, antes, os campos de texto.

h) Antes de clicar o boto btnFill, preencha, antes, o campo de texto.

Igual procedimento deve ser realizado para os botes btnBinarySearch e


btnFrequency.
327

Grupo Multitecnus ,2013

i) Para utilizar o boto btnIndexOfSubList, preencha o campo de texto com um


valor, ou digite vrios valores separados por vrgula (sem espao):

Igual procedimento deve ser realizado para os botes btnLastIndexOfSubList e


btnDisjoint.
O cdigo-fonte deste exemplo encontra-se no endereo:
http://www.multitecnus.com/java/colecoes_src.doc
328

Grupo Multitecnus ,2013

2.25. JDBC
Java Database Conectivity , ou JDBC, prov acesso a dados por meio de
rotinas pr-construdas, disponibilizadas ao programador para construir aplicativos.
Trata-se, ento, de uma interface que auxilia a programao de aplicativos (ou API Application Programming Interface).
Com JDBC um sistema Java pode se comunicar com vrios SGBDs
(Sistemas Gerenciadores de Bancos de Dados, ou DBMS Database Management
System), tais como: MySQL, POstgreSQL, Oracle, Microsoft SQL Server, dentre
outros, acessando seus dados para exibio ou manipulao.
No endereo: http://docs.oracle.com/javase/tutorial/jdbc/basics/index.html h
um tutorial completo sobre a API JDBC.

329

Grupo Multitecnus ,2013

2.25.1. MySQL
MySQL um SGBD multiplataforma, possuindo uma verso sob licena
GPL (free), e uma verso Entreprise Edition (paga).
Com o MySQL pode-se criar bancos de dados relacionais, utilizar
conceitos de transao, executar stored procedures (procedimentos armazenados)
e funes, alm de triggers.
Para que os exerccios aqui deem certo, faa o download do aplicativo
EasyPHP, que instala o MySQL (alm de um interpretador para a linguagem PHP,
que no ser objeto de estudo neste material). Uma vez instalado, v ao navegador
e acesse o endereo: http://127.0.0.1/home/mysql/ . No MySQL, crie um banco
de dados de nome "dbTeste" e, nele, crie a tabela "teste" contendo o campo
"nome" (VARCHAR; 30; PRIMARY).
330

Grupo Multitecnus ,2013

Para que se d a comunicao entre aplicativos Java e o MySQL, deve-se instalar o


driver JDBC MySQL Connector/J. Para tal, execute os seguintes passos:
a) Fazer o download do driver (http://www.mysql.com/downloads/connector/j/)
para o banco especificado (MySQL);
b) Descompactar o arquivo baixado; voc ver o arquivo .jar no diretrio de
descompresso (no exemplo dado: mysql-connector-java-5.1.17-bin.jar );
c) Clicar em Window -> Preferences:

331

Grupo Multitecnus ,2013

d) Clicar em Data Management -> Connectivity -> Driver Definitions:

Clicar em Add...
332

Grupo Multitecnus ,2013

e) Selecionar MySQL no campo Vendor Filter:

333

Grupo Multitecnus ,2013

f) Selecione um dos drivers disponveis (por exemplo, da verso 5.1):

334

Grupo Multitecnus ,2013

g) Clicar na aba JAR List:

Clicar no driver MySQL que aparece e, depois, em Remove JAR/Zip.


335

Grupo Multitecnus ,2013

h) Clicar em Add JAR/Zip... :

336

Grupo Multitecnus ,2013

i) Selecionar o arquivo .jar obtido da descompactao (item b) e abrir:

337

Grupo Multitecnus ,2013

j) Clicar em OK:

338

Grupo Multitecnus ,2013

k) Pronto: o driver est carregado pelo Eclipse.

339

Grupo Multitecnus ,2013

2.25.2. Manipulando Dados no MySQL com Java


a) Criar um projeto contendo dois campos JTextField, um JButton e um JTextArea,
como mostrado abaixo:

340

Grupo Multitecnus ,2013

b) Insira o driver JDBC para MySQL. Para tal, clicar com o boto direito sobre o
projeto; em seguida, clicar em Build Path -> Configure Build Path:

341

Grupo Multitecnus ,2013

c) Clicar em Add Library:

342

Grupo Multitecnus ,2013

d) Na janela que surge, clicar em Connectivity Driver Definition:

Em seguida, clicar em Next.


343

Grupo Multitecnus ,2013

e) Em seguida, selecione o driver JDBC para MySQL e, em seguida, clicar em Finish:

344

Grupo Multitecnus ,2013

f) Pronto. O driver JDBC para MySQL foi inserido no projeto:

345

Grupo Multitecnus ,2013

A insero do driver JDBC, pode ser observado no Package Explorer:

346

Grupo Multitecnus ,2013

g) Manipular o evento onclick do boto (actionPerformed) com o seguinte cdigo:


String connection_url = "jdbc:mysql://localhost/" + txtDbteste.getText() + "?user='root'";
try
{
Class.forName( "com.mysql.jdbc.Driver" ).newInstance();
Connection conn = DriverManager.getConnection( connection_url );
Statement stmt = (Statement) conn.createStatement();
try
{
String query;
if (!txtSelectFrom.getText().isEmpty())
query = txtSelectFrom.getText();
else
query = "SELECT * FROM `teste`";
System.out.println( "Query: " + query );
ResultSet retorno = ((java.sql.Statement) stmt).executeQuery( query );
textArea.setText("");
347

Grupo Multitecnus ,2013

while( retorno.next() )
{
String nome = retorno.getString( "nome" );
textArea.append(nome + "\n");
}
}
catch( SQLException e )
{
System.out.println( "SQLException: " + e.getMessage() );
System.out.println( "SQLState: " + e.getSQLState() );
System.out.println( "VendorError: " + e.getErrorCode() );
}
}
catch( Exception e )
{
System.out.println( e.getMessage() );
e.printStackTrace();
System.out.println( "Se no existir, crie o banco de dados: \"teste\"");
}

348

Grupo Multitecnus ,2013

h) Utilize o Quick Fix para solucionar os problemas que surgem:

- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.beans.Statement;

i) Executar.

349

Grupo Multitecnus ,2013

2.26. Arquivos em Disco


A classe File a representao lgica de um arquivo. Seu mtodo
construtor :
File(String arquivo)
File(String path, String arquivo)
Onde deve ser declarado o nome do arquivo a manipular; adicionalmente, pode-se
fornecer o nome do diretrio onde o arquivo se encontra. Seus mtodos teis so:

canRead( ) : Retorna true se o arquivo especificado pelo objeto File existe e pode
ser lido. Deve ser usado com SecurityException num bloco try/catch.
canWrite( ) : Retorna true se o arquivo especificado pelo objeto File pode sofrer
escrita. Deve ser usado com SecurityException num bloco try/catch.
350

Grupo Multitecnus ,2013

delete( ) : Apaga o arquivo especificado pelo objeto File. Deve ser usado com
SecurityException num bloco try/catch.
exists( ) : Retorna true se o arquivo especificado pelo objeto File existe. Deve ser
usado com SecurityException num bloco try/catch.
getName( ) : Retorna uma String contendo o nome (sem o diretrio) do arquivo
especificado pelo objeto File.
getPath( ) : Retorna uma String contendo o caminho (path) onde est localizado o
arquivo representado pelo objeto File.
IsFile( ) : Retorna true se o arquivo especificado pelo objeto File um arquivo
normal (no um diretrio, por exemplo). Deve ser usado com
SecurityException num bloco try/catch.
351

Grupo Multitecnus ,2013

lastModified( ) : Retorna um valor long representando o tempo em que houve a


ltima modificao do arquivo. Como o tempo um long, no
deve ser interpretado de forma absoluta, mas sim, utilizado na
comparao com outros valores retornados por lastModified( ).
Deve ser usado com SecurityException num bloco try/catch.
length( ) : Retona um long contendo o tamanho do arquivo, representado pelo
objeto File, em bytes, ou 0L se o arquivo no existir. Deve ser usado
com SecurityException num bloco try/catch.
list( ) : Retorna um array de strings contendo os nomes dos arquivos contidos no
diretrio especificado pelo arquivo. Deve ser usado com SecurityException
num bloco try/catch.
352

Grupo Multitecnus ,2013

list(FileNameFilter filtro) : Retorna um array de strings contendo os nomes dos


arquivos contidos no diretrio especificado pelo arquivo,
e que satisfaam condio filtro. Deve ser usado com
SecurityException num bloco try/catch.
mkdirs( ) : Cria um diretrio cujo caminho o especificado pelo arquivo representado
pelo objeto File, incluindo diretrios de nveis superiores. Deve ser usado
com SecurityException num bloco try/catch.
renameTo (File novo_nome) : Renomeia o arquivo para novo-nome. Deve ser
usado com SecurityException num bloco try/catch.
Para maiores informaes sobre a classe File, acesse o endereo:
http://docs.oracle.com/javase/1.4.2/docs/api/java/io/File.html.
353

Grupo Multitecnus ,2013

2.26.1. FileInputStream

Esta classe, cujo mtodo contrutor :


FileInputStream(File f)
representa uma stream para leitura de dados de um arquivo.
Seus mtodos so:

close( ) : Fecha o arquivo e libera quaisquer recursos associados. Deve ser chamado
com IOException num bloco try/catch.
read(byte b[ ]) : L o total de bytes especificados por b.length, retornando quantos
bytes foram lidos, ou 1 se o fim de arquivo foi alcanado. Deve ser
chamado com IOException num bloco try/catch.
354

Grupo Multitecnus ,2013

2.26.2. FileOutputStream

Esta classe cujo mtodo construtor :


FileOutputStream(File f)
representa uma stream para escrita de dados num arquivo.
Seus mtodos teis so:
close( ) : Fecha o arquivo e libera quaisquer recursos associados. Deve ser chamado
com IOException num bloco try/catch.
write(byte b[ ]) : Escreve o total de bytes especificados por b.length. Deve ser chamado
com IOException num bloco try/catch.

355

Grupo Multitecnus ,2013

2.26.3. Operao com Arquivo em Disco

Para operarmos com arquivos em disco, devemos cumprir as etapas:

a) Importar as classes de java.io:


Import java.io.*;

b) Associar um arquivo em disco (atravs de uma string contendo seu nome) a um


dispositivo lgico (uma varivel do tipo File):
File f = new File (nome_arq);

356

Grupo Multitecnus ,2013

c) Instanciar objetos que permitam operar (ler ou escrever) o arquivo:


c.1) Para abrir o arquivo para leitura:
FileInputStream fis = new FileInputStream(f);
c.2) Para abrir o arquivo para escrita:
FileOutputStream = fos = new FileOutputStream(f);
c.3) Para manipular os dados:
c.3.1) Declarar uma varivel array que servir de buffer de entrada / sada:
Byte [ ] buf = new byte[1];
c.3.2) Ler dados do arquivo:
while (fis.read(buf) != -1)
357

Grupo Multitecnus ,2013

c.3.3) Escrever dados do arquivo:


fos.write (buf);
c.3.4) Terminadas as operaes com o arquivo, fech-lo:
c.3.4.1) Se o arquivo estiver aberto para leitura:
fis.close( );
c.3.4.2) Se o arquivo estiver aberto para escrita:
fos.close( );

358

Grupo Multitecnus ,2013

Obs.1: H duas classes JFileChooser e FileDialog, que permitem obter os nomes dos
arquivos origem e destino, facilitando o trabalho de cpia de arquivos. Por
exemplo, para obter o nome do arquivo origem:
fc = new JFileChooser();
fc.setDialogTitle(Copiar de");
boolean ok = fc.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION;
E, para salvar:
FileDialog fd = new FileDialog(frame,"Copiar para",FileDialog.SAVE);
fd.setVisible(true);
arq_novo = fd.getDirectory()+fd.getFile();
Onde frame, em ambos os cdigos, o objeto pai da janela de dilogo.
359

Grupo Multitecnus ,2013

Obs. 2: Pode-se utilizar as classes como no exemplo dado, bem como, pode-se utilizar
somente uma delas, isto , ou s utilizar FileChooser, ou s utilizar FileDialog:

a) FileChooser
a.1) Carregar o arquivo: FileChooser.showOpenDialog
a.2) Salvar o arquivo

: FileChooser.showSaveDialog

b) FileDialog
b.1) Carregar o arquivo: FileDialog(frame,"Copiar para",FileDialog.OPEN);
b.2) Salvar o arquivo

: FileDialog(frame,"Copiar para",FileDialog.SAVE);

No modo save evita-se sobrescrever um arquivo, pois gerada uma


mensagem de alerta caso o arquivo j exista no diretrio destino.
360

Grupo Multitecnus ,2013

Para exemplificar, construa uma janela contendo dois JButton e um JProgressBar (altere a
propriedade stringPainted do JProgressBar para true, para aparecer o valor dentro da
barra de progresso):

Manipule o evento de clique do mouse (Add event handler action actionPerformed)


para os dois JButton.
O cdigo-fonte deste exemplo encontra-se no endereo:
http://www.multitecnus.com/java/arquivoEmDisco_src.doc
361

Grupo Multitecnus ,2013

2.27. Serializao
Um objeto deve ser serializado, quando se tem a necessidade de
armazen-lo em uma stream, com seu estado correto e todos os seus campos.
O conceito de armazenar um objeto no seu estado corrente no novo,
e, s vezes, refere-se a isto como sendo a persistncia do objeto.
Para poder serializar uma classe, devemos implementar a interface
Serializable.
A interface Serializable utilizada para definir a representao de um
objeto que deve ser transferido para/de uma stream.

362

Grupo Multitecnus ,2013

Algumas regras devem ser observadas:

- Variveis que contenham o modificador transient, no so serializados, e seu


valor alterado para null na gravao na stream;
- Variveis static so zeradas;
- Variveis private no podem ser serializadas;
- Podem ser serializados objetos de classes externas ou internas, desde que
implementem a interface Serializable;

A classe que cuidar da gravao do objeto serializado, dever


implementar o mtodo writeObject( ) e a classe que ler o objeto serializado da
stream correspondente, dever implementar o mtodo readObject( ).

363

Grupo Multitecnus ,2013

Para exemplificar, siga os seguintes passos:


a) Crie um novo projeto (prj.serializacao);
b) Crie uma classe sem o mtodo main, com o nome ClasseExterna:
import java.io.*;
class ClasseExterna implements Serializable {
boolean varExterna;
}
c) Crie uma classe que conter os dados (inclusive dois objetos: o primeiro,
instncia da classe externa criada em b; o segundo, instncia da classe
interna classe cujos dados sero serializados):
import java.io.*;
public class Dados implements Serializable
{
public String login;
static int valor1;
364

Grupo Multitecnus ,2013

final int valor2 = 456;


protected int valor3;
char valor4;
String valor5;
ClasseExterna ce ; // objeto da classe externa
ClasseInterna ci ; // objeto da classe interna
public Dados ( )
{
login = "Jose";
valor1 = 123;
valor3 = 789;
valor4 = 'A';
valor5 = "Alo Voce!";
ci = new ClasseInterna ( );
ci.varInterna = true;

365

Grupo Multitecnus ,2013

ce = new ClasseExterna ( );
ce.varExterna = false;
}
public void escreve ( )
{
System.out.println ("Arquivo recuperado!");
}
class ClasseInterna implements Serializable
{
boolean varInterna;
}
}

366

Grupo Multitecnus ,2013

d) Crie uma classe que escrever os dados no disco:


import java.io.*;
public class SerialW
{
public static void main (String args [ ]) {
Dados d = new Dados ( );
try {
FileOutputStream fos = new FileOutputStream ("dados.ser");
ObjectOutputStream oos = new ObjectOutputStream (fos);
oos.writeObject (d);
oos.flush ( );
oos.close ( );
}
catch (IOException ioe) {
System.out.println ("Ocorreu o erro: " + ioe.getMessage ( ));
}
}
}
367

Grupo Multitecnus ,2013

e) Crie uma classe que ler os dados do disco:


import java.io.*;
public class SerialR
{
public static void main (String args [ ]) {
Dados d;
try {
FileInputStream fis = new FileInputStream ("dados.ser");
ObjectInputStream ois = new ObjectInputStream (fis);
d = (Dados) ois.readObject ( );
ois.close ( );
System.out.println ("Login = + d.login);
System.out.println ("Valor1 = " + Dados.valor1);
System.out.println ("Valor2 = " + d.valor2);
System.out.println ("Valor3 = " + d.valor3);
System.out.println ("Valor4 = " + d.valor4);
System.out.println ("Valor5 = " + d.valor5);
d.escreve ( );
368

Grupo Multitecnus ,2013

System.out.println ("ci.varInterna = " + d.ci.varInterna);


System.out.println ("ce.varExterna = " + d.ce.varExterna);
}
catch (ClassNotFoundException cnfe) {
System.out.println ("Ocorreu o erro: " + cnfe.getMessage ( ));
}
catch (IOException ioe) {
System.out.println ("Ocorreu o erro: " + ioe.getMessage ( ));
}
}
}

369

Grupo Multitecnus ,2013

Feito isto, execute o aplicativo serialW e, em seguida, o aplicativo serialR.


Se tudo ocorreu bem, ser impresso o seguinte:

Login = Jose
Valor1 = 0
Valor2 = 456
Valor3 = 789
Valor4 = A
Valor5 = Alo Voce!
Arquivo recuperado!
ci.varInterna = true
ce.varExterna = false

370

Grupo Multitecnus ,2013

2.28. Anotaes
Anotaes (Annotations) so metadados que auxiliam o compilador,
documentando o cdigo-fonte. Ao contrrio dos comentrios, anotaes podem
ser processadas por ferramentas automticas, apresentando informao de forma
clara e padronizada. Permitem ao desenvolver marcar classes e mtodos, sem,
contudo, fazer parte do cdigo.
Declara-se um tipo de anotao com a seguinte sintaxe:
public @interface AnotacaoNome
{
tipo atributoDeAnotao1();
tipo atributoDeAnotao2();

}
371

Grupo Multitecnus ,2013

So tipos vlidos para atributos de anotao: tipos primitivos (int, float,


boolean, etc.), String, classes, anotaes (no pode haver recursividade),
enumerao e array unidimensional de um dos tipos acima.
Os atributos de anotao possuem sintaxe igual a dos mtodos, mas se
comportam como atributos de uma classe; so delimitados por chaves e podem ser
iniciados com valores a partir da declarao do tipo de anotao. Para tal, usa-se a
clusula default aps o nome do elemento, seguido do valor a ser atribudo a ele.
Uma vez declarada a anotao, pode-se utiliz-la em uma classe pela
especificao do caractere @, seguido do nome da anotao e, delimitado por
parnteses, os elementos de anotao (recebendo valores compatveis com seus
tipos) separados por vrgula.
Pode-se criar anotaes ou utilizar anotaes predefinidas (como
@Override ou @Deprecated), cada qual com uma funcionalidade especfica.
372

Grupo Multitecnus ,2013

2.28.1. Criando Anotaes com o Eclipse


Inicie um novo projeto no Eclipse e siga os passos abaixo:
a) Adicione uma anotao: File -> New -> Annotation
b) Insira o cdigo da anotao:
package nome_pacote;
public @interface AnotacaoNome {
String attr1();
String attr2();
}

373

Grupo Multitecnus ,2013

c) Adicione uma classe: File -> New -> Class


d) Insira o cdigo da classe:
package nome_pacote;
@AnotacaoNome (
attr1 = "valor 1" ,
attr2 = "valor 2"
)
public class NomeClasse {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
cdigo da classe
}
}
374

Grupo Multitecnus ,2013

2.28.2. Anotaes Predefinidas

1) Deprecated
Pacote: java.lang
Funo: Um elemento que recebe essa anotao tem seu uso desencorajado.

2) Documented
Pacote: java.lang.annotation
Funo: Indica que a anotao ser documentada por javadoc.

375

Grupo Multitecnus ,2013

3) Override
Pacote: java.lang
Funo: utilizada quando o mtodo da subclasse deve sobrescrever o mtodo da
superclasse utilizando a mesma assinatura, ou seja, mesmo tipo de retorno, mesmo
nome e os mesmos parmetros (quantidade, nomes e tipos). Os blocos de comando
que os mtodos definem podem ser diferentes, mas as assinaturas devem ser as
mesmas.

4) Inherited
Pacote: java.lang.annotation
Funo: Indica que a anotao ser herdada.

376

Grupo Multitecnus ,2013

5) Retention
Pacote: java.lang.annotation
Funo: Indica o tempo de reteno da anotao.
Elemento requerido: RetentionPolicy value

Obs.: RetentionPolicy um tipo enumerado, contendo os possveis valores para


atribuio varivel value:
- SOURCE: a anotao deve ser armazenada somente no cdigo-fonte, no fazendo
parte do cdigo binrio.
- CLASS: a anotao deve ser armazenada no cdigo-fonte e no cdigo binrio, mas no
precisa estar disponvel durante o processo de execuo.
- RUNTIME: a anotao armazenada no arquivo binrio e deve estar disponvel em
tempo de execuo.
377

Grupo Multitecnus ,2013

6) SuppresWarnings
Pacote: java.lang
Funo: As mensagens de advertncia devem ser suprimidas para o elemento anotado.
Elemento requerido: String[] value
Obs: Alguns valores vlidos para value:
all : suprime todos as mensagens de advertncia
Boxing : suprime mensagens de advertncia relativas a processos de converso de
empacotamento (boxing/unboxing), quando um elemento convertido para
sua classe (int para Integer, por exemplo), e vice-versa
cast : suprime mensagens de advertncia relativas a operaes de converso (int para
float, por exemplo)
378

Grupo Multitecnus ,2013

dep-ann : suprime mensagens de advertncia relativas a anotao marcada como


"deprecated"
fallthrough : suprime mensagens de advertncia relativas a falta de break em switch
finally : suprime mensagens de advertncia relativas a bloco finally que no retorna
hiding : suprime mensagens de advertncia relativas a variveis locais escondem
variveis
incomplete-switch : suprime mensagens de advertncia relativas a ausncia de
entradas numa clusula switch
null : suprime mensagens de advertncia relativas a anlises nulas
serial : suprime mensagens de advertncia relativas falta do campo serialVersionUID
para uma classe "serializable"
unused : suprime mensagens de advertncia relativas a cdigo no utilizado

379

Grupo Multitecnus ,2013

7) Target
Pacote: java.lang.annotation
Funo: Indica para quais elementos a anotao ser aplicvel.
Elemento requerido: ElementType[] value
Lista-se abaixo os valores do tipo ElementType vlidos e os respectivos locais onde
utilizar a anotao:
ANNOTATION_TYPE : antes da declarao de anotaes (public @interface)
CONSTRUCTOR : antes de um mtodo construtor
FIELD : antes de atributo (incluindo constantes enumeradas)
LOCAL_VARIABLE : antes da declarao de variveis locais
METHOD : antes da declarao de mtodos
PACKAGE : antes da declarao de pacotes no arquivo package-info.java
PARAMETER : antes da declarao de parmetros
TYPE : antes da declarao de classes, interfaces, anotaes ou tipos enumerados
380

Grupo Multitecnus ,2013

Obs.: O arquivo package-info.java deve conter o nome do pacote do qual ele faz parte.
Por exemplo, se o nome do pacote for com.multitecnus.anotacoes o mesmo
dever conter o seguinte:
package com.multitecnus.anotacoes;

Para utilizar uma anotao do tipo PACKAGE, declara-se a anotao antes da


declarao do pacote.
Cada pacote do projeto deve conter um arquivo package-info.java com o nome
do pacote respectivo.

381

Grupo Multitecnus ,2013

Exemplo: Crie a anotao Autoria:


package com.multitecnus.anotacoes;
import java.lang.annotation.Documented;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;

@Documented
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface Autoria {
String autor();
String data();
double versao() default 1.0;
}

382

Grupo Multitecnus ,2013

Agora, crie a classe UsaAnotacoes:

package com.multitecnus.anotacoes;
import java.lang.SuppressWarnings;
@SuppressWarnings( { "all" } )
@Autoria
(
autor = "Multitecnus" ,
data = "15/03/2011"
)
public class UsaAnotacoes {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println ("Exemplo de uso de annotation");
}
}
383

Grupo Multitecnus ,2013

2.29. XML eXtensible Markup Language


A HTML cumpre bem o papel de mostrar os dados ao usurio, mas nada
faz a respeito da manipulao desses dados.
A HTML, por isso, apresenta uma srie de limitaes:
- uma tecnologia para apresentaes, combinando dados com a forma de
apresent-los, tornando difcil uma separao dos dois elementos;
-Tem um conjunto fixo e rgido de marcaes (tags), e no permite o uso e
marcaes prprias;
-No permite que se especifique uma hierarquia de dados (como limites e
importncia);
-Os dados no so facilmente legveis, nem por pessoas, nem por computadores;

384

Grupo Multitecnus ,2013

-Apresenta inconsistncias, como as tags que somente so usadas no incio (como


<p> e <b>), ao contrrio de outras que tem incio e fim (como <html> e </html>),
fazendo com que os analisadores de sintaxe HTML dos navegadores tenham de
saber lidar com essa formatao.

2.29.1. Meta-informao

A XML surgiu, no como substituta do HTML, mas como complemento a esta.


No propriamente uma linguagem, mas sim, uma srie de especificaes
com base nas quais outras linguagens podem ser definidas. Em consequncia,
pode-se criar um conjunto de tags personalizadas para fornecer informaes sobre
dados.

385

Grupo Multitecnus ,2013

Por exemplo, sejam os dados abaixo:


Carlos
Antnio
Rua No Sei Onde, 100 fd
Rio de Janeiro
21-9999-9999
Esses dados poderiam estar representados em um cdigo HTML como abaixo:
<h1><u><b>Carlos</u></h1><br>
<h1><u><b>Antnio</u></h1><br>
<i>Rua No Sei Onde, 100 fd</i><br>
<h4>Rio de Janeiro</h5><br>
<b>21-9999-9999</b><br>
386

Grupo Multitecnus ,2013

Esses dados so de difcil visualizao. Alm disso, pode-se fazer uma simples
pergunta, sem se obter resposta satisfatria: Carlos primeiro ou segundo nome,
ou seja, trata-se algum chamado Carlos Antnio ou Antnio Carlos?
Esta dificuldade leva ao conceito de METAINFORMAO, ou, dados que
descrevem um conjunto de informaes e que do significado a ele.
Assim, o conceito por trs da XML o de produzir metainformao e
fornec-la a um computador, de tal sorte que este processe as informaes sobre
os dados maneira mais slida.
Bancos de dados trabalham com o conceito de metainformao. Por
exemplo, para armazenar os dados listados anteriormente numa tabela, esta teria
que ter uma estrutura parecida com: SEGUNDO_NOME, PRIMEIRO_NOME, RUA,
CIDADE, TELEFONE.

387

Grupo Multitecnus ,2013

O mesmo pode ser conseguido com a XML:


<?xml version="1.0" encoding="ISO-8859-1" ?>
<pessoa>
<nome>
< segundo_nome >Carlos</ segundo_nome>
<primeiro_nome>Antnio</primeiro_nome>
</nome>
<endereco>
<rua>No Sei Onde, 100 fd</rua>
<cidade>Rio de Janeiro</cidade>
</endereco>
</pessoa>

Observe que, se no houvesse acentuao, a informao de codificao (encoding)


poderia ser suprimida, resultando em:
<?xml version="1.0" ?>
388

Grupo Multitecnus ,2013

O trecho "encoding=ISO-8859-1" indica que o contedo aceita


acentuao de alguns idiomas, dentre eles o portugus.
Assim, a presena de novas tags tornou o documento um pouco mais
fcil de ser entendido, ganhou mais significado, facilitando para uma aplicao
processar informaes.
Seguem algumas observaes:
-A linha contendo a informao: <?xml version="1.0"> tem de ser a primeira
informao de um documento XML, isto , no pode haver linhas que no sejam
em branco acima desta clusula;
-No pode haver espao em branco entre "?" e "xml", bem como, no pode haver
espao em branco entre os caractere "?" e ">" do final da declarao.

389

Grupo Multitecnus ,2013

Abaixo, um exemplo de XML para representar disciplinas de um curso:


<?xml version="1.0" encoding="UTF-8" ?>
<horario>
<disciplina>
<nome>Nome da disciplina 1</nome>
<turma>
<numero>001</numero>
<aula>SEG 18h s 20h</aula>
</turma>
<turma>
<numero>002</numero>
<aula>QUI 21h s 23h</aula>
</turma>
</disciplina>
<disciplina>
<nome>Nome da disciplina 2</nome>
<turma>
<numero>005</numero>
<aula>TER 18h s 22h</aula>
</turma>
</disciplina>
</horario>
390

Grupo Multitecnus ,2013

2.29.2. Regras

So as seguintes regras a serem seguidas:


-Cada tag de incio deve ter uma tag de fim;
-S pode haver uma tag raiz (que delimita o incio e o fim da informao);
-Ao contrrio do HTML, as tags so sensveis a maisculas/minsculas. Portanto,
<disciplina> diferente de <Disciplina> e diferente de <DISCIPLINA>.

Assim, o XML muito simples, permitindo ao desenvolvedor suas


prprias estruturas rotuladas para armazenar informaes, e baseada em texto, o
que torna o cdigo mais legvel, fcil de documentar e depurar.

391

Grupo Multitecnus ,2013

2.29.3. DTD Document Type Definition

Imagine a seguinte situao: duas empresas, A e B, fazem transaes online e


mantm controle de nomes, endereos e nmeros de telefones.
Suponha que as estruturas das tabelas correspondentes a cada banco de
dados seja:

- Empresa A: PrimeiroNome, UltimoNome, Endereco1, Endereco2, Cidade, Estado,


CEP, Telefone

- Empresa B: Nome, Endereco, Cidade, Estado, CEP, Telefone

392

Grupo Multitecnus ,2013

Assim sendo, se as empresas quiserem trocar informaes, ambas tero que


escrever um aplicativo que entenda a modelagem de dados da outra. Aps criado o
aplicativo, se uma das empresas alterar a estrutura de seu banco de dados, por
exemplo, alterar o nome da primeira coluna de "PrimeiroNome" para
"Primeiro_Nome", o aplicativo da outra empresa deixaria de funcionar. Por razes
de segurana, muito provvel (e quase certo!) que nenhuma das empresas ir
conceder o acesso a seu banco de dados a outra empresa.
Uma forma de resolver este problema utilizar XML, restando s empresas a
tarefa de decidir quais informaes devem ser trocadas.
Como um banco de dados projetado especificando-se os tipos de dados a
serem armazenados nos diferentes campos, a XML permite definir a estrutura do
documento de forma que a validade dos dados possa ser verificada. Essa estrutura
definida em um documento denominado: DTD ou DOCUMENT TYPE DEFINITION.
393

Grupo Multitecnus ,2013

Abaixo, v-se o documento XML produzido para horrio e seu DTD:


<?xml version="1.0" encoding="UTF-8" ?>
<horario>
<disciplina>
<nome>Nome da disciplina 1</nome>
<turma>
<numero>001</numero>
<aula>SEG 18h s 20h</aula>
</turma>
<turma>
<numero>002</numero>
<aula>QUI 21h s 23h</aula>
</turma>
</disciplina>
<disciplina>
<nome>Nome da disciplina 2</nome>
<turma>
<numero>005</numero>
<aula>TER 18h s 22h</aula>
</turma>
</disciplina>
</ horario>

<!ELEMENT horario (disciplina+) >


<!ELEMENT disciplina (nome, turma+) >
<!ELEMENT turma (numero, aula)
<!ELEMENT nome (#PCDATA) >
<!ELEMENT turma (#PCDATA) >
<!ELEMENT numero (#PCDATA) >
<!ELEMENT aula (#PCDATA) >

394

Grupo Multitecnus ,2013

Salvando-se os arquivos como: horario.xml e horario.dtd, respectivamente, podese referenciar o documento DTD no arquivo XML:

<?xml version="1.0" encoding="UTF-8" >


<!DOCTYPE horario SYSTEM "horario.dtd" >
<horario>
<disciplina>

395

Grupo Multitecnus ,2013

Assim, tem-se que:


<!ELEMENT : declara elementos. O nome do elemento deve iniciar com letra, trao
sublinhado ( _ ) ou dois pontos ( : ), e pode conter qualquer tamanho. Nomes no
podem conter caracteres especiais ou espaos, sendo permitidos somente letras,
nmeros e o caracteres:
- ponto ( . )

- dois pontos ( : )

- hfen ( - )

- trao sublinhado ( _ )

O tipo do contedo declarado aps o nome, e pode ser um elemento pode ser
atmicos (ou so vazios ou possuem somente texto) ou complexos (possuem
somente elementos filhos, ou possuem texto e elementos filhos misturados).

396

Grupo Multitecnus ,2013

a) Elementos que no possuem contedo (EMPTY):


<!ELEMENT nome EMPTY >
b) Elementos que podem conter somente texto devem ser declarados como
(#PCDATA):
<!ELEMENT nome (#PCDATA) >
Os elementos sofrem anlise sinttica (pelo analisador sinttico de documentos
XML, ou XML parser), e, por isso, no devem conter caracteres de marcao
tais como: < , > e &, que devem ser substitudos por entidades de caractere
(por exemplo, o caractere " < " deve ser representado como: " &lt; ").
c) Elementos que podem conter tanto texto como elementos filhos, devem ser
declarados como ANY:
<!ELEMENT nome ANY >
397

Grupo Multitecnus ,2013

A DTD tambm permite especificar quais so os filhos de um elemento,


quantas vezes e em que ordem eles podem aparecer. Para isso, existem alguns
caracteres para indicar sequncia, e outros para indicar cardinalidade.
- Indicador de Sequncia: utiliza os seguintes conectores lgicos:
' , ' : conector de sequncia
' | ' : conector de escolha
Por exemplo, veja as definies seguintes para autor (que possui 'nome', 'email'
e 'endereo') e defesa (que pode conter, ou o elemento MSc mestrado, ou o
elemento DSc doutorado):
<!ELEMENT autor (nome, email, endereo) >
<!ELEMENT defesa (MSc | DSc) >

398

Grupo Multitecnus ,2013

- Indicador de Cardinalidade: utiliza os seguintes caracteres:


' + ' : pode aparecer uma ou vrias vezes seguidas
' * ' : opcional; caso aparea, sua ocorrncia pode se dar vrias vezes
' ? ' : opcional; caso aparea, sua ocorrncia pode se dar apenas uma vez
Por exemplo, na declarao:
<!ELEMENT publicao (ttulo, ano, autor+, referncia*,instituio? ) >
indica que:
-

O elemento autor pode aparecer vrias vezes seguidas (a publicao pode ter
mais de um autor)

O elemento referncia opcional, e que, ao aparecer, pode s-lo vrias vezes

O elemento instituio opcional e, se ocorrer, ocorre apenas uma vez


399

Grupo Multitecnus ,2013

Em XHTML, "src" e "alt" so atributos do elemento "img".


Em um DTD, aps a definio da estrutura das tags, pode-se definir seus
atributos possveis por meio da declarao ATTLIST. Seja o DTD para um catlogo
de controle de DVD's:
<!ELEMENT catlogo (dvd)+ >
<!ELEMENT dvd (ttulo, preo, ator+, ano) >
<!ATTLIST dvd num CDATA #REQUIRED >
<!ATTLIST dvd estilo (Comdia | Suspense | Terror) >
<!ELEMENT ttulo (#PCDATA) >
<!ELEMENT preo (#PCDATA) >
<!ATTLIST preo moeda CDATA (real | dlar) "real" >
<!ELEMENT ator (#PCDATA) >
<!ELEMENT ano (#PCDATA) >
400

Grupo Multitecnus ,2013

O elemento ATTLIST uma declarao de atributo, cuja sintaxe :


<!ATTLIST nomeElemento nomeAtributo tipoAtributo valorPadro>
- O valor padro pode ser:
valorAtributo : O atributo tem um valor padro igual a "valorAtributo"
#REQUIRED : O atributo obrigatrio (deve ser includo no elemento)
#IMPLIED : No obrigatria a incluso do atributo
#FIXED valorAtributo : O valor do atributo constante e igual "valorAtributo"

- O tipo do atributo pode ser:


CDATA : Texto simples (no sofre anlise sinttica do parser XML)
(valor1 | valor2 | ...) : Conjunto de valores separados por " | "
ID : Identificador nico
401

Grupo Multitecnus ,2013

IDREF : o id de outro elemento


IDREFS : Lista de id's (separados por espao)
NMTOKEN : Nome XML vlido (obedece s regras de formao de nome do XML)
NMTOKENS : Lista de nomes XML vlidos
ENTITY : Entidade
ENTITIES : Lista de entidades
NOTATION : Notao (til para texto que deve ser interpretado por outra aplicao)
xml: : Valor predefinido.
Exemplo no DTD:
<!ELEMENT texto (#PCDATA) >
<!ATTLIST texto xml:lang NMTOKEN #FIXED "pt-br" >
Aplicao no XML:
<texto xml:lang="pt-br">
402

Grupo Multitecnus ,2013

- Entidades (Entities) so representaes de informao (texto), com sintaxe:

<!ENTITY nomeEntidade "valorEntidade" >

Exemplo no DTD:

<!ENTITY email "multitecnus@multitecnus.com" >

Em um documento XML, utiliza-se a entidade iniciando-a com o caractere &, seguido


do nome da entidade, finalizando-se seu uso com o caractere ponto e vrgula ( ; ):

<autor> Grupo Multitecnus - Contato: &email; </autor>

403

Grupo Multitecnus ,2013

Entidades tambm podem ser "entidades de parmetro", existindo


somente dentro do arquivo DTD que a define, e serve para armazenar um grupo de
elementos comuns, permitindo seu reuso, sem a necessidade de reescrev-los a
cada necessidade. O nome da entidade deve ser antecedido pelo caractere % e o
valor da entidade deve ser delimitado por aspas.
Por exemplo:
<!ENTITY % nomeEntidadeParmetro "valorEntidade">
Aplicando DTD:
<!ENTITY % texto "(#PCDATA)">
<!ELEMENT empresa (razaoSocial,endereo,telefone)>
<!ELEMENT razaoSocial %texto; >
<!ELEMENT endereo %texto; >
<!ELEMENT telefone %texto; >
404

Grupo Multitecnus ,2013

Entidades podem ser, ainda, "entidades externas", e referenciam DTD


externos, podendo ser pblicas ou privadas.
Quando pblicas, so identificadas pela palavra-chave PUBLIC; do
contrrio, so privadas, e identificadas pela palavra-chave SYSTEM, e tem por
finalidade o uso interno (pelo autor do DTD).
Por exemplo:
<!ENTITY % nomeEntidade SYSTEM "URI" >
<!ENTITY % nomeEntidade PUBLIC "URI1" "URI2" >

No caso de ser pblica, caso a URI1 no esteja acessvel, utiliza a URI2.


Exemplo no DTD:
<!ENTITY site PUBLIC "http://www.multitecnus.com/mt.dtd"
"http://www.multitecnus.com/mt.dtd" >
405

Grupo Multitecnus ,2013

2.29.4. XSD XML Schema Definition


A DTD, alm de no possuir um formato XML vlido, possui uma srie de
limitaes, tais como: os dados so sempre do tipo texto e a ordem em que os
elementos so declarados deve ser rigidamente seguida no documento XML.
De forma a resolver esses problemas foi desenvolvido o padro W3C:
XML Schema, facilitando o trabalho do validador de documentos XML, pela sua
flexibilidade e maior riqueza em detalhes dos dados e de seus relacionamentos.
Por exemplo, uma informao como:
<data>01/03/2011</data>
poder ser entendida como: "1 de maro de 2011" (dd/mm/aaaa) ou como "3 de
janeiro de 2011" (mm/dd/aaaa), dependendo da configurao regional para uso de
datas do local onde o sistema de recebimento est hospedado.

406

Grupo Multitecnus ,2013

Uma sintaxe possvel para se definir um XML Schema :


<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:annotation>
<xsd:documentation xml:lang="pt-br">
Texto de anotao
</xsd:documentation>
</xsd:annotation>
<xsd:element name="nomeElemento" type="tipo" />
<xsd:complexType name="tipoComplexo">
<xsd:sequence>
<xsd:element name="nomeElemento1" type="tipo" />
<xsd:element name="nomeElemento2" type="tipo" />
</xsd:sequence>
<xsd:attribute name="nomeAtributo" type="tipo" />
</xsd:complexType>
</xsd:schema>
407

Grupo Multitecnus ,2013

Dentre os tipos utilizados na definio de um schema listam-se:


string

boolean

anyURI

language

int

integer

long

float

date

time

dateTime

Na definio de um elemento/atributo, seu valor possvel pode sofrer


restries, ser enumerado ou receber um valor padro (default), dentre outras
possibilidades.
Conforme documentos vo sendo desenvolvidos por equipes diferentes,
e que esses documentos devam ser includos em um documento qualquer,
potencialmente alta a probabilidade de ocorrerem conflitos nos nomes de
definies, variveis e tipos.
408

Grupo Multitecnus ,2013

Para que isso seja evitado, pode-se definir um namespace, que possui um
escopo onde podem ser declarados nomes, tipos e demais definies tpicas para
aquele namespace.
A definio de um namespace permite que regras diferentes sejam
aplicveis ao schema. No caso do exemplo dado, o namespace utilizado tem como
nome "xsd":
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Mais detalhes sobre XML Schema podem ser encontrados na W3C, no endereo:
http://www.w3.org/XML/Schema

409

Grupo Multitecnus ,2013

2.29.5. Manipulando XML pelo Eclipse


a) Crie um projeto JAXB, clicando em: File -> New -> Other... -> JAXB Project.
Como sugesto, d o nome de prj.jaxb para o projeto.

410

Grupo Multitecnus ,2013

b) Adicione uma classe Java ao projeto. D o nome Alunos classe .


c) Adicione o seguinte cdigo:
package com.multitecnus.xml;
public String getName() {
return name;
}

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Alunos {

@XmlElement
public void setName(String name) {
this.name = name;
}

int id;
String name;
String matricula;

public String getMatricula() {


return matricula;
}

public int getId() {


return id;
}
@XmlElement
public void setId(int id) {
this.id = id;
}

@XmlElement
public void setMatricula(String matricula) {
this.matricula = matricula;
}
}

411

Grupo Multitecnus ,2013

d) Adicione um frame ao projeto. D o nome ManipulaXML ao frame, e insira, na


1 linha, a instruo: package com.multitecnus.xml; .
e) Adicione um JTextArea e dois JButton:

412

Grupo Multitecnus ,2013

f) Manipule o evento de clique do boto Criar XML com o cdigo abaixo:


Alunos aluno = new Alunos();
aluno.setId(1);
aluno.setName("nome do aluno");
aluno.setMatricula("1019991234");
try {
File file = new File("alunos.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Alunos.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(aluno, file);
} catch (JAXBException jaxbexception) {
jaxbexception.printStackTrace();
}
413

Grupo Multitecnus ,2013

g) Manipule o evento de clique do boto Abrir XML com o cdigo abaixo:


try {
File file = new File("alunos.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Alunos.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Alunos aluno = (Alunos) jaxbUnmarshaller.unmarshal(file);
taAlunos.setText("");
taAlunos.append("Id= "+ Integer.toString(aluno.getId()) + "\n");
taAlunos.append("matrcula: " + aluno.getMatricula() + "\n");
taAlunos.append("Nome: " + aluno.getName() + "\n");
} catch (JAXBException e) {
e.printStackTrace();
}
h) Execute o aplicativo.
414

Grupo Multitecnus ,2013

Referncia Bibliogrfica

- DEITEL, P. ; Deitel, H. Java: como programar. So Paulo: Person, Prentice Hall, 2010.
- ARNOLD, K. ; GOSLING, J. ; HOMES, D. A linguagem de programao Java. Porto
Alegre: Bookman, 2007.
- DEITEL, H. M. ; Deitel, P. J. ; NIETO, T.R. Internet & world wide web, como programar.
Porto Alegre: Bookman, 2003.
- LIBERTY, J. ; KRALEY, M. Desenvolver documentos xml para a web. So Paulo: Makron
Books, 2001.
- FARIA, R. A. Treinamento avanado em xml. So Paulo: Digerati Books, 2005.
- GUEDES, G. T. A. UML 2: uma abordagem prtica. So Paulo: Novatec Editora, 2011.

415

Grupo Multitecnus ,2013

Grupo Multitecnus

Grupo multidisciplinar de pesquisa.


Inovao e Tecnologia por meio da computao cientfica.

http://www.multitecnus.com
multitecnus@multitecnus.com

416

Você também pode gostar